org.hibernate.UnknownEntityTypeException: невозможно найти persister: entity.Settings

Я пытаюсь использовать Hibernate 5 (5.2.11) вместе с Spring ORM.

Следуя инструкциям, я придумал следующую конфигурацию:

Фасоль

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

Эта конфигурация приводит к org.hibernate.UnknownEntityTypeException: Unable to locate persister: entity.Settings,

Однако, как только я перееду все

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

свойства в hibernate.cfg.xml, и я меняю конфигурацию Spring на

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

все отлично работает

Есть идеи, что я делаю не так?

PS: Зависимости:

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

2 ответа

Согласно весенним документам, LocalSessionFactoryBean # setMappingResources метод должен использоваться для предоставления файлов отображения HBM, а не файла конфигурации Hibernate (например, hibernate.cfg.xml).

Вот почему это не работает. Однако, как только вы используете configLocationЭто работает, потому что это метод, предназначенный для предоставления файла конфигурации, специфичного для Hibernate.

Теперь, поскольку вы, вероятно, используете аннотации, вам не нужно использовать setMappingResources совсем. Это необходимо, только если вы хотите использовать файлы HBM на основе XML для предоставления отображений Hibernate.

Что вам нужно LocalSessionFactoryBean # setAnnotatedClasses вместо. Или же setPackagesToScan который позволяет вам дать только entities папка и все классы сущностей внутри будут зарегистрированы.

Посмотрите мою книгу, High-Performance Java Persistence, GitHub, для получения более подробной информации.

Обычно я использую такой тип конфигурации, когда использую hibernate и Spring:

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

Все мои свойства загружаются с помощью файла свойств

Надеюсь это полезно

Angelo

Другие вопросы по тегам