【问题标题】:org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions in hibernate 4org.hibernate.HibernateException:非法尝试将集合与休眠 4 中的两个打开会话相关联
【发布时间】:2015-05-12 15:03:56
【问题描述】:

我在休眠 4 中使用 JTA 事务管理器。有没有人知道这个问题。在执行刷新时,我遇到了错误。

下面是我面临上述问题的一段代码。

public void saveOrUpdateEvent(Event event)
{
 event = DomainReferenceMapper.map(event);
    Session session = getSessionFactory().getCurrentSession();
    session.saveOrUpdate(event);
    session.flush();

XML:

 <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <!-- prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop-->

             <!-- Package was changed in the updgration of hibernate -->

            <prop key="hibernate.query.factory_class">org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.TreeCacheProvider</prop>
            <!-- prop key="hibernate.cache.use_query_cache">true</prop -->
             <!--
             Added for hibernate upgradation
             -->
        <prop key="hibernate.cache.use_second_level_cache">false</prop>

        <!--<prop key="hibernate.enable_lazy_load_no_trans">true</prop> 
            --><prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
             <prop key="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.WeblogicJtaPlatform</prop>
        </props>
    </property>

【问题讨论】:

  • 从错误来看,您的 event 对象似乎来自另一个会话,与 Session session = getSessionFactory().getCurrentSession(); 返回的对象不同。
  • @acdcjunior 调用的方法在不同的类中,所以这意味着新事务将可用,对吗?如果不能,请告诉我如何解决
  • 为什么禁用二级缓存?另外,如果您确定数据库中不存在该对象,则使用保存,如果存在,则使用 session.merge(objectname);请分开方法。
  • 我没有禁用二级缓存。我尝试了合并,但是当我执行其他操作时,我没有得到任何响应
  • DomainReferenceMapper 方法是做什么的?

标签: spring hibernate


【解决方案1】:
public void saveOrUpdateEvent(Event event)
{
    event = DomainReferenceMapper.map(event);
    Session session = null ; 
    Transaction tran = null;
    try {
        session = getSessionFactory().getCurrentSession();        
        tran =  session.beginTransaction();
        session.saveOrUpdate(event);
        session.flush();
        tran.commit();
    } catch(Exception ex ) {
        ex.printstacktrance(); 
    }

【讨论】:

  • 是的,吞下异常几乎可以修复所有错误。如果你够快的话,至少有足够的时间找到一份新工作。
  • 这不是一个完整的代码,只是为了展示它背后的想法
猜你喜欢
  • 2011-05-14
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多