Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate异常缺少信息:非法尝试将集合与两个打开的会话关联_Java_Hibernate_Session_Collections_Save - Fatal编程技术网

Java Hibernate异常缺少信息:非法尝试将集合与两个打开的会话关联

Java Hibernate异常缺少信息:非法尝试将集合与两个打开的会话关联,java,hibernate,session,collections,save,Java,Hibernate,Session,Collections,Save,我有一个非常关键的案例要处理这个错误。我不能共享代码,因为它很大而且非常复杂。我唯一可以共享的是异常堆栈跟踪和异常所涉及的部分模型实体。 以下是异常堆栈跟踪: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions at org.hibernate.collection.AbstractPersistentCollection.setCurrentSess

我有一个非常关键的案例要处理这个错误。我不能共享代码,因为它很大而且非常复杂。我唯一可以共享的是异常堆栈跟踪和异常所涉及的部分模型实体。 以下是异常堆栈跟踪:

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:564)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:552)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:544)
at com.riskanalysis.server.dao.impl.base.DBDaoImpl.updateObject(DBDaoImpl.java:138)
at com.riskanalysis.server.business.impl.base.DBManagerImpl.saveObject(DBManagerImpl.java:96)
at com.riskanalysis.rttool.web.controller.action.control.ControlsAction.specificSave(ControlsAction.java:295)
at com.riskanalysis.web.controller.action.base.BaseAction.save(BaseAction.java:266)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
at com.riskanalysis.web.controller.action.base.BaseAction.execute(BaseAction.java:154)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at com.riskanalysis.web.controller.BaseActionServlet.doPost(BaseActionServlet.java:156)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
下面是与异常相关的部分代码。我之所以这样说,是因为异常涉及保存一个集合,而被保存的实体模型有3个集合,而异常并不表示异常涉及哪个集合

@Entity
@Table(name = "act_control")
public class Control extends BaseModel implements java.io.Serializable {
  private Long controlId;
  ...

  private Set<ControlResult> controlResults = new HashSet<ControlResult>();
  
  private Set<ControlCommunication> controlCommunications = new HashSet<ControlCommunication>();
  
  private Set<ControlAttachment> attachments =new HashSet<ControlAttachment>(0);
...

@OneToMany(mappedBy="control",fetch = FetchType.LAZY)
  public Set<ControlResult> getControlResults() {
    return controlResults;
  }

  public void setControlResults(Set<ControlResult> controlResults) {
    this.controlResults = controlResults;
  }
  @OneToMany(mappedBy="control",fetch = FetchType.LAZY)
  public Set<ControlCommunication> getControlCommunications() {
    return controlCommunications;
  }

  public void setControlCommunications(Set<ControlCommunication> controlCommunications) {
    this.controlCommunications = controlCommunications;
  }
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "control")
  public Set<ControlAttachment> getAttachments() {
    return attachments;
  }

  public void setAttachments(Set<ControlAttachment> attachments) {
    this.attachments = attachments;
  }
@实体
@表(name=“行动控制”)
公共类控件扩展BaseModel实现java.io.Serializable{
私有长控制ID;
...
私有集controlResults=new HashSet();
私有集controlCommunications=新哈希集();
私有集附件=新哈希集(0);
...
@OneToMany(mappedBy=“control”,fetch=FetchType.LAZY)
公共集getControlResults(){
返回控制结果;
}
公共void setControlResults(Set controlResults){
this.controlResults=controlResults;
}
@OneToMany(mappedBy=“control”,fetch=FetchType.LAZY)
公共集getControlCommunications(){
返回控制通信;
}
公共无效设置控制通信(设置控制通信){
this.controlCommunications=controlCommunications;
}
@ManyToMany(fetch=FetchType.EAGER,mappedBy=“control”)
公共集getAttachments(){
归还附件;
}
公共作废设置附件(设置附件){
这个。附件=附件;
}
在与开发团队,特别是与产品架构师分析了这个问题后,他注意到异常应该显示相关对象/集合的名称,他说这种异常以前在另一个项目中发生过,并且显示了导致问题的对象的确切名称。因此他建议缺乏详细信息ails可能与java版本(使用java 6构建的项目)或hibernate(hibernate 3)中缺少配置有关

关于这一例外情况的更多信息是不系统的,目前还不清楚它发生的原因和时间,它仍然发生在之前,并且可能发生在客户身上,这是我们不希望发生的:/

因此,如果有人知道如何在例外情况下获取更多有关对象或集合名称的信息,这将对我们非常有帮助


感谢并致以最诚挚的问候,

例外情况已经说明。您正在两个Hibernate会话之间共享实体和集合,这是不受支持的。您必须先关闭第一个会话,然后才能使用第二个会话更新实体/集合。另一种处理方法是将实体/集合与f分离第一次会议

会话很便宜,因此通常它们应该只跨一个事务。我不知道您的设置,但我猜您是在为整个请求共享一个会话。在一个服务中,您随后创建另一个会话,并尝试使用先前由跨整个请求的会话加载的服务会话保存数据