org.hibernate.TransactionException:不支持嵌套事务

时间:2013-09-12 08:16:45

标签: hibernate facelets

我正在尝试使用Hibernate和JSF做一些小任务。

这是我的代码片段。应该检索标记列表的托管bean方法:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
public  List<WikiTag> getTags(){
    session.getTransaction().begin();
    Criteria crit = session.createCriteria(WikiTag.class);
    List<WikiTag> result = crit.list();     
    return result;
}

据我所知,我不能打开多个会话。但是,当我从facelet中调用那段代码时,我得到了

org.hibernate.TransactionException: nested transactions not supported

对此投掷的任何光都非常感激。谢谢

2 个答案:

答案 0 :(得分:3)

您不能同时激活多个事务(非会话)(我正在撰写您的案例)。
可能你的方法已经在交易中,你不需要创建一个新方法;删除session.getTransaction().begin();
How to avoid nested transactions not supported error?

另外,正确的事务管理伪代码是:

tx = begin tx;
try
{
  do database operations;
  commit tx;
  tx = null;
}
finally
{
  if(tx != null)
  {
    rollback tx;
  }
}

答案 1 :(得分:1)

首先,在getter setter中访问数据库是错误的。呈现页面期间多次调用的getTags方法。您无法在操作方法中执行事务数据库连接。

其次,在JSF动作中加入数据库不是一个好习惯。您应该访问其他通常称为DAO类的类中的数据库。

另见

Database Communication in JSF/EJB

DAO tutorial - the data layer