Могу ли я использовать фабрику сеансов Hibernate, объявленную в контексте DispatcherServlet, вместо hibernate.cfg.xml?

В моем предыдущем проекте Spring MVC я использовал Hibernate в качестве поставщика JPA. Мне не нужно было создавать файл hibernate.cfg.xml, потому что я объявил фабрику сеансов Hibernate в моем файле контекста Spring DispatcherServlet, и я объявил файл persistence.xml.

В моем новом проекте я хотел бы в основном использовать Hibernate. Я создал классы сущностей из моей структуры базы данных. Однако в IDEA классы DAO не были сгенерированы, почему? Могу ли я каким-то образом генерировать классы DAO в IDEA? И во время создания этого POJO классы сущностей, которые я создал, также создают фабрику сеансов Hibernate в файле контекста DispatcherSerlvet.

Я создал свои собственные простые классы DAO для проверки сохраняющегося класса в базе данных. Но произошла эта ошибка:

Error in creating SessionFactory object./hibernate.cfg.xml not found

Итак, я предполагаю, что мне нужно создать hibernate.cfg.xml. И если да, то должен ли я вообще хранить объявление Hibernate Session Factory в моем файле контекста DispatcherServlet?

ИЗМЕНИТЬ

<!-- Hibernate session factory -->
<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

    <beans:property name="dataSource">
        <beans:ref bean="dataSource" />
    </beans:property>

    <beans:property name="hibernateProperties">
        <beans:props>
            <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop>
            <beans:prop key="hibernate.show_sql">true</beans:prop>
            <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop>
            <beans:prop key="hibernate.connection.url">jdbc:mysql://localhost/finances</beans:prop>
            <beans:prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</beans:prop>
            <beans:prop key="hibernate.connection.username">root</beans:prop>
            <beans:prop key="hibernate.connection.password">root</beans:prop>
        </beans:props>
    </beans:property>

    <beans:property name="annotatedClasses">
        <beans:list>
            <beans:value>my.package.FirstClass</beans:value>
            <beans:value>my.package.SecondClass</beans:value>
        </beans:list>
    </beans:property>
</beans:bean>
<!-- Hibernate session factory end -->

<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>

РЕДАКТИРОВАНИЕ №2

Я переместил аннотированные классы и определения соединений в файл hibernate.cfg.xml. Я удалил определение фабрики сеансов, а также определение Transaction Manager из файла конфигурации Spring. И мой простой постоянный объект в моей базе данных работает правильно. Так может это самый короткий способ работы со Spring MVC и Hibernate? А как же Transaction Manager? Требуется ли это для других операций или действий?


person woyaru    schedule 05.09.2012    source источник


Ответы (1)


Мне не нужно было создавать файл hibernate.cfg.xml, потому что я объявил фабрику сеансов Hibernate в своем файле контекста Spring DispatcherServlet и объявил файл persistence.xml.

Насколько я знаю, при использовании JPA нам нужно определить entityManagerFactory в файле конфигурации Spring, а реализация JPA определяется свойством jpaVendorAdapter. persistence.xml используется для определения единиц персистентности. hibernate.cfg.xml не требуется для JPA.

В моем новом проекте я хотел бы в основном использовать Hibernate.

Если вы хотите использовать hibernate напрямую, вам нужно определить фабрику сеансов либо в файле конфигурации spring, либо в файле hibernate.cfg.xml, например

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.
    annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.foo.Bar</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect"> org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
    </bean>

Вы путаете конфигурацию JPA и Hibernate.
Следующие ссылки могут помочь вам избежать путаницы
Spring + Hibernate
Spring + JPA (с реализацией Hibernate)


EDIT: используйте AnnotationSessionFactoryBean, поскольку вы используете аннотацию для определения сопоставления

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
person Ajinkya    schedule 05.09.2012
comment
Спасибо за ответ. Согласно прямому использованию Hibernate: я определил фабрику сеансов в файле конфигурации spring, но получаю сообщение об ошибке, что hibernate.cfg.xml не найден. Поэтому я, вероятно, не могу определить фабрику сеансов либо в файле конфигурации spring, либо в файле hibernate.cfg.xml. - person woyaru; 05.09.2012
comment
@woyaru: вы можете определить sessionFactory в файле конфигурации. Я добавил образец для того же самого. Проверьте, правильно ли вы определили sessionFactory. Возможно, некоторые свойства отсутствуют, поэтому spring ищет hibernate.cfg.xml. - person Ajinkya; 05.09.2012
comment
В моей фабрике сеансов определены те же свойства, что и в примере. В примере по ссылке тоже есть свойство configLocation, но внутри есть hibernate.cfg.xml. Я добавил к своему вопросу свое определение фабрики сеансов. - person woyaru; 05.09.2012
comment
@woyaru: я думаю, вам следует использовать AnnotationSessionFactoryBean вместо LocalSessionFactoryBean. Я обновил свой ответ. - person Ajinkya; 05.09.2012
comment
Когда я заменил LocalSessionFactoryBean на AnnotationSessionFactoryBean, у меня возникла такая же ошибка, как здесь: stackoverflow.com/a/8566420/845220 AnnotationSessionFactoryBean является частью Hibernate 3. Я хотел бы использовать Hibernate 4. - person woyaru; 05.09.2012