2011-06-17 11 views
6

Mam podmiot nazywane Medico który został stworzony jako klasy Entity z bazy danych, dlatego myślę, że definicja podmiotu failsafe jest tu jednak definicja jest następująca:javax.ejb.EJBException przy utrzymującej podmiot

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

Chcę utworzyć nowe Medico podmiotów na bazie danych MySQL, a to jak robie tak:

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

Po Wzywam save() z mojej strony JSF, pojawia się następujący wyjątek:

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 

Co robię źle? czego mi brakuje?
przypadku służy ona do niczego heres mój 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

Mogę edytować istniejące jednostki z bieżącą jednostką trwałości za pomocą 'em.merge', jednak nie mogę utworzyć, ponieważ jest to pytanie: – camiloqp

Odpowiedz

7

Wyjątkiem wyraźnie stwierdza, że ​​nie jest to naruszenie walidacja ograniczenie. Zakładam, że masz klasę pre nieustraszonego przechwytywacza, która definiuje typ konsultowanego Doktora, który próbujesz zapisać. Zobacz tam i podaj dodatkowe informacje na temat typu klasy i pre persist przechwytywacza, jak również mapowania i wiązań fasoli obiektu Medico.

poważaniem

+0

Witam, dziękuję za odpowiedź, dodałem definicję klasy" Medico ", która jest Istota, którą próbuję uratować. Jednak nie wiem, co to jest _-utrzymujący przechwytywacz_, gdzie jest zwykle zlokalizowany lub zdefiniowany? – camiloqp

+1

OK, jak podejrzewałem, masz wiele poprawności w swoim elemencie fasoli, co jest dobre. Nie masz określonego przechwytywacza PrePersist. Aby dowiedzieć się więcej o PrePersist, możesz zapoznać się z adnotacją @PrePersist i jej specyfikacją. W każdym razie, aby rozwiązać twój problem, musisz sprawdzić, które z ograniczeń jest naruszone. Założę się, że masz pole z adnotacją @NotNull, która ma wartość NULL lub ciąg, który jest krótszy niż 1 lub dłuższy niż 33 znaki lub podobne. U możesz ** zdebugować ** swój kod lub po prostu wydrukować obiekt przed zapisaniem go i powinien on wyjaśnić, gdzie dokładnie jest problem. – peshkira

+3

Problem polegał na ustawieniu '@ NotNull' na kluczu podstawowym jednostki. Usunięcie tej adnotacji i zachowanie wszystkich innych walidacji sprawia, że ​​uporczywość działa, śliczna obvius, ale głupia pomyłka. Wskazałeś mi kierunek, w którym znalazłem problem, więc od razu przyznam +100. Jeszcze raz dziękuję – camiloqp

-1

Hi jeśli rozwijają się w Netbeans można dostać ten błąd przez trochę zamieszania, bo Netbeans tworzy dwie kopie pliku persistence.xml. Jeden z nich ma tendencję do umieszczania META-INF w ścieżce klas, a drugi pozostaje w katalogu plików konfiguracyjnych Netbeans. Przy uruchamianiu aplikacji przez Netbeans (przez naciśnięcie zielonego trójkąta startowego) używana jest kopia z META-INF, ale jeśli "czyścisz i budujesz" projekt, używana jest kopia z katalogu Pliki konfiguracyjne. Jeśli się różnią, piekło pęka.

+0

Niezwiązane z okolicznościami podanymi w pytaniu. – Iridann

3

Jeśli masz obiekt z automatycznie zwiększanym identyfikatorem i chcesz go kontynuować przy użyciu JPA przy użyciu pustego konstruktora, kontekst utrwalania zgłosi błąd sprawdzania poprawności na etapie PrePersist. Pamiętaj, że auto incremented no nie jest generowane na etapie PostPersist, więc sprawdza poprawność encji jako naruszenie ograniczenia zerowego Dzieje się tak, ponieważ określiliśmy strategię walidacji w naszej jednostce trwałości jako auto. Zmienić tę strategię walidacji jako BRAK jak podano pod

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

Zapisz zespołu utrwalania i przesunięcie swoją aplikację. Teraz nie spowoduje to błędu weryfikacji, ponieważ odpowiedzialność za walidację spoczywa na Tobie.

2

To pytanie pomogło mi rozwiązać ten problem po zbyt wielu godzinach bicia mojej głowy o ścianę. @peshkira jest na miejscu, ale pod warunkiem, że został podany poniższy kod, który mógł mnie zaoszczędzić trochę czasu. Przeprowadź walidację na obiekcie, aby ujawnić niewystarczające ograniczenia.

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

Moim problemem okazały się istniejące rekordy w bazie danych, które po znalezieniu nie mogły przejść pomyślnie sprawdzenia podmiotu.

0

jeśli powyższa pomoc nie mogła pomóc, sprawdź, czy twój serwlet uzyskuje właściwy parametr na stronie jsp.

upewnij się, że String name = response.getParameter ("Name"); (w pliku serwletu) istnieje parametr "Nazwa" w pliku jsp. jeśli nie istnieje, nazwa tring ma wartość null, a wartość null nie może być wstawiona do pola, które jest oznaczone jako niezerowa.

Z osobistych doświadczeń.

Powiązane problemy