javax.ejb.EJBException при сохранении сущности - PullRequest
6 голосов
/ 17 июня 2011

У меня есть сущность с именем Medico , которая была создана как класс сущности из базы данных, поэтому я думаю, что определение сущности здесь является отказоустойчивым, тем не менее, определение следующее:

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

Я хочу создать новые Medico сущности в базе данных 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();
    }
}

После того, как я позвонил save() со своей страницы JSF, я получил следующее исключение:

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

Что я делаю не так?Чего мне не хватает?
Если это служит чему-то, то вот моя настойчивость. 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>

Ответы [ 5 ]

7 голосов
/ 22 июня 2011

В исключении четко указано, что имеет место нарушение проверки ограничения.Я предполагаю, что у вас есть pre-persist-перехватчик в классе, который определяет тип обращенного к вам доктора, который вы пытаетесь сохранить.Посмотрите там и предоставьте некоторую дополнительную информацию о типе класса и пре-персистентном перехватчике, а также отображении и ограничениях бинов сущности Medico.

С уважением

3 голосов
/ 22 февраля 2012

Если у вас есть сущность с автоматически увеличенным идентификатором, и вы хотите сохранить ее, используя JPA, используя ее пустой конструктор, тогда контекст сохранения выдает ошибку проверки на этапе PrePersist. Помните, что на этапе postPersist генерируется автоматически увеличенное значение no, поэтому оно проверяет сущность как нарушение нулевого ограничения. Это происходит потому, что мы указали стратегию проверки в нашей единице постоянства как auto . Измените эту стратегию проверки на НЕТ , как указано в

    <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 голосов
/ 30 декабря 2012

Этот вопрос помог мне решить эту проблему после многих часов стука головы о стену. @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 голосов
/ 14 мая 2015

, если приведенная выше справка не может помочь, пожалуйста, убедитесь, что ваш сервлет получает правильный параметр на вашей странице jsp.

убедитесь, что String name = response.getParameter ("Name"); (в файле сервлета) в файле jsp существует параметр «Имя». если не существует ни одного, имя tring устанавливается в нуль, и ноль не может быть вставлен в поле, помеченное как ненулевое.

Из личного опыта.

0 голосов
/ 23 июня 2011

Привет, если вы разрабатываете в Netbeans, вы можете получить эту ошибку через небольшую путаницу, потому что Netbeans создает две копии файла persistence.xml.Один из них вы обычно помещаете в META-INF в classpath, другой остается в каталоге файлов конфигурации Netbeans.При запуске приложения NetBeans (нажатием зеленого начального треугольника) используется копия из META-INF, но если вы «очистите и соберете» проект, будет использована копия из каталога файлов конфигурации.Если они различаются, ад вырывается.

...