2015-11-26 34 views
14

Tôi muốn nâng cấp lên Hibernate 5 nhưng tôi không thể làm cho nó hoạt động vì một số lý do lạ.Cách cấu hình Hibernate 5 với Spring 4

cấu hình bối cảnh mùa xuân của tôi với Hibernate 4 trông như thế này:

.... 
<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> 

.... 

tôi rời ra nguồn dữ liệu và đậu nét hibernateClasses.

Đối với Hibernate 5 Tôi đã thay đổi tên gói để hibernate5 như thế này:

.... 
<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> 

.... 

khi tôi chạy thử nghiệm của tôi bối cảnh ứng dụng không khởi động bởi vì nó không thể tìm thấy những lớp LocalSessionFactoryBean: -S. Lớp này nằm trong mùa xuân-orm JAR và thực sự là hiện tại nhưng vì một lý do nó không thể được tìm thấy và ném ngoại lệ sau đây:

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

phụ thuộc Maven của tôi là như sau:

<!-- 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> 

Không ai có một ý tưởng những gì tôi đang làm sai?

+0

Phiên bản ngủ đông của bạn trong tệp pom của bạn là gì? –

+0

Phiên bản tôi sử dụng là 5.0.4.Final – Tranquilized

+1

Phiên bản mùa xuân của bạn là gì? Tôi có cùng một vấn đề với cấu hình mùa xuân 4.2.6 và hibernate 5.5.3. –

Trả lời

9

Có thể bạn nên thêm

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

tôi đã cùng một vấn đề, và các bản ghi ban đầu của tôi phàn nàn về,

java.lang.NoClassDefFoundError: javax/transaction/SystemException

+0

Thnx !! Điều này đã làm các trick – Tranquilized

6

@sapna câu trả lời đang làm việc.

Nhưng đối với những người tò mò về lý do tại sao nó phá vỡ giữa Hibernate 5.0.3.Final và 5.0.4.Final, đây là câu trả lời: Họ loại bỏ sự phụ thuộc vào JTA, đó là:

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

Sự thay đổi được mô tả ở đó: HHH-10178

Vì vậy, nếu bạn nâng cấp từ 5.0.x lên 5.0.4 hoặc 5.0.5 và không muốn thay đổi bất kỳ thứ gì thành classpath của mình, bạn nên nhập lib này hơn javax.transaction: jta one .

EDIT: họ hoàn nguyên thay đổi này với hibernte 5.0.7: HHH-10307, vì vậy việc nâng cấp lên phiên bản này hoặc phiên bản mới hơn cũng nên khắc phục sự cố.

Các vấn đề liên quan