使用 XML Configuration 设置 Hibernate

我在类路径的某处创建了一个名为 database-servlet.xml 的文件。

最初,你的配置文件将如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

</beans>

你会注意到我导入了 txjdbc Spring 命名空间。这是因为我们将在此配置文件中大量使用它们。

你要做的第一件事是启用基于注释的事务管理(@Transactional)。人们在 Spring 中使用 Hibernate 的主要原因是 Spring 将为你管理所有事务。将以下行添加到配置文件中:

<tx:annotation-driven />

我们需要创建一个数据源。数据源基本上是 Hibernate 用来持久保存对象的数据库。通常,一个事务管理器将具有一个数据源。如果你希望 Hibernate 与多个数据源通信,那么你有多个事务管理器。

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="" />
    <property name="url" value="" />
    <property name="username" value="" />
    <property name="password" value="" />
</bean>

这个 bean 的类可以是实现 javax.sql.DataSource 的任何东西,所以你可以自己编写。此示例类由 Spring 提供,但没有自己的线程池。一个流行的替代品是 Apache Commons org.apache.commons.dbcp.BasicDataSource,但还有很多其他的。我将解释下面的每个属性:

  • driverClassName :JDBC 驱动程序的路径。这是一个特定数据库的 JAR,应该可以在类路径中使用。确保你拥有最新版本。如果你使用的是 Oracle 数据库,则需要 OracleDriver。如果你有一个 MySQL 数据库,你需要一个 MySQLDriver。看看你是否能找到你需要的驱动程序 但快速谷歌应该给你正确的驱动程序。

  • url :数据库的 URL。通常这会像 jdbc\:oracle\:thin\:\path\to\your\databasejdbc:mysql://path/to/your/database。如果你四处寻找你正在使用的数据库的默认位置,你应该能够找到它应该是什么。如果你收到带有 org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set 消息的 HibernateException 并且你正在阅读本指南,那么你的网址错误的可能性为 90%,数据库未启动的可能性为 5%,用户名/密码的可能性为 5%。是错的。

  • username :使用数据库进行身份验证时使用的用户名。

  • password :使用数据库进行身份验证时使用的密码。

接下来,就是设置 SessionFactory。这是 Hibernate 用来创建和管理事务,并实际与数据库进行对话的事情。它有很多配置选项,我将在下面解释。

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="au.com.project />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.use_sql_comments">true</prop>
            <prop key="hibernate.hbm2ddl.auto">validate</prop>
        </props>
    </property>
</bean>
  • dataSource :你的数据源 bean。如果你更改了 dataSource 的 Id,请在此处进行设置。

  • packagesToScan :要扫描的包以查找 JPA 注释对象。这些是会话工厂需要管理的对象,通常是 POJO,并使用 @Entity 进行注释。有关如何在 Hibernate 中设置对象关系的更多信息,请参见此处

  • annotatedClasses (未显示):如果 Hibernate 不是全部在同一个包中,你还可以提供一个类列表供 Hibernate 扫描。你应该使用 packagesToScanannotatedClasses,但不能同时使用两者。声明如下:

<property name="annotatedClasses">
    <list>
        <value>foo.bar.package.model.Person</value>
        <value>foo.bar.package.model.Thing</value>
    </list>
</property>
  • hibernateProperties :这里有无数的精心记录 。你将使用的主要内容如下:
  • hibernate.hbm2ddl.auto :最热门的 Hibernate 问题之一详述了这个属性。查看更多信息 。我通常使用 validate,并使用 SQL 脚本(对于内存)设置我的数据库,或者事先创建数据库(现有数据库)。
  • hibernate.show_sql :Boolean flag,如果为 true Hibernate 会将它生成的所有 SQL 打印到 stdout。你还可以配置记录器,通过在日志管理器中设置 log4j.logger.org.hibernate.type=TRACE log4j.logger.org.hibernate.SQL=DEBUG 来显示绑定到查询的值(我使用 log4j)。
  • hibernate.format_sql :布尔标志,将导致 Hibernate 将 SQL 打印到 stdout。
  • hibernate.dialect (未显示,有充分理由):很多旧的教程向你展示如何设置它将用于与数据库通信的 Hibernate 方言。Hibernate 可以根据你使用的 JDBC 驱动程序自动检测要使用的方言。由于有大约 3 种不同的 Oracle 方言和 5 种不同的 MySQL 方言,我将这个决定留给 Hibernate。有关 Hibernate 支持的完整方言列表,请参阅此处

你需要声明的最后两个 bean 是:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"
    id="PersistenceExceptionTranslator" />

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

PersistenceExceptionTranslator 将特定于数据库的 HibernateExceptionSQLExceptions 转换为可由应用程序上下文理解的 Spring 异常。

TransactionManager bean 控制事务和回滚。

注意:你应该将你的 SessionFactory bean 自动装入 DAO 中。