2011-06-17 29 views
6

Tôi đã một thực thể gọi là Medico được tạo ra như là một lớp Entity từ cơ sở dữ liệu, vì vậy tôi nghĩ rằng các định nghĩa thực failsafe đây, tuy nhiên định nghĩa như sau:javax.ejb.EJBException khi kiên trì một thực thể

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

tôi muốn tạo mới Medico tổ chức trên cơ sở dữ liệu MySql, và đây là cách tôi đang làm như vậy:

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

Sau khi tôi gọi save() từ trang JSF của tôi, tôi nhận được ngoại lệ sau đây:

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 

Tôi đang làm gì sai? Tôi đang thiếu gì?
Nếu nó phục vụ cho bất cứ điều gì heres persistence.xml tôi

<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

Tôi có thể chỉnh sửa các thực thể hiện tại bằng đơn vị lưu giữ hiện tại bằng cách sử dụng 'em.merge', tuy nhiên tôi không thể tạo câu hỏi đang nêu rõ – camiloqp

Trả lời

7

Trường hợp ngoại lệ nêu rõ rằng có sự vi phạm xác nhận hạn chế. Tôi giả sử bạn có một interceptor tồn tại trước trong lớp xác định kiểu của consultedDoctor mà bạn đang cố lưu. Nhìn vào đó và cung cấp thêm một số thông tin về loại của lớp và trình chặn liên tục trước, cũng như ánh xạ và ràng buộc của các hạt thực thể Medico.

Kind coi

+0

Xin chào, cảm ơn câu trả lời của bạn, tôi đã thêm định nghĩa lớp cho 'Medico' thực thể tôi đang cố gắng tiết kiệm. Tuy nhiên, tôi không biết một interceptor_ _pre-persist là gì, nó thường nằm ở đâu hoặc định nghĩa? – camiloqp

+1

ok như tôi nghi ngờ, u có rất nhiều xác nhận trong đậu thực thể của bạn đó là tốt. Bạn không có một kẻ đánh chặn PrePersist cụ thể. Để tìm hiểu thêm về PrePersist u có thể kiểm tra chú thích @PrePersist và đặc tả của nó. Dù sao, để giải quyết vấn đề của bạn, bạn phải kiểm tra xem ràng buộc nào bị vi phạm. Tôi đặt cược bạn có một trường có chú thích @NotNull là null hoặc một chuỗi ngắn hơn 1 hoặc dài hơn 33 ký tự hoặc tương tự. U có thể ** gỡ lỗi ** mã của bạn hoặc chỉ cần in đối tượng ra trước khi bạn lưu nó và nó sẽ làm cho nó rõ ràng hơn, nơi chính xác vấn đề là. – peshkira

+3

Sự cố đã được thiết lập '@ NotNull' trên khóa chính của đối tượng. Loại bỏ chú thích này và giữ tất cả các xác nhận hợp lệ khác làm cho công việc tồn tại dai dẳng, sai lầm khá ngớ ngẩn nhưng ngớ ngẩn. Bạn đã chỉ cho tôi theo hướng để tìm ra vấn đề, vì vậy tôi đã trao giải thưởng 100 ngay lập tức. Cảm ơn một lần nữa – camiloqp

-1

Hi nếu bạn đang phát triển trong Netbeans bạn có thể nhận được lỗi này thông qua một một chút lộn xộn vì Netbeans tạo ra hai bản sao của tập tin persistence.xml. Một trong số các bạn có xu hướng đặt META-INF vào classpath, phần còn lại nằm trong thư mục Configuration Files của Netbeans. Trên ứng dụng khởi động bởi Netbeans (bằng cách nhấn tam giác bắt đầu màu xanh lá cây) bản sao từ META-INF được sử dụng nhưng nếu bạn 'làm sạch và xây dựng' dự án bản sao từ thư mục Configuration Files được sử dụng. Nếu chúng khác nhau thì địa ngục sẽ tan vỡ.

+0

Không liên quan đến các trường hợp được đưa ra trong câu hỏi. – Iridann

3

Trong trường hợp bạn có một thực thể có Id tăng tự động và bạn muốn giữ nguyên nó bằng cách sử dụng JPA sử dụng hàm tạo rỗng của nó thì ngữ cảnh kiên trì sẽ phát ra lỗi xác thực trong giai đoạn PrePersist. Nhớ rằng auto incremented no được tạo ra ở postPersist Stage, vì vậy nó xác nhận thực thể là vi phạm ràng buộc null Điều này xảy ra bởi vì chúng ta đã xác định chiến lược xác nhận trong đơn vị persistence của chúng ta là auto. Thay đổi chiến lược xác nhận điều này như NONE như được đưa ra dưới

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

tiết kiệm đơn vị kiên trì và triển khai lại ứng dụng của bạn. Bây giờ nó sẽ không ném bất kỳ lỗi xác nhận là trách nhiệm xác nhận nằm với bạn.

2

Câu hỏi này đã giúp tôi giải quyết vấn đề này sau quá nhiều giờ đánh đầu vào tường. @peshkira là điểm trên nhưng đã có mã sau đây được cung cấp nó có thể đã tiết kiệm cho tôi một thời gian. Chạy xác thực trên một thực thể để lộ (các) ràng buộc không thành công.

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

Vấn đề của tôi hóa ra là bản ghi hiện có trong cơ sở dữ liệu sau khi tìm thấy không thể vượt qua xác thực pháp nhân.

0

nếu trợ giúp được cung cấp ở trên không thể giúp được, vui lòng kiểm tra xem servlet của bạn có đang nhận đúng tham số trong trang jsp của bạn hay không.

đảm bảo rằng String name = response.getParameter ("Name"); (trong tệp servlet) có tồn tại một tham số "Tên" trong tệp jsp. nếu không tồn tại, tên tring được đặt thành null và không thể chèn null vào trường được đánh dấu không rỗng.

Từ trải nghiệm cá nhân.

Các vấn đề liên quan