【问题标题】:Migrating form Hibernate3 to Hibernate4 keep getting nested transactions not supported从 Hibernate 3 迁移到 Hibernate 4 不断获取不支持的嵌套事务
【发布时间】:2013-11-02 15:57:42
【问题描述】:

在我们将应用程序从 hibernate3 迁移到 hibernate4 前一周,在 hibernate3 中一切正常,但是在迁移到 hibernate4 之后。我不断收到不支持嵌套事务

下面是我调用 dao 的服务层

public class LeaveApplicationService implementsSerializable,LeaveApplicationInterfaceService{
    @Autowired
    private LeaveApplicationInterfaceDao _leavApplicationInterfaceDao;
       //getter setter
    @Override
    public synchronized void clickOnAddLeaveButton(LeaveApplicationViewBean leaveApplicationViewBean) {
    SessionFactory sessionFactory=(SessionFactory) ObjectFactory.getBean("sessionFactory");
    sessionFactory.getCurrentSession().beginTransaction();


        try{
                leaveApplicationViewBean.get_employeeListObj().clear();
                leaveApplicationViewBean.get_leaveTypelist().clear();
                leaveApplicationViewBean.get_leaveApproveers().clear();
                //leaveApplicationViewBean.set_employeeListObj(get_leavApplicationInterfaceDao().getEmployeeList());
                leaveApplicationViewBean.set_leaveTypelist(get_leavApplicationInterfaceDao().getLeaveType());
                leaveApplicationViewBean.set_leaveApproveers(get_leavApplicationInterfaceDao().getLeaveApprover(CmsUtil.getSession("userId").toString()));

        }catch(Exception e){
            CmsLogger.errorLog(LeaveApplicationService.class, e);
        }finally{
            sessionFactory.getCurrentSession().close();
        }
}

道层

public class LeaveApplicationDao extends TransactionService implements Serializable,LeaveApplicationInterfaceDao{
    private static final long serialVersionUID = 6237725881698448330L;

    public List<LeaveApprover> getLeaveApprover(String userId) throws Exception {
      List<LeaveApprover> _leavApprovers=new ArrayList<LeaveApprover>();
      Iterator it=getSessionFactory().getCurrentSession().createQuery(sql.toString()).setParameter("practiceAreaId",CmsUtil.getSession("practiceAreaId").toString())                                            .setParameter("userId",userId).setCacheable(true)
                                                                                    .list().iterator();
      while(it.hasNext()){
        Object[] obj=(Object[]) it.next();
        LeaveApprover leaveApprover=new LeaveApprover();
        leaveApprover.set_approverId((String) obj[0]);
        leaveApprover.set_approverName((String) obj[1]);
        _leavApprovers.add(leaveApprover);
    }

    return _leavApprovers;
}



public List<TimeProjectCategory> getLeaveType() throws Exception{
    List<TimeProjectCategory> timeProjectCategories=new ArrayList<TimeProjectCategory>();
    Iterator it =getSessionFactory().getCurrentSession().createQuery(sql.toString()).setCacheable(true).list().iterator();
        while(it.hasNext()){
            Object[] obj=(Object[]) it.next();
            TimeProjectCategory category=(TimeProjectCategory) ObjectFactory.getBean("domainTimeProjectCategoryObj");
            category.getProjectId().set_projectId((String) obj[0]);
            category.setTimeCategory((String) obj[1]);
            category.setTimeProjectCategoryId((String) obj[2]);
            timeProjectCategories.add(category);
        }


    return timeProjectCategories;

}

}

还有我的 TransactionService 类

public class TransactionService{
/**
 * 
 */
private static final long serialVersionUID = 3747504246445270484L;

@Autowired
private DataSource dataSource;

@Autowired
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
    return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}


public DataSource getDataSource() {
    return dataSource;
}
public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}


}

我在堆栈跟踪中看到的异常是

Stack Trace for the code

我的 db.xml

db.xml file

【问题讨论】:

  • 查看hibernate4中添加的更新in.relation.to/Bloggers/WhatsNewInHibernateCore40
  • 我没有看到给定代码的解决方法。
  • Hibernate 从不支持嵌套事务,这在 Hibernate 4 中被强制执行。因为 AbstractTransactionImpl 以前不存在。查看与您的 linkedin.com/groups/… 类似的相同问题
  • 发布异常的完整堆栈跟踪。此外,您的服务方法会启动一个事务,但不会提交或回滚它。
  • 因为我只是用来获取记录,所以没有什么是提交和回滚。

标签: java hibernate jakarta-ee hibernate-4.x hibernate3


【解决方案1】:

有两种可能:

在会话关闭时打开事务的实现定义行为:

确保在关闭连接之前提交(或回滚,与只读无关)事务。 Hibernate Session.close() 关闭底层连接; http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html#close%28%29 声明事务打开时的行为是实现定义的(即,一些实现会自动关闭事务,其他实现可能会引用计数连接并保持打开状态)。

一般模式是:

try {
    Transaction t = sessionFactory.getCurrentSession().beginTransaction();
    try {
        // do work
        t.commit();
    } catch (Exception e) { 
        t.rollback();
        throw e;
    }
} finally {
    sessionFactory.getCurrentSession().close();
}

之前的交易仍然有效:

如果之前的交易在其他地方仍然处于活动状态,您可以这样做:

Transaction t = session.getTransaction();
if (t == null || !t.isActive()) 
    t = session.beginTransaction();

// then use t (or session's current transaction, same thing)

或者,如果您没有传递Transaction

if (session.getTransaction() == null || !session.getTransaction().isActive())
    session.beginTransaction();

// then use session's current transaction

但您可能仍想检查您的代码,以查看在给定连接上还有哪些事务正在打开。

【讨论】:

  • 根据链接stackoverflow.com/questions/8046662/…getCurrentSession() 会自动完成。它将刷新并关闭连接。所以我不应该为此担心。
  • 我没有看到那个链接中的任何地方; JDBC 文档很清楚。你试过了吗?无论如何,我在答案中添加了第二种可能性。
  • 我没有使用过spring事务传播属性。所以你建议我使用什么。
  • @JasonC 可能是对的(除了 JDBC 文档 ID 明确之外,论坛中的帖子太旧了)。因此,只需尝试告诉我们响应即可。
  • 如果此建议没有帮助,请尝试将您的休眠版本更新/降级为其他次要版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2014-12-24
相关资源
最近更新 更多