2011-06-17 17 views
6

Tengo una entidad llamada Medico que fue creada como una clase de entidad de base de datos, por lo tanto, creo que la definición de la entidad es a prueba de fallos aquí, sin embargo, la definición es la siguiente:javax.ejb.EJBException cuando persiste una entidad

@Entity 
@Table(name = "medico") 
@XmlRootElement 
@NamedQueries({All named queries here}) 
public class Medico implements Serializable { 
private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "idMedico") 
    private Integer idMedico; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "Identificacion") 
    private int identificacion; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 33) 
    @Column(name = "Primer_Nombre") 
    private String primerNombre; 
    @Size(max = 33) 
    @Column(name = "Segundo_Nombre") 
    private String segundoNombre; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 33) 
    @Column(name = "Primer_Apellido") 
    private String primerApellido; 
    @Size(max = 33) 
    @Column(name = "Segundo_Apellido") 
    private String segundoApellido; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "Telefono") 
    private long telefono; 
    @Column(name = "Telefono_Celular") 
    private BigInteger telefonoCelular; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 33) 
    @Column(name = "Direccion") 
    private String direccion; 
    // Constructors.. 
    // Getters and setters.. 
} 

que quieren crear nuevos Medico entidades de base de datos MySQL, y así es como lo estoy haciendo:

@ManagedBean 
@ViewScoped 
public class ConsultaMedicos implements Serializable { 
// Variables Definition .. 
@EJB 
private DoctorsFacadeLocal doctorsFacade; 
// Constructor and other methods .. 
public String save() 
    { 
     try{ 
      doctorsFacade.save(consultedDoctor); 
      FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_INFO, CREATE_SUMMARY, null); 
      FacesContext.getCurrentInstance().addMessage(CREATE_SUMMARY, fm); 
     } 
     catch(Exception ex){ 
      FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, CREATE_ERROR_SUMMARY, null); 
      FacesContext.getCurrentInstance().addMessage(CREATE_ERROR_SUMMARY, fm); 
      return null; 
     } 
     return "listaMedicos.xhtml"; 
    } 
... 
} 

@Local 
public interface DoctorsFacadeLocal { 

    List<Medico> findAllDoctors(); 
    Medico findDoctorByIdNumber(int identificacion); 
    void edit(Medico medico); 
    void save(Medico medico); 
} 

@Stateless 
public class DoctorsFacade implements DoctorsFacadeLocal { 

    @PersistenceContext 
    private EntityManager em; 
// Other methods.. 
    @Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void save(Medico medico) 
    { 
     em.persist(medico); 
     em.flush(); 
    } 
} 

Después llamo save() de mi página JSF, me sale el siguiente excepción:

javax.ejb.EJBException 
    at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5194) 
    at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5092) 
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4880) 
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2039) 
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1990) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 
    at $Proxy157.save(Unknown Source) 
    at com.lemm.web.bean.ConsultaMedicos.save(ConsultaMedicos.java:89) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:737) 
    at javax.el.BeanELResolver.invoke(BeanELResolver.java:467) 
    at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:254) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:228) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details. 
    at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.validateOnCallbackEvent(BeanValidationListener.java:90) 
    at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.prePersist(BeanValidationListener.java:62) 
    at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyListener(DescriptorEventManager.java:698) 
    at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyEJB30Listeners(DescriptorEventManager.java:641) 
    at org.eclipse.persistence.descriptors.DescriptorEventManager.executeEvent(DescriptorEventManager.java:200) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectClone(UnitOfWorkImpl.java:4216) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.cloneAndRegisterNewObject(RepeatableWriteUnitOfWork.java:576) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalRegisterObject(UnitOfWorkImpl.java:2883) 
    at org.eclipse.persistence.internal.sessions.MergeManager.registerObjectForMergeCloneIntoWorkingCopy(MergeManager.java:932) 
    at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:492) 
    at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:263) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3467) 
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.mergeCloneWithReferences(RepeatableWriteUnitOfWork.java:363) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3427) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.mergeInternal(EntityManagerImpl.java:452) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.merge(EntityManagerImpl.java:429) 
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.merge(EntityManagerWrapper.java:286) 
    at com.lemm.ejb.facade.DoctorsFacade.save(DoctorsFacade.java:61) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) 
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5367) 
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144) 
    at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:862) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801) 
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:371) 
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5339) 
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5327) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214) 
    ... 47 more 

¿Qué estoy haciendo mal? ¿Qué me estoy perdiendo?
si sirve para nada aquí está mi persistence.xml

<persistence-unit name="lemmPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/lemmdb</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
    </properties> 
</persistence-unit> 
+0

