【问题标题】:Can I use Hibernate Session Factory declared in DispatcherServlet Context instead of hibernate.cfg.xml?我可以使用在 DispatcherServlet 上下文中声明的 Hibernate 会话工厂而不是 hibernate.cfg.xml 吗?
【发布时间】:2012-08-30 00:58:43
【问题描述】:

在我之前的 Spring MVC 项目中,我使用 Hibernate 作为 JPA 的提供者。我不必创建 hibernate.cfg.xml 文件,因为我已经在 Spring DispatcherServlet 上下文文件中声明了 Hibernate Session Factory,并且我已经声明了 persistence.xml 文件。

在我的新项目中,我基本上想使用 Hibernate。我已经从我的数据库结构中生成了实体类。但是在 IDEA DAO 中没有生成类,为什么?我可以以某种方式在 IDEA 中生成 DAO 类吗?在生成这个 POJO 期间,我还在 DispatcherSerlvet 上下文文件中创建了 Hibernate Session Factory 的实体类。

我创建了自己的简单 DAO 类来检查数据库中的持久类。但是出现了这个错误:

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

所以我假设我必须创建hibernate.cfg.xml。如果是的话,我是否必须在我的 DispatcherServlet 上下文文件中保留 Hibernate Session Factory 声明?

编辑

<!-- 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 文件。我已经从 spring 配置文件中删除了会话工厂定义和 Transaction Manager 定义。我在我的数据库中的简单持久对象工作正常。那么也许这是使用 Spring MVC 和 Hibernate 的最短方法?但是Transaction Manager 呢?这是其他操作或操作所要求的吗?

【问题讨论】:

    标签: java spring hibernate spring-mvc intellij-idea


    【解决方案1】:

    我不必创建 hibernate.cfg.xml 文件,因为我有 在我的 Spring DispatcherServlet 中声明了 Hibernate Session Factory 上下文文件,我已经声明了 persistence.xml 文件。

    AFAIK 在使用 JPA 时,我们需要在 Spring 配置文件中定义 entityManagerFactory,而 JPA 的实现由 jpaVendorAdapter 属性决定。 persistence.xml 用于定义持久性单元。 hibernate.cfg.xml JPA 不需要。

    在我的新项目中,我基本上想使用 Hibernate。

    如果你想直接使用hibernate,你需要在spring配置文件或者hibernate.cfg.xml文件中定义session factory,比如

    <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 (with Hibernate implementation)


    编辑:使用AnnotationSessionFactoryBean,因为您使用注释来定义映射

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    

    【讨论】:

    • 感谢您的回答。根据直接使用 Hibernate:我已经在 spring 配置文件中定义了会话工厂,但是我得到了找不到 hibernate.cfg.xml 的错误。所以我可能无法在 spring 配置文件或 hibernate.cfg.xml 文件中定义会话工厂。
    • @woyaru:你可以在配置文件中定义sessionFactory。我已经添加了一个相同的样本。检查您是否正确定义了 sessionFactory。可能是缺少某些属性,这就是为什么 spring 正在寻找 hibernate.cfg.xml
    • 我在会话工厂中定义了与您在示例中定义的属性相同的属性。在链接的示例中,还有 configLocation 属性,但里面有 hibernate.cfg.xml。我在我的问题中添加了我对会话工厂的定义。
    • @woyaru:我认为你应该使用AnnotationSessionFactoryBean 而不是LocalSessionFactoryBean。我已经更新了我的答案。
    • 当我将 LocalSessionFactoryBean 替换为 AnnotationSessionFactoryBean 时,我遇到的错误与此处相同:stackoverflow.com/a/8566420/845220 AnnotationSessionFactoryBean is part of Hibernate 3. I would like to use Hibernate 4.跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2010-09-12
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多