如何解决org.hibernate.HibernateException:非法尝试将集合与两个打开的会话相关联?

时间:2013-08-21 11:24:18

标签: hibernate spring-mvc

您好我是 hibernet的新手我正在尝试在CloudSql中插入数据,但我收到了org.hibernate.HibernateException:非法尝试将集合与两个打开的会话相关联 请检查我的代码

Domain.java

  @Entity
 @Table(name="TBL_STD_DOMAIN")
 public class Domain {

@Id
@GeneratedValue
@Column(name ="FLD_DOMAIN_ID")
private Long domainId;

@Column(name = "FLD_DOMAIN_NAME")
private String domainName;
@Column(name = "FLD_PRIMAY_DOMAIN_ID")
private Long primary_Domain_Id;
@Column(name = "FLD_CUSTOMER_ID")
private Long customerId;

@Column(name = "FLD_IS_ACTIVE")
@org.hibernate.annotations.Type(type="true_false")
private boolean isActive;

@Column(name = "FLD_ISPRIMARYDOMAIN")
@org.hibernate.annotations.Type(type="true_false")
private boolean isPrimayDomain;
  @OneToMany( mappedBy="domain",cascade=CascadeType.ALL )
@JoinTable(name = "Domain_UserProfile", 
        joinColumns = { @JoinColumn(name = "FLD_DOMAIN_ID") },
        inverseJoinColumns = { @JoinColumn(name = "FLD_USERPROFILE_ID") })

private Collection<UserProfile> userProfile = new ArrayList<UserProfile>();

@OneToMany( mappedBy="domain",cascade=CascadeType.ALL )
@JoinTable(name = "Domain_Organization", 
        joinColumns = { @JoinColumn(name = "FLD_DOMAIN_ID") },
        inverseJoinColumns = { @JoinColumn(name = "FLD_ORG_ID") })

private Collection<Organization> orgnization = new ArrayList<Organization>();
//**SETTER AND GEETER METHODS**

}    orgnization.java

   @Entity
@Table(name="TBL_STD_ORGANIZATION")
  public class Organization {
@Id
@GeneratedValue
@Column(name="FLD_ORG_ID")
private Long organizationId;
@Column(name="FLD_ORG_NAME")
private String orgName;
@OneToMany
private java.util.Collection<Department> listOfDepartMents = new java.util.ArrayList<Department>();

@Column(name = "FLD_CUSTOMER_ID")
private Long customerId;

@ManyToOne
private Domain domain;

public Long getOrganizationId() {
    return organizationId;
}

public void setOrganizationId(Long organizationId) {
    this.organizationId = organizationId;
}

public String getOrgName() {
    return orgName;
}

public void setOrgName(String orgName) {
    this.orgName = orgName;
}

public java.util.Collection<Department> getListOfDepartMents() {
    return listOfDepartMents;
}

public void setListOfDepartMents(
        java.util.Collection<Department> listOfDepartMents) {
    this.listOfDepartMents = listOfDepartMents;
}

public Long getCustomerId() {
    return customerId;
}

public void setCustomerId(Long customerId) {
    this.customerId = customerId;
}

public Domain getDomain() {
    return domain;
}

public void setDomain(Domain domain) {
    this.domain = domain;
}

}      的 UserProfile.java

 Entity
  @Table(name="TBL_STD_USERPROFILE")
  public class UserProfile {
@Id
@GeneratedValue
@Column(name = "FLD_USER_ID")
private Long userId;


@Column(name = "FLD_CREATED_ON")
@Temporal(TemporalType.DATE)
private Date createdOn;

@Column(name = "FLD_IMAGE_BLOB_KEY")
private String imageBlobKey;

@Column(name = "FLD_LASTMODIFIED_ON")
@Temporal(TemporalType.DATE)
private Date lastModifiedOn;
   @ManyToOne
private Domain domain;
 //SETTER ,GETTER METHODS

}

MyGenericDAo

 public abstract class GenericDaoImpl <T> extends HibernateDaoSupport  implements              IGenericDao<T> {

private static final Logger log = Logger.getLogger(GenericDaoImpl.class.getName()); 

@Autowired
public void setHibernateSessionFactory(SessionFactory sessionFactory)
{
    setSessionFactory(sessionFactory);
}

@Override
public T save(T t) {
    //getHibernateTemplate().save(t);

    //getHibernateTemplate().saveOrUpdate(t);
    Session session = getSessionFactory().openSession();
    Transaction tx=session.beginTransaction();
    session.saveOrUpdate(t);
    tx.commit();
    session.close();
    return t;
}

@Override
public T merge(T t) {
    //getHibernateTemplate().save(t);

    //getHibernateTemplate().saveOrUpdate(t);
    Session session = getSessionFactory().openSession();
    session.beginTransaction();
    session.merge(t);
    session.close();
    return t;
}

@Override
public void delete(T t) {
    getSession().delete(t);
}

} 但是当我试图保存对象时我得到了

警告:exception..org.hibernate.HibernateException:非法尝试将集合与两个打开的会话相关联 org.hibernate.HibernateException:非法尝试将集合与两个打开的会话相关联     at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:432)     在org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:66)     在org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:124)     在org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:84)     在org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:78)     在org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:146)     在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:316)     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)     在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:112)     在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)     在org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)     在org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)     在org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:523)     在com.cloudcodes.gdirectory.daoImpl.GenericDaoImpl.save(GenericDaoImpl.java:36)     在com.cloudcodes.gdirectory.managerImpl.GenericServiceManagerImpl.save(GenericServiceManagerImpl.java:26)     在com.cloudcodes.gdirectory.controller.ProfileController.profileSynch(ProfileController.java:401)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     在java.lang.reflect.Method.invoke(Method.java:597)     在com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)     在org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)     在org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)     在org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)     在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)     在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)     在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)     在org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:617)     在org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:717)     在org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1166)     在com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在com.google.appengine.tools.development.DevAppServerServersFilter.doDirectRequest(DevAppServerServersFilter.java:369)     在com.google.appengine.tools.development.DevAppServerServersFilter.doDirectServerRequest(DevAppServerServersFilter.java:352)     在com.google.appengine.tools.development.DevAppServerServersFilter.doFilter(DevAppServerServersFilter.java:115)     在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)     在org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)     在org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)     在org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)     在org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)     在org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)     在com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)     在org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)     在com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle(JettyContainerService.java:421)     在org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)     在org.mortbay.jetty.Server.handle(Server.java:326)     在org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)     at org.mortbay.jetty.HttpConnection $ RequestHandler.headerComplete(HttpConnection.java:923)     在org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)     在org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)     在org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)     在org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)     在org.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)

ANy on help me

1 个答案:

答案 0 :(得分:0)

实体映射还不够,我们需要代码检查对象和会话流并提取错误,但我的建议如下:

在DAO开启/关闭会议并没有很好的实践。您正在使用服务和DAO层,因此让服务(您的GenericServiceManagerImpl)管理会话(打开/关闭)和事务(开始/提交/回滚)和DAO(您的GenericDAOImpl)只管理数据持久性(保存) /删除/更新/合并)等...

了解TransactionManager和transaction management,关于@Transactional以及它是如何运作的(declarative transaction