使用 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>
你会注意到我导入了 tx
和 jdbc
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\database
或jdbc: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 扫描。你应该使用
packagesToScan
或annotatedClasses
,但不能同时使用两者。声明如下:
<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
将特定于数据库的 HibernateException
或 SQLExceptions
转换为可由应用程序上下文理解的 Spring 异常。
TransactionManager
bean 控制事务和回滚。
注意:你应该将你的 SessionFactory
bean 自动装入 DAO 中。