Spring对Hibernate和JPA的支持

本文详细介绍了Spring如何与Hibernate和JPA集成,提供数据持久化支持。从延迟加载、预先抓取、级联等概念出发,阐述了Spring对ORM框架的整合,包括与Hibernate的Session工厂bean配置、异常转换处理,以及对JPA的实体管理器工厂配置。文章还探讨了如何通过Spring Data JPA简化JPA Repository的实现,利用Spring Data的领域特定语言(DSL)进行定制查询。最后,讨论了自定义Repository实现的策略,以便在需要时深入JPA操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

a、延迟加载(Lazy loading)

b、预先抓取(Eager fetching)

c、级联(Cascading)

一些可用的框架提供了如上这样的服务,这些服务的通用名称是对象/关系映射(object-relational mapping,ORM)。在持久层使用ORM工具,可以节省数千行的代码和大量的开发时间。ORM工具能够把你的注意力从容易出错的SQL代码转向如何实现应用程序的真正需求。Spring对多个持久化框架都提供了支持,包括Hibernate、iBATIS、Java数据对象(Java Data Objects,JDO)以及Java持久化API(Java Persistence API,JPA)。与Spring对JDBC的支持那样,Spring对ORM框架的支持提供了与这些框架的集成点以及一些附加的服务:

1、支持集成Spring声明式事务;

2、透明的异常处理;

3、线程安全的、轻量级的模板类;

4、DAO支持类;

5、资源管理;

在本章中,我们将会看到Spring如何与最常用的两种ORM方案集成:Hibernate和JPA。同时还会通过Spring Data JPA了解一下Spring Data项目。借助这种方式,我们不仅可以学习到如何借助Spring Data JPA移除JPA Repository中的样板式代码,还能为下一章的如何将Spring Data用于无模式的存储打下基础。

一、Spring集成Hibernate,不用Template和HibernateDaoSupport了,而是直接使用session了!

使用Hibernate所需要的主要接口是org.hibernate.Session。通过Hibernate的Session接口,应用程序的Repository能够满足所有的持久化需求。获取Hibernate Session对象的标准方式是借助于Hibernate SessionFactory接口的实现类。除了一些其他的任务,SessionFactory主要负责Hibernate Session的打开、关闭以及管理。Spring提供了三个Session工厂bean供我们选择:

1、org.springframework.orm.hibernate3.LocalSessionFactoryBean;

2、org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;

3、org.springframework.orm.hibernate4.LocalSessionFactoryBean;

这些Session工厂bean都是Spring FactoryBean接口的实现,它们会产生一个HibernateSessionFactory。这样的话,就能在应用的Spring上下文中,与其他的bean一起配置Hibernate Session工厂。

如果你使用Hibernate4的话推荐使用org.springframework.orm.hibernate4.LocalSessionFactoryBean。它是hibernate3里面的LocalSessionFactoryBean与AnnotationSessionFactoryBean的结合体,能够支持基于XML的映射和基于注解的映射。如下的代码展现了如何对它进行配置,使其支持基于注解的映射:

 

用packagesToScan属性告诉Spring扫描一个或多个包以查找域类,这些类通过注解的方式表明要使用Hibernate进行持久化,这些类可以使用的注解包括JPA的@Entity或@MappedSuperclass以及Hibernate的@Entity。

 

在Spring和Hibernate的早期岁月中,我们用的是HibernateTemplate,HibernateTemplate能够保证每个事务使用同一个Session。但是这种方式的弊端在于我们的Repository实现会直接与Spring耦合。现在的最佳实践是不再使用HibernateTemplate,而是使用上下文Session(Contextual session)。通过这种方式,会直接将Hibernate SessionFactory装配到Repository中,并使用它来获取Session,如下面的程序清单所示:

 

我们通过@Inject注解让Spring自动将一个SessionFactory注入到HibernateSpitterRepository的sessionFactory属性中。接下来,在currentSession()方法中,我们使用这个SessionFactory来获取当前事务的Session。

 

重点:我们在类上使用了@Repository注解,这会为我们做两件事情

1、@Repository是Spring的另一种构造性注解,它能够像其他注解一样被Spring的组件扫描所扫描到。这样就不必明确声明HibernateSpitterRepository bean了,只要这个Repository类在组件扫描所涵盖的包中即可。

2、下面讲。。。!

让我们回想一下模板类,它有一项任务就是捕获平台相关的异常,然后使用Spring统一非检查型异常的形式重新抛出。如果我们使用Hibernate上下文Session而不是Hibernate模板的话,那异常转换会怎么处理呢?为了给不使用模板的Hibernate Repository添加异常转换功能,我们只需在Spring应用上下文中添加一个PersistenceExceptionTranslationPostProcessor bean(在配置文件里面申明即可)。PersistenceExceptionTranslationPostProcessor是一个bean 后置处理器(beanpost-processor),它会在所有拥有@Repository注解的类上添加一个通知器(advisor),这样就会捕获任何平台相关的异常并以Spring非检查型数据访问异常的形式重新抛出。

好了,到这里为止,我们没有依赖Spring的Hibernate版本的Repository已经完成了。

 

二、使用JPA的第一步,配置实体管理器工厂,类似于LocalSessionFactoryBean那一类的东西,用来生成EntityManager:

在Spring中使用JPA的第一步是要在Spring应用上下文中将实体管理器工厂(entity manager factory)按照bean的形式来进行配置。

简单来讲,基于JPA的应用程序需要使用EntityManagerFactory的实现类来获取EntityManager实例。JPA定义了两

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值