2017-09-16 12 views
7

Tôi đang cố gắng sử dụng Hibernate 5 (5.2.11) cùng với Spring ORM.org.hibernate.UnknownEntityTypeException: Không thể định vị persister: entity.Settings

hướng dẫn sau tôi đã đưa ra cấu hình sau:

Xuân Bean

<bean id="sessionFactorySettings" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
      <prop key="hibernate.connection.driver_class">org.h2.Driver</prop> 
      <prop key="hibernate.connection.url">jdbc:h2:~/.dummy/settings</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
    <property name="mappingResources"> 
     <list> 
      <value>/hibernate.cfg.xml</value> 
     </list> 
    </property> 
</bean> 

Hibernate (hibernate.cfg.xml)

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <mapping class="entity.Settings"/> 
    </session-factory> 
</hibernate-configuration> 

Cấu hình này dẫn đến một org.hibernate.UnknownEntityTypeException: Unable to locate persister: entity.Settings.

Tuy nhiên, ngay sau khi tôi di chuyển tất cả

<prop key="hibernate.xxx">..</prob> 

tính vào hibernate.cfg.xml và tôi thay đổi cấu hình Spring để

<bean id="sessionFactorySettings" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
     <property name="configLocation" value="/hibernate.cfg.xml"/> 
</bean> 

tất cả mọi thứ hoạt động tốt.

Bất kỳ ý tưởng nào tôi làm sai?

PS: Dependencies:

dependencies { 
    compile 'ch.qos.logback:logback-classic:1.2.3' 
    compile 'org.springframework:spring-context:4.3.11.RELEASE' 
    compile 'org.springframework:spring-jdbc:4.3.11.RELEASE' 
    compile 'org.springframework:spring-orm:4.3.11.RELEASE' 
    compile 'org.hibernate:hibernate-core:5.2.11.Final' 
    compile 'org.hibernate:hibernate-java8:5.2.11.Final' 
    compile 'org.apache.commons:commons-dbcp2:2.1.1' 
    compile 'com.h2database:h2:1.4.196' 
} 
+1

Tôi chưa bao giờ thấy cấu hình bạn đã viết. Tôi luôn luôn sử dụng hoặc các tập tin cfg ngủ đông hoặc cấu hình hibernate mùa xuân. Bạn đã thử đặt danh sách lớp thực thể bên trong cấu hình mùa xuân chưa? –

+0

Tôi cũng nghĩ rằng lớp thực thể nên ở bên trong cấu hình mùa xuân. Nhưng bằng cách nào? – Hannes

Trả lời

2

Tôi thường sử dụng loại cấu hình này khi tôi sử dụng hibernate và mùa xuân:

<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="hibernateDatasource" /> 
    <!-- HERE YOU HAVE TO PUT THE PACKAGE 
     WHERE YOUR ENTITY CLASS ARE LOCATED 
     (I mean classes annotated with @Entity annotation --> 
    <property name="packagesToScan" value="hibernate.models" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       ${hibernate.props.db.dialect} 
      </prop> 
      <prop key="hibernate.show_sql"> 
       ${hibernate.props.db.show.sql} 
      </prop> 
      <prop key="hibernate.generate_statistics"> 
       ${hibernate.props.db.generate.statistics} 
      </prop> 
      <prop key="hibernate.format_sql"> 
       ${hibernate.props.db.format.sql} 
      </prop> 
      <prop key="hibernate.hbm2ddl.auto"> 
       ${hibernate.props.db.ddl.instr} 
      </prop> 
      <prop key="hibernate.cache.use_second_level_cache">${hibernate.props.db.use.cache}</prop> 
      <prop key="hibernate.cache.use_query_cache">${hibernate.props.db.use.query.cache}</prop> 
      <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory 
      </prop> 
      <prop key="net.sf.ehcache.configurationResourceName">hibernateEhCacheCfg.xml</prop> 
      <prop key="hibernate.jdbc.batch_size">${hibernate.props.db.jdbc.batch.size}</prop> 
      <prop key="hibernate.jdbc.use_streams_for_binary">true</prop> 
     </props> 
    </property> 
</bean> 

Tất cả tài sản của tôi được, sau đó, nạp bằng cách sử dụng một tập tin bất động sản

Tôi hy vọng nó hữu ích

Angelo

2

Theo tài liệu Spring, phương pháp LocalSessionFactoryBean#setMappingResources nên được sử dụng để cung cấp tệp ánh xạ HBM, không phải tệp cấu hình Hibernate (ví dụ: hibernate.cfg.xml).

Đó là lý do tại sao nó không hoạt động. Tuy nhiên, ngay sau khi bạn sử dụng thuộc tính configLocation, nó hoạt động vì đó là phương pháp dự định để cung cấp tệp cấu hình dành riêng cho Hibernate.

Bây giờ, vì bạn có thể sử dụng chú thích, bạn không cần sử dụng setMappingResources chút nào. Điều đó chỉ cần thiết nếu bạn muốn sử dụng các tệp HBM XML_based để cung cấp ánh xạ Hibernate.

Thay vào đó, bạn cần LocalSessionFactoryBean#setAnnotatedClasses. Hoặc setPackagesToScan cho phép bạn chỉ cung cấp thư mục entities và tất cả các lớp thực thể bên trong sẽ được đăng ký.

Khám phá my book, High-Performance Java Persistence, GitHub repository để biết thêm chi tiết.

+0

Tôi sử dụng chú thích nhưng tôi nghĩ tôi vẫn cần đăng ký lớp học ở đâu đó? Nếu tôi không sử dụng bất kỳ cấu hình nào cho ngủ đông, nó cũng sẽ không hoạt động ... – Hannes

+0

Sử dụng 'setAnnotatedClasses' như tôi đã giải thích trong câu trả lời của mình. –

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