java - 我可以使用在 DispatcherServlet 上下文中声明的 Hibernate session 工厂而不是 hibernate.cfg.xml 吗?

标签 java spring hibernate spring-mvc intellij-idea

在我之前的 Spring MVC 项目中,我使用 Hibernate 作为 JPA 的提供者。我不必创建 hibernate.cfg.xml 文件,因为我已经在我的 Spring DispatcherServlet Context 文件中声明了 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 配置文件中删除了 session 工厂定义和 Transaction Manager 定义。我的数据库中的简单持久对象工作正常。那么也许这是使用 Spring MVC 和 Hibernate 的最短方式?但是 Transaction Manager 呢?这是其他操作或 Action 所需要的吗?

最佳答案

I didn't have to create hibernate.cfg.xml file because I have declared Hibernate Session Factory in my Spring DispatcherServlet Context file and I have declared persistence.xml file.

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

In my new project I would like to use Hibernate basically.

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

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

关于java - 我可以使用在 DispatcherServlet 上下文中声明的 Hibernate session 工厂而不是 hibernate.cfg.xml 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12279199/

相关文章:

java - 检测 wso2emm 中的应用程序版本

java - 索引 1 处的片段中存在非法字符 : #{systemEnvironment ['DATABASE_URL' ]} configurando datasource on Heroku

在构造函数中使用@ConfigurationProperties 和@Value 的Spring 前缀

java - 使用hibernate创建fixture(不是import.sql方法)

java - 当键被覆盖时 LinkedHashMap#put 是否保持顺序? (JAVA)

java - 对二维数组进行冒泡排序时出现空指针异常

编译后 Java Servlet 无法识别 java 文件中的更改

spring - 为什么我需要 @Transactional 来保存 OneToOne 映射实体

hibernate - 内连接和内连接 fetch 有什么区别? ,HQL

sql - FBSQLException 键大小超出实现