2011-06-17 37 views
6

当我有一个实体,称为医学生这是从数据库创建为一个实体类,所以我认为实体定义为故障保护这里,尽管如此,定义如下:javax.ejb.EJBException异常持久的实体

@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.. 
} 

我想创建MySQL数据库上新医学生实体,而这就是我正在做的这样:

@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(); 
    } 
} 

我把从我的JSF页面save()后,我得到以下异常:

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 

我在做什么错?我错过了什么?
如果它提供的任何东西我的继承人的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

我可以使用'em.merge'来编辑现有的实体,但是我不能创建这个问题 – camiloqp

回答

7

异常明确指出,有一个约束验证冲突。我假设你在类中定义了一个预留持续拦截器,它定义了你试图保存的consultedDoctor的类型。 看那里,并提供一些关于类和预留持续拦截器的更多信息,以及Medico实体bean的映射和约束。

亲切的问候

+0

您好,感谢您的回答,我添加了'Medico'的类定义,它是我试图保存的实体。但是,我不知道什么是_pre-persist拦截器,它通常位于何处或定义在哪里? – camiloqp

+1

好的,因为我怀疑,你有很多验证你的实体bean是好的。您没有特定的PrePersist拦截器。要了解有关PrePersist的更多信息,可以查看@PrePersist注释及其规范。 无论如何,要解决你的问题,你必须检查哪些约束被违反。我敢打赌,你有一个@NotNull注释为空的字段,或者是一个比1或更长的字符或类似的字符串。你可以**调试**你的代码,或者在保存之前直接打印出对象,并且它可以更清楚地知道问题出在哪里。 – peshkira

+3

问题是在实体的主键上设置了@NotNull。删除这个注解并保留所有其他的验证使得坚持不懈的工作成为可能,但却很愚蠢。你指出我要找出问题的方向,所以我马上授予+100。再次感谢 – camiloqp

-1

嗨如果你是在Netbeans的发展,你可以通过一个有点混淆的得到这个错误,因为NetBeans将创建persistence.xml文件的两个副本。其中一个你倾向于在classpath中放入META-INF,另一个留在Netbeans的配置文件目录中。在由Netbeans启动的应用程序(通过按绿色的开始三角形)时,使用了来自META-INF的副本,但是如果您“清理并构建”该项目,则将使用来自Configuration Files目录的副本。如果他们不同,地狱就会松散。

+0

与问题中给出的情况无关。 – Iridann

3

如果你有一个自动递增Id的实体,并且你想使用它的空构造函数使用JPA来持久它,那么持久性上下文会在PrePersist阶段抛出验证错误。请记住,在postPersist Stage中会生成自动增加的否,因此它会将实体验证为违反null约束。这是因为我们在持久性单元中指定了验证策略为auto。改变这种验证策略为NONE

<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> 

下给出保存持久性单元并重新部署应用。现在它不会抛出任何验证错误,因为验证的责任在于你。

2

这个问题帮我解决了这个问题,经过了太多的时间,我的头撞墙了。 @peshkira是现货,但提供了以下代码,它可能为我节省了一些时间。对实体运行验证以展示失败的约束。

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()); 
    } 
} 

我的问题竟然是在数据库中已有记载,后发现无法通过实体验证。

0

如果上面提供的帮助无法帮助,请检查您的servlet是否在您的jsp页面中获取了正确的参数。

确保String name = response.getParameter(“Name”); (在servlet文件中)在jsp文件中存在一个参数“Name”。如果不存在,则tring名称设置为null,并且null不能插入标记为非空的字段中。

从个人经验。

相关问题