2

我正在尝试使用 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

对此提出的任何启示都非常感谢。谢谢

4

2 回答 2

3

您不能同时激活一个以上的事务(不是会话)(我正在写关于您的案例)。
可能您的方法已经在交易中,您不需要创建新方法;删除session.getTransaction().begin();.
看看如何避免嵌套事务不支持错误?

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

tx = begin tx;
try
{
  do database operations;
  commit tx;
  tx = null;
}
finally
{
  if(tx != null)
  {
    rollback tx;
  }
}
于 2013-09-12T08:39:08.463 回答
1

首先,在 getter setter 中访问数据库是错误的。getTags渲染页面期间多次调用的方法。您不能在操作方法中进行事务性数据库连接..

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

也可以看看

JSF/EJB 中的数据库通信

DAO 教程 - 数据层

于 2013-09-12T09:01:50.197 回答