2010-06-05 3 views
1

ID가 생성 된 값 인 엔티티를 지속하려는 데 문제가 있습니다. 이 엔티티 (A)는 지속 시간에 다른 엔티티 (B)를 계단식으로 유지해야합니다. A와 B의 관계는 OneToMany이고 B와 관련된 속성은 복합 키의 일부입니다.데이터베이스 상태를 세션과 동기화 할 수 없습니다.

@Entity 
public class Cambios implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @SequenceGenerator(name="CAMBIOS_GEN",sequenceName="CAMBIOS_SEQ",allocationSize=1) 
    @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CAMBIOS_GEN") 
    @Column(name="ID_CAMBIO") 
    private Long idCambio; 

    //bi-directional many-to-one association to ObjetosCambio 
    @OneToMany(cascade={CascadeType.PERSIST},mappedBy="cambios") 
    private List<ObjetosCambio> objetosCambioList; 

    public Cambios() { 
    } 

    ... 
} 

엔티티 B :

@Entity 
@Table(name="OBJETOS_CAMBIO") 
public class ObjetosCambio implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private ObjetosCambioPK id; 

    //bi-directional many-to-one association to Cambios 
    @ManyToOne 
    @JoinColumn(name="ID_CAMBIO", insertable=false, updatable=false) 
    private Cambios cambios; 

    //bi-directional many-to-one association to Objetos 
    @ManyToOne 
    @JoinColumn(name="ID_OBJETO", insertable=false, updatable=false) 
    private Objetos objetos; 

    public ObjetosCambio() { 
    } 

... 

법인

엔티티 A : 나는/여기

최대 절전 모드 이클립스, JBOSS 런타임, JPA를 사용하고

내 코드입니다 B PK :

@Embeddable 
public class ObjetosCambioPK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @Column(name="ID_OBJETO") 
    private Long idObjeto; 

    @Column(name="ID_CAMBIO") 
    private Long idCambio; 

    public ObjetosCambioPK() { 
    } 

클라이언트 : 사전에

public String generarCambio(){ 

     ServiceLocator serviceLocator = null; 
     try {   
      serviceLocator = serviceLocator.getInstance(); 
      FachadaLocal tcLocal; 
      tcLocal = (FachadaLocal)serviceLocator.getFacadeService("java:comp/env/negocio/Fachada"); 

      Cambios cambio = new Cambios(); 

      Iterator it = objetosLocal.iterator(); //OBJETOSLOCAL IS ALREADY POPULATED OUTSIDE OF THIS METHOD    
      List<ObjetosCambio> ocList = new ArrayList();    
      while (it.hasNext()){ 
        Objetos objeto = (Objetos)it.next(); 
        ObjetosCambio objetosCambio = new ObjetosCambio(); 
        objetosCambio.setCambios(cambio); //AT THIS TIME THIS "CAMBIO" DOES NOT HAVE ITS ID, ITS SUPPOSED TO BE GENERATED AT PERSISTENCE TIME 

        ObjetosCambioPK ocPK = new ObjetosCambioPK(); 
        ocPK.setIdObjeto(objeto.getIdObjeto()); 

        objetosCambio.setId(ocPK); 
        ocList.add(objetosCambio); 
           } 

      cambio.setObjetosCambioList(ocList); 

      tcLocal.persistEntity(cambio); 
      return "exito";    
       } catch (NamingException e) { 
        // TODO     
        e.printStackTrace();      
              } 
     return null; 
    } 


ERROR: 

15:23:25,717 WARN [JDBCExceptionReporter] SQL Error: 1400, SQLState: 23000 
15:23:25,717 ERROR [JDBCExceptionReporter] ORA-01400: no se puede realizar una inserción NULL en ("CDC"."OBJETOS_CAMBIO"."ID_CAMBIO") 

15:23:25,717 WARN [JDBCExceptionReporter] SQL Error: 1400, SQLState: 23000 
15:23:25,717 ERROR [JDBCExceptionReporter] ORA-01400: no se puede realizar una inserción NULL en ("CDC"."OBJETOS_CAMBIO"."ID_CAMBIO") 

15:23:25,717 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) 
    at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:504) 
    at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:101) 
    at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:269) 
    at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:89) 
    at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177) 
    at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1423) 
    at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:137) 
    at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75) 
    at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:170) 
    at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87) 
    at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:176) 
    at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:216) 
    at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207) 
    at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164) 
    at $Proxy298.persistEntity(Unknown Source) 
    at backing.SolicitudCambio.generarCambio(SolicitudCambio.java:521) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:146) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:92) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:332) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:287) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:401) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:95) 
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:245) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:110) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:213) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:301) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190) 
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92) 
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) 
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.sql.BatchUpdateException: ORA-01400: no se puede realizar una inserción NULL en ("CDC"."OBJETOS_CAMBIO"."ID_CAMBIO") 

감사합니다! JM.-


내가 수동으로 cambios.idCambio을 설정하려고하지만 난 여전히 같은 오류를 받고 있어요. Hibernate는 objetosCambioPK.idCambio와 objetosCambio.cambios 사이에 어떤 종류의 매핑을 수행해야합니다. 아마 여기에 실종 된 것 같아요. 어떻게 구현해야할지 모르겠습니다.

누구나?

답변

1

위의 코드가 작동하지 않는다고 생각하면 삽입물 ObjetosCambioPKidCambio이 할당되지 않았으므로 데이터베이스 오류가 발생했습니다. 실제로 나는 당신이 "완전히 자동화 된"방식으로 원하는 것을 달성하는 방법을 모르지만 (나는 그것이 가능하다고 생각하지 않습니다), 따라서 persist()flush() 새로운 Cambios을 먼저 지정한 다음, Id을 복합 키에 설정합니다. 각 ObjetosCambio 인스턴스.

+0

답장을 보내 주셔서 감사합니다. 다른 아키텍처 (EJB3, Jdeveloper, Toplink)를 사용 했으므로 작동 할 수 있습니다. 그때 나는'@IdClass' 주석을'@ EmbeddedId' 대신에 사용 했었지만 요즘에는 이것이 최선의 접근법이 아니라는 것을 읽었습니다.이 @IdClass는 EJB2 호환성 때문에 Hibernate에서만 구현 된 것으로 보입니다. 게다가, 나는'@ idClass'와도 문제가 있습니다 ... 그래서 나는 이것에 대한 해결책을 찾기 위해 계속 노력하는 것을 선호합니다. 조언 : – Steppen

+0

"따라서 새 Cambios를 persist() 및 flush() 한 다음 각 ObjetosCambio 인스턴스의 복합 키에 할당 된 ID를 설정합니다." 내가 말하는 것처럼 DB를 일관성없는 상태로 유지할 위험이 있습니까? (ObjetosCambio에서 예외가 발생한 경우) – Steppen

+0

@Steppen ObjetosCambio에서 예외가 지속되는 경우 트랜잭션이 롤백되고 일관성없는 상태가되지 않습니다. –

관련 문제