在我们将应用程序从 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;
}
}
我在堆栈轨道中看到的异常是
我的 db.xml
最佳答案
有两种可能:
session 关闭时打开事务的实现定义行为:
确保在关闭连接之前提交(或回滚,与只读无关)事务。 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
但是您仍然可能想要检查您的代码以查看在给定连接上还有哪些地方打开了事务。
关于java - 从 Hibernate 3 迁移到 Hibernate4 不断获取不支持的嵌套事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19557540/