1

スタンドアロンのJavaアプリを作成するためにHibernate4.0.1.Finalを使用しています。データアクセス層をテストすると、次の例外が発生します

org.hibernate.HibernateException:createCriteriaはアクティブなトランザクションなしでは無効です

オブジェクトを検索するとき。トランザクションレベルのコードをデータベースの運用コードから分離しようとしています。私のJUnitテストは

@Before
public void setUpDAOTest() { 
    final Configuration configuration = new Configuration();
    configuration.configure().setProperty("hibernate.show_sql", "false");
    final ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    orgDao = new OrganizationDAOImpl(sessionFactory);
    session = sessionFactory.openSession();
    tx = session.beginTransaction();
}   // setUp

@Test
public void testFindStateByAbbrev() { 
    final String abbrev = testProps.getProperty("test.state.abbrev");
    final State state = orgDao.findStateByAbbrev(abbrev);
    Assert.assertNotNull(state);
    Assert.assertEquals(testProps.getProperty("test.state.abbrev"), state.getAbbrev());
}   // testFindStateByAbbrev

ユニットテストが呼び出すコードは...

public class OrganizationDAOImpl extends AbstractDAO implements OrganizationDAO {
    …
    public State findStateByAbbrev(final String abbrev) {
        State ret = null;
        final Session session = sessionFactory.getCurrentSession();
        final Criteria crit = session.createCriteria(State.class).add(Restrictions.eq("abbrev", abbrev));
        final List<State> results = crit.list();
        if (results != null && results.size() > 0) {
            ret = results.get(0);
        }   // if
        return ret;
    }

例外は、ラインのDAOでスローされます。

final Criteria crit = session.createCriteria(State.class).add(Restrictions.eq("abbrev", abbrev));

JUnitテスト(またはDAOコード)を調整して、この例外を排除し、コードを正しく実行するにはどうすればよいですか?これが私のhibernate.cfg.xmlファイルです…</p>

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/dbid</property>
        <property name="hibernate.connection.username">user</property>
        <property name="hibernate.connection.password">password</property>
        <property name="hibernate.connection.pool_size">10</property>
        <property name="show_sql">true</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
            <property name="current_session_context_class">thread</property>

        <mapping class="org.myco.myproject.orgsclient.model.Organization" />
        <mapping class="org.myco.myproject.orgsclient.model.State" />

    </session-factory>
</hibernate-configuration>
4

1 に答える 1

10

あなたはどちらかを移動することができます

session = sessionFactory.openSession();
tx = session.beginTransaction();

DAOメソッド内で、またはメソッド内の現在のスレッドに新しいセッションをバインドします@Before

hibernateがを使用するように指定しましたThreadLocalSessionContext。ただし、セッションを現在のスレッドにバインドするものはありません。

ThreadLocalSessionContext開いたセッションにアクセスできるようにするために使用できる静的bind(org.hibernate.Session session)メソッドを提供します。sessionFactory.getCurrentSession()

新しいセッションを開くだけでは、そのセッションはスレッドにバインドされません。

于 2012-06-21T20:39:21.570 に答える