2017-09-16 27 views
7

Próbuję użyć Hibernate 5 (5.2.11) razem z Spring ORM.org.hibernate.UnknownEntityTypeException: Nie można zlokalizować persister: entity.Settings

Po samouczki wpadłem na następującej konfiguracji:

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

Taka konfiguracja prowadzi do org.hibernate.UnknownEntityTypeException: Unable to locate persister: entity.Settings.

Jednakże, jak tylko przenieść wszystkie

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

właściwości do hibernate.cfg.xml i zmienić konfigurację wiosny do

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

wszystko działa poprawnie.

Każdy pomysł, co robię źle?

PS: Zależności:

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

Nigdy nie widziałem konfiguracji, którą napisałeś. Zawsze użyłem lub pliku cfg hibernacji lub konfiguracji hibernacji sprężyny. Czy próbowałeś umieścić listę klasy encji w konfiguracji sprężyny? –

+0

Pomyślałem również, że klasa encji powinna znajdować się w konfiguracji sprężyny. Ale jak? – Hannes

Odpowiedz

2

Zwykle używam tego rodzaju konfiguracji, gdy używam hibernacji i Wiosna:

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

wszystkie moje właściwości, następnie ładowane przy użyciu pliku właściwość

Mam nadzieję, że przyda się

Angelo

2

Zgodnie z dokumentami Spring, należy użyć metody LocalSessionFactoryBean#setMappingResources do udostępniania plików odwzorowania HBM, a nie pliku konfiguracyjnego hibernacji (np. hibernate.cfg.xml).

To dlatego nie działa. Jednak zaraz po zastosowaniu właściwości configLocation działa, ponieważ jest to zamierzona metoda dostarczania pliku konfiguracyjnego specyficznego dla Hibernacji.

Teraz, ponieważ prawdopodobnie używasz adnotacji, w ogóle nie musisz używać setMappingResources. Jest to potrzebne tylko wtedy, gdy chcesz użyć plików HBM opartych na XML w celu dostarczenia mapowania Hibernate.

Zamiast tego potrzebny jest LocalSessionFactoryBean#setAnnotatedClasses. Lub setPackagesToScan, który pozwala podać tylko folder entities i wszystkie klasy jednostek wewnątrz zostaną zarejestrowane.

Aby uzyskać więcej informacji, sprawdź numer my book, High-Performance Java Persistence, GitHub repository.

+0

Używam adnotacji, ale pomyślałem, że muszę jeszcze gdzieś zarejestrować zajęcia? Jeśli nie użyję żadnej konfiguracji do hibernacji, to nie będzie działać tak dobrze ... – Hannes

+0

Użyj 'setAnnotatedClasses', jak wyjaśniłem w mojej odpowiedzi. –

Powiązane problemy