Puedo editar entidades existentes con la unidad de persistencia actual usando 'em.merge'; sin embargo, no puedo crear como dice la pregunta – camiloqp

Respuesta

7

La excepción establece claramente que existe una violación validación restringida. Supongo que tiene un interceptor pre persist en la clase que define el tipo de doctor consultado que está intentando guardar. Mire allí y proporcione más información sobre el tipo de la clase y el interceptor pre persist, así como la asignación y las restricciones de los beans de la entidad Medico.

Saludos cordiales

+0

Hola, gracias por su respuesta, agregué la definición de clase para 'Medico' que es la entidad que estoy tratando de salvar. Sin embargo, no sé qué es un interceptor _pre-persist_, ¿dónde se localiza o define habitualmente? – camiloqp

+1

bien, como sospechaba, tienes muchas validaciones en tu entity bean, lo cual es bueno. No tienes un interceptor PrePersist específico. Para obtener más información acerca de PrePersist, puede consultar la anotación @PrePersist y sus especificaciones. De todos modos, para resolver su problema, debe verificar cuál de las restricciones se viola. Apuesto a que tienes un campo con una anotación @NotNull que es nulo o una cadena que es más corta que 1 o más de 33 caracteres o similar. U puede ** depurar ** su código o simplemente imprimir el objeto antes de guardarlo y lo hará más claro dónde exactamente está el problema. – peshkira

+3

El problema era tener una configuración '@ NotNull' en la clave primaria de la entidad. Eliminar esta anotación y mantener todas las demás validaciones hace que el trabajo persista, obvius pero tonto error. Me apuntaste en la dirección para descubrir el problema, así que estoy otorgando el +100 de inmediato. Gracias de nuevo – camiloqp

-1

Hola si está desarrollando en NetBeans puede obtener este error a través de un un poco de confusión porque Netbeans crea dos copias del archivo persistence.xml. Uno de ellos tiende a poner META-INF en classpath, el otro permanece en el directorio de Netbeans Configuration Files. En la aplicación iniciada por Netbeans (al presionar el triángulo de inicio verde) se usa la copia de META-INF, pero si 'limpia y compila' el proyecto, se utiliza la copia del directorio de Archivos de configuración. Si difieren, el infierno se desata.

+0

No relacionado con las circunstancias dadas en la pregunta. – Iridann

3

En caso de que tenga una entidad con un Id autoincrementado y desee mantenerla usando JPA utilizando su constructor vacío, el contexto de persistencia arroja un error de validación en la etapa PrePersista. Recuerde que el auto incrementado no se genera en la etapa postPersist, por lo que valida la entidad como una violación de la restricción nula Esto sucede porque hemos especificado una estrategia de validación en nuestra unidad de persistencia como auto. Cambiar esta estrategia de validación como NINGUNO según se indica en

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com 
    /xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="studPU" transaction-type="JTA"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>jdbc/mysql</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <validation-mode>NONE</validation-mode> 
    <properties> 
    <property name="eclipselink.weaving" value="false"/> 
    <property name="eclipselink.weaving.fetchgroups" value="false"/> 
    </properties> 
    </persistence-unit> 
    </persistence> 

guardar la unidad de persistencia y volver a implementar la aplicación. Ahora no lanzará ningún error de validación ya que la responsabilidad de la validación recae en usted.

2

Esta pregunta me ayudó a resolver este problema después de demasiadas horas de golpear mi cabeza contra la pared. @peshkira es perfecta, pero se me ha proporcionado el siguiente código, puede haberme ahorrado algo de tiempo. Ejecute la validación en una entidad para exponer la (s) restricción (es) que falla (n).

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
Validator validator = factory.getValidator(); 
Set<ConstraintViolation<Medico>> constraintViolations = validator.validate(medico); 
if(constraintViolations.size() > 0){ 
    Iterator<ConstraintViolation<Medico>> iterator = constraintViolations.iterator(); 
    while(iterator.hasNext()){ 
     ConstraintViolation<Medico> cv = iterator.next(); 
     System.out.println(cv.getMessage()); 
     System.out.println(cv.getPropertyPath()); 
    } 
} 

Mi problema resultó ser registros existentes en la base de datos que después de ser encontrados no pudieron pasar la validación de la entidad.

0

si la ayuda proporcionada anteriormente no puede ayudar, compruebe que su servlet esté obteniendo el parámetro correcto en su página jsp.

asegúrese de que String name = response.getParameter ("Name"); (en el archivo servlet) existe un parámetro "Nombre" en el archivo jsp. si no existe ninguno, tring name se establece en null, y null no se puede insertar en un campo marcado con not null.

De experiencia personal.

Cuestiones relacionadas