Comment on page
4.3Hibernate
我们从对Spring环境中的Hibernate 5的介绍开始,用它来演示Spring用于集成OR映射器的方法。 本节详细讨论了许多问题,并展示了DAO实现和事务划分的不同变体。 这些模式中的大多数都可以直接转换为所有其他受支持的ORM工具。 然后,本章后面的部分将介绍其他ORM技术,并显示一些简短的示例。
从Spring Framework 5.0开始,Spring需要Hibernate ORM 4.3或更高版本才能提供JPA支持,甚至需要Hibernate ORM 5.0+才能针对本机Hibernate Session API进行编程。 请注意,Hibernate团队不再维护5.1之前的任何版本,并且可能很快会专注于5.3+。
为了避免将应用程序对象与硬编码的资源查找绑定在一起,可以在Spring容器中将资源(例如JDBC DataSource或Hibernate SessionFactory)定义为bean。 需要访问资源的应用程序对象通过bean引用接收对此类预定义实例的引用,如下一节中的DAO定义所示。
以下XML应用程序上下文定义摘录显示了如何在其上设置JDBC数据源和Hibernate SessionFactory:
<beans>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="mappingResources">
<list>
<value>product.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.HSQLDialect
</value>
</property>
</bean>
</beans>
从本地Jakarta Commons DBCP BasicDataSource切换到位于JNDI的DataSource(通常由应用程序服务器管理)仅是配置问题,如以下示例所示:
<beans>
<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myds"/>
</beans>
您还可以使用Spring的JndiObjectFactoryBean / <jee:jndi-lookup>检索并公开它,从而访问位于JNDI的SessionFactory。但是,这通常在EJB上下文之外并不常见。
Spring还提供了LocalSessionFactoryBuilder变体,可与@Bean样式配置和编程设置无缝集成(不涉及FactoryBean)。LocalSessionFactoryBean和LocalSessionFactoryBuilder都支持后台引导,并且Hibernate初始化与给定引导执行程序(例如SimpleAsyncTaskExecutor)上的应用程序引导线程并行运行。在LocalSessionFactoryBean上,可以通过bootstrapExecutor属性使用。在程序化LocalSessionFactoryBuilder上,有一个重载的buildSessionFactory方法,该方法带有引导执行程序参数。从Spring Framework 5.1开始,此类native Hibernate设置还可以在native Hibernate访问时候公开用于标准JPA交互的JPA EntityManagerFactory。有关详细信息,请参见JPA的nativeHibernate设置。
Hibernate具有称为上下文会话的功能,其中,Hibernate本身在每个事务中管理一个当前会话。 这大致相当于Spring在每个事务中同步一个Hibernate Session。 基于简单的Hibernate API,相应的DAO实现类似于以下示例:
public class ProductDaoImpl implements ProductDao {
private SessionFactory sessionFactory;