webentwicklung-frage-antwort-db.com.de

So konfigurieren Sie Hibernate 5 mit Spring 4

Ich wollte auf Hibernate 5 upgraden, aber ich kann es aus irgendeinem seltsamen Grund nicht zum Laufen bringen.

Meine Konfiguration des Frühlingskontexts mit Hibernate 4 sieht folgendermaßen aus:

....
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses" ref="hibernateClasses" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
                ${hibernate.dialect}
            </prop>
            <prop key="hibernate.show_sql">
                ${hibernate.show_sql}
            </prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.generate_statistics">
                ${hibernate.generate_statistics}
            </prop>
            <prop key="hibernate.hbm2ddl.auto">
                ${hibernate.hbm2ddl.auto}
            </prop>
        </props>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

....

Ich habe die Datenquelle und die hibernateClasses-Beans-Definition weggelassen.

Für Hibernate 5 habe ich den Paketnamen folgendermaßen in hibernate5 geändert:

....
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses" ref="hibernateClasses" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
                ${hibernate.dialect}
            </prop>
            <prop key="hibernate.show_sql">
                ${hibernate.show_sql}
            </prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.generate_statistics">
                ${hibernate.generate_statistics}
            </prop>
            <prop key="hibernate.hbm2ddl.auto">
                ${hibernate.hbm2ddl.auto}
            </prop>
        </props>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

....

beim Ausführen meiner Tests wird der Anwendungskontext nicht gestartet, da die LocalSessionFactoryBean-Klasse nicht gefunden werden kann: -S. Diese Klasse befindet sich in spring-orm JAR und ist tatsächlich vorhanden, kann aber aus irgendeinem Grund nicht gefunden werden und löst die folgende Ausnahme aus:

Java.lang.NoClassDefFoundError: Could not initialize class org.springframework.orm.hibernate5.LocalSessionFactoryBuilder

Meine Maven-Abhängigkeiten sind wie folgt:

    <!-- Servlet API -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>${servlet-api.version}</version>
        <scope>provided</scope>
    </dependency>

    <!-- Spring libraries -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
        <exclusions>
            <exclusion>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
            </exclusion>
            <exclusion>
                <groupId>asm</groupId>
                <artifactId>asm</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>${slf4j.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
        <scope>provided</scope>
    </dependency>

    <!-- Test -->
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>${cglib.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>${asm.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-mock</artifactId>
        <version>${spring-mock.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.easymock</groupId>
        <artifactId>easymock</artifactId>
        <version>${easymock.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>${hsqldb.version}</version>
        <scope>test</scope>
    </dependency>

Hat jemand eine Idee was ich falsch mache?

15
Tranquilized

Vielleicht sollten Sie hinzufügen

<dependency>
  <groupId>javax.transaction</groupId>
  <artifactId>jta</artifactId>
  <version>1.1</version>
</dependency>

Ich hatte das gleiche Problem und meine ersten Protokolle beschwerten sich darüber,

Java.lang.NoClassDefFoundError: javax/transaction/SystemException

10
sapna

@ Sapna Antwort funktioniert.

Aber für diejenigen, die neugierig sind, warum es zwischen Ruhezustand 5.0.3.Final und 5.0.4.Final bricht, ist hier die Antwort: Sie haben die Abhängigkeit von jta beseitigt, die lautete:

<dependency>
    <groupId>org.Apache.geronimo.specs</groupId>
    <artifactId>geronimo-jta_1.1_spec</artifactId>
    <version>1.1.1</version>
    <scope>compile</scope>
</dependency>

Die Änderung ist dort beschrieben: HHH-10178

Wenn Sie also ein Upgrade von 5.0.x auf 5.0.4 oder 5.0.5 durchführen und nichts an Ihrem Klassenpfad ändern möchten, sollten Sie diese Bibliothek lieber importieren als die javax.transaction: jta one.

BEARBEITEN: Sie haben diese Änderung mit hibernte 5.0.7: HHH-10307 rückgängig gemacht. Ein Upgrade auf diese oder eine neuere Version sollte daher ebenfalls das Problem beheben.

8
Thierry