我正在尝试使用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
对此投掷的任何光都非常感激。谢谢
答案 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类的类中的数据库。
另见