Унитилс с Hibernate4

Я пытаюсь обновить приложение Struts/Spring с Hibernate 3.1 до Hibernate 4.3.

Для тестов баз данных я использую Stills, и в Hibernate 3.1 тесты работали правильно. В Hibernate 4.3 тесты не выполняются со следующей ошибкой:

org.unitils.core.UnitilsException: Could not find a configuring @HibernateSessionFactory annotation or custom config method
    at org.unitils.orm.common.OrmModule.getConfiguredPersistenceUnit(OrmModule.java:186)
    at org.unitils.orm.common.OrmModule.getPersistenceUnit(OrmModule.java:147)
    at org.unitils.orm.common.OrmModule.injectOrmPersistenceUnitIntoTestObject(OrmModule.java:333)
    at org.unitils.orm.common.OrmModule$OrmTestListener.beforeTestSetUp(OrmModule.java:379)
    at org.unitils.core.Unitils$UnitilsTestListener.beforeTestSetUp(Unitils.java:273)
    at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:181)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:61)
    at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:42)
    at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:60)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
    at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:67)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

Например, следующий тест не пройден:

@SpringApplicationContext({ configurationFiles })
public class SettlementDAOImplTest extends UnitilsJUnit4 {
    @HibernateSessionFactory
    private SessionFactory sessionFactory;

    @Test
    public void type() throws Exception {
        assertThat(SettlementDAOImpl.class, notNullValue());
    }
}

Я проверил свои библиотеки, и я загружаю правильные версии Unitils и Hibernate, и мой sessionFactory определяется как org.springframework.orm.hibernate4.LocalSessionFactoryBean

На данный момент, я даже не уверен, как поступить. Похоже, что Unitils ищет hibernate3.localSessionFactoryBean. Что я должен искать для устранения этой проблемы?

В моем файле applicationcontext, sessionFactory выглядит так:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref local="dataSource" />
    </property>

    <property name="mappingResources">
        <list>
            <value>Settlement.hbm.xml</value>
        </list>
    </property>


    <property name="hibernateProperties">
        <props>
            <!-- <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> -->
            <prop key="hibernate.dialect">
                com.acteva.commons.util.MySQLDialect
            </prop>
            <prop key="hibernate.bytecode.provider">javassist</prop>
            <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop>
            <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="hibernate.connection.release_mode">
                auto
            </prop>
        </props>
    </property>

    <property name="entityInterceptor" ref="entityInterceptorBean" />
</bean>

2 ответа

Это может быть связано с объяснением ниже:

Источник: http://www.unitils.org/tutorial-hibernate.html

Под капотами hibernate использует экземпляр org.hibernate.cfg.Configuration или org.hibernate.cfg.AnnotationConfiguration для загрузки файлов конфигурации и регистрации сопоставленных классов, в зависимости от того, используете ли вы hibernate классическим способом или используете ли вы hibernate с аннотаций. По умолчанию Unitils использует org.hibernate.cfg.AnnotationConfiguration. Если вы используете только файлы сопоставления, и у вас нет пути к спящим аннотациям в вашем classpath, вы можете изменить это, установив следующее свойство:

HibernateModule.configuration.implClassName = org.hibernate.cfg.Configuration

@ Озан Табак: Мы используем следующее свойство, и мы сталкиваемся с той же проблемой.

HibernateModule.configuration.implClassName=org.hibernate.cfg.Configuration

Похоже, это ошибка в unitils, которая, похоже, не поддерживает hibernate4

Unitils ver 3.3 не поддерживает загрузку sessionFactory с помощью @SpringApplicationContext, когда sessionFactory определяется как org.springframework.orm.hibernate4.LocalSessionFactoryBean.

Unitils ищет "org.springframework.orm.hibernate3.LocalSessionFactoryBean" и не может найти класс, потому что для hibernate 4 существует новое пространство имен "org.springframework.orm.hibernate4.LocalSessionFactoryBean".

Поскольку эта проблема существует с сентября 2012 года, я не ожидаю исправления ошибки в ближайшее время.

Другие вопросы по тегам