2012-05-03 44 views
5

tôi sử dụng Hibernate (thông qua JPA) cấu hình bởi mùa xuân và khi tôi khởi động ứng dụng của tôi (chiến tranh được triển khai trên Tomcat 6), tôi nhận được lỗi này:Hibernate phương ngữ vấn đề với cấu hình Spring

org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set 

Nó có vẻ lạ vì tôi 've thiết lập các phương ngữ ngủ đông như sau:

p:databasePlatform="org.hibernate.dialect.MySQL5Dialect 

Để biết thêm thông tin, đây applicationContext.xml đầy đủ của tôi:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 


    <bean id="dataSource" 
      class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
      p:driverClassName="com.mysql.jdbc.Driver" 
      p:url="jdbc:mysql://localhost/room_management" p:username="root" p:password=""/> 

    <bean id="entityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
      p:dataSource-ref="dataSource" p:persistenceUnitName="RoomManagement"> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
        p:database="MYSQL" 
        p:databasePlatform="org.hibernate.dialect.MySQL5Dialect" 
        p:showSql="true"/> 
     </property> 
    </bean> 

    <bean id="transactionManager" 
      class="org.springframework.orm.jpa.JpaTransactionManager" 
      p:entityManagerFactory-ref="entityManagerFactory"/> 

    <context:annotation-config/> 


    <context:component-scan base-package="com.parisdescartes.roommanagement.*"/> 

    <tx:annotation-driven/> 

</beans> 

Vì vậy, tôi đã quyết định chính xác Hibernate Dialect trong tệp META-INF/persistence.xml và lần này hoạt động. Dưới đây là cách tôi đặt trước:

<properties> 
      <property name="hibernate.dialect" 
         value="org.hibernate.dialect.MySQL5Dialect"/> 
</properties> 

Bạn có biết tại sao Hibernate Dialect không được đặt bằng cấu hình Spring không?

+0

Làm thế nào để bạn xây dựng nhà máy phiên của bạn? – Bitmap

+0

Tôi chỉ sử dụng chú thích @PersistenceContext trên tài liệu tham chiếu entityManager – Mik378

Trả lời

23

Không chắc chắn lý do tại sao nó không hoạt động với cấu hình của bạn. Có thể đã xảy ra lỗi khi sử dụng chú thích p:. Tôi sẽ đăng mã của tôi (mà làm việc cho cấu hình của tôi) để thử nếu nó sẽ sửa mã của bạn! :)

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="false"/> 
      <property name="generateDdl" value="true"/> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/> 
     </bean> 
    </property> 
</bean> 

Chúc may mắn!

+1

Việc này đã khắc phục sự cố cho tôi. –

6

Một chút trễ, nhưng tôi nghĩ điều này có thể tăng thêm giá trị. Không nhất thiết bạn cần thêm thuộc tính databasePlatform nếu bạn chỉ định thuộc tính database, chính bộ điều hợp sẽ tìm ra phương ngữ.

<property name="database" value="MYSQL" /> 

mã có liên quan từ org.springframework.orm.jpa.vendor.HibernateJPAVendorAdapter

protected Class determineDatabaseDialectClass(Database database) { 
    switch (database) { 
     case DB2: return DB2Dialect.class; 
     case DERBY: return DerbyDialect.class; 
     case H2: return H2Dialect.class; 
     case HSQL: return HSQLDialect.class; 
     case INFORMIX: return InformixDialect.class; 
     case MYSQL: return MySQLDialect.class; 
     case ORACLE: return Oracle9iDialect.class; 
     case POSTGRESQL: return PostgreSQLDialect.class; 
     case SQL_SERVER: return SQLServerDialect.class; 
     case SYBASE: return SybaseDialect.class; 
     default: return null; 
    } 
} 
+0

bạn đã cho tôi một ý tưởng làm thế nào để thay đổi để tùy chỉnh 'MysqlDialect'. Chỉ cần mở rộng 'HibernateJPAVendorAdapter' và ghi đè' defineDatabaseDialectClass'. trong 'MSQL' trả về một số lớp' dialect' tùy chỉnh. Hy vọng rằng điều này có thể hoạt động theo cách đó – oak

+0

am .. vừa kiểm tra nhận xét cuối cùng của tôi. nó chạy. nhưng có vẻ như 'lớp tùy chỉnh' được chuyển đến từ việc ghi đè khác' defineDatabaseDialectClass' không làm gì cả. trong thực tế, 'constructor" không bao giờ được gọi ... – oak

0

Dialect có thể tự động phát hiện từ tài xế DataSource. Vì vậy, nether hibernate.dialect no database là cần thiết. Nếu ngoại lệ 'hibernate.dialect' not set xảy ra, nó thường có nghĩa là, hơn một cái gì đó sai trái với kết nối DB:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
     p:dataSource-ref="dataSource" 
     p:packagesToScan="ru.javawebinar.**.model"> 

    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="#{T(org.hibernate.cfg.AvailableSettings).FORMAT_SQL}" value="${hibernate.format_sql}"/> 
      <entry key="#{T(org.hibernate.cfg.AvailableSettings).USE_SQL_COMMENTS}" value="${hibernate.use_sql_comments}"/> 
     </map> 
    </property> 

    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
       p:showSql="${jpa.showSql}"> 
     </bean> 
    </property> 
</bean> 
Các vấn đề liên quan