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 사이에 어떤 종류의 매핑을 수행해야합니다. 아마 여기에 실종 된 것 같아요. 어떻게 구현해야할지 모르겠습니다.
누구나?
답장을 보내 주셔서 감사합니다. 다른 아키텍처 (EJB3, Jdeveloper, Toplink)를 사용 했으므로 작동 할 수 있습니다. 그때 나는'@IdClass' 주석을'@ EmbeddedId' 대신에 사용 했었지만 요즘에는 이것이 최선의 접근법이 아니라는 것을 읽었습니다.이 @IdClass는 EJB2 호환성 때문에 Hibernate에서만 구현 된 것으로 보입니다. 게다가, 나는'@ idClass'와도 문제가 있습니다 ... 그래서 나는 이것에 대한 해결책을 찾기 위해 계속 노력하는 것을 선호합니다. 조언 : – Steppen
"따라서 새 Cambios를 persist() 및 flush() 한 다음 각 ObjetosCambio 인스턴스의 복합 키에 할당 된 ID를 설정합니다." 내가 말하는 것처럼 DB를 일관성없는 상태로 유지할 위험이 있습니까? (ObjetosCambio에서 예외가 발생한 경우) – Steppen
@Steppen ObjetosCambio에서 예외가 지속되는 경우 트랜잭션이 롤백되고 일관성없는 상태가되지 않습니다. –