Hibernate:createCriteria 在没有活动事务的情况下无效

Hibernate: createCriteria is not valid without active transaction

我是 Hibernate 新手。使用版本 3 并遇到以下问题。

我正在使用 hibernatetool ant 任务生成 DAO 类

当我 运行 我的第一个单元测试时,我得到以下错误:

No CurrentSessionContext configured! org.hibernate.HibernateException: No CurrentSessionContext configured!at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:542)

所以我进行了 google 搜索并将这一行添加到我的 hibernate.cfg.xml:

<property name="current_session_context_class">thread</property>

之后,我在尝试持久化对象时遇到以下错误:

org.hibernate.HibernateException: createCriteria is not valid without active transaction

很好,所以我手动开始并提交了一个 t运行saction。

所以我坚持这样: 代码:

 Transaction tx=null;
 tx = session.beginTransaction();
sessionFactory.getCurrentSession().persist(transientInstance);

成功!

那么,我的问题是:

  1. 所有操作都必须明确地成为 t运行saction 的一部分,那么为什么 Hibernate 工具代码生成器没有将其也放入我的 DAO 中?是否也可以通过 ant 任务添加这些行,那么如何?

tx = session.beginTransaction();

  1. 什么是 CurrentSessionContext?我提供了值 "thread"。那是什么意思?还有哪些选择?

你可以尝试使用Spring-Annotations -

"@Transactional"

尽量减少您自己的努力...

..这是我刚刚发现的第一个充分的例子:

http://www.byteslounge.com/tutorials/spring-with-hibernate-persistence-and-transactions-example

看起来像:

...  
@Override
  @Transactional
  public void insertUser(User user) {
    userDAO.insertUser(user);
  }

  @Override
  @Transactional
  public User getUserById(int userId) {
    return userDAO.getUserById(userId);
  }

  @Override
  @Transactional
  public User getUser(String username) {
    return userDAO.getUser(username);
  }

  @Override
  @Transactional
  public List<User> getUsers() {
    return userDAO.getUsers();
  }