Spring集成JPA2.0

简介:

JPA 全称 Java Persistence API,是Java EE 5标准之一,是一个 ORM 规范,由厂商来实现该规范,目前有 Hibernate、OpenJPA、TopLink、EclipseJPA 等实现。Spring目前提供集成Hibernate、OpenJPA、TopLink、EclipseJPA四个JPA标准实现。

1. 集成方式

Spring提供三种方法集成JPA:

    1. LocalEntityManagerFactoryBean:适用于那些仅使用JPA进行数据访问的项目。
    1. 从JNDI中获取:用于从Java EE服务器中获取指定的EntityManagerFactory,这种方式在Spring事务管理时一般要使用JTA事务管理。
    1. LocalContainerEntityManagerFactoryBean:适用于所有环境的FactoryBean,能全面控制EntityManagerFactory配置,非常适合那种需要细粒度定制的环境。

1.1 LocalEntityManagerFactoryBean

仅在简单部署环境中只使用这种方式,比如独立的应用程序和集成测试。该 FactoryBean 根据 JPA PersistenceProvider自动检测配置文件进行工作,一般从 META-INF/persistence.xml 读取配置信息。这种方式最简单,但是不能设置 Spring 中定义的 DataSource,且不支持 Spring 管理的全局事务,甚至,持久化类的织入(字节码转换)也是特定于提供者的,经常需要在启动时指定一个特定的JVM代理。这种方法实际上只适用于独立的应用程序和测试环境,不建议使用此方式。

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
       <property name="persistenceUnitName" value="persistenceUnit"/>
</bean>
AI 代码解读

persistenceUnit 对应 META-INF/persistence.xml 中 persistence-unit 节点的 name 属性值。

1.2 JNDI中获取

Spring 中的配置:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/jee
       http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

  <jee:jndi-lookup id="entityManagerFactory"  jndi-name="persistence/persistenceUnit"/>

</beans>
AI 代码解读

此处需要使用 jee 命名标签,且使用 <jee:jndi-lookup> 标签进行 JNDI 查找,jndi-name 属性用于指定 JNDI 名字。

在标准的 Java EE 5启动过程中,Java EE服务器自动检测持久化单元(例如应用程序文件包中的 META-INF/persistence.xml) ,以及J ava EE 部署描述符中定义给那些持久化单元命名上下文位置的环境的 persistence-unit-ref 项(例如 web.xml)。

在这种情况下,整个持久化单元部署,包括持久化类的织入(字码码转换)都取决于 Java EE 服务器。 JDBC DataSource 通过在 META-INF/persistence.xml 文件中的 JNDI 位置进行定义;EntityManager 事务与服务器的 JTA 子系统整合。Spring 仅仅用获得的 EntityManagerFactory ,通过依赖注入将它传递给应用程序对象,并为它管理事务(一般通过 JtaTransactionManager)。

注意,如果在同一个应用程序中使用了多个持久化单元,JNDI 获取的这种持久化单元的 bean 名称 应该与应用程序用来引用它们的持久化单元名称相符(例如@PersistenceUnit  @PersistenceContext 注解)。

在部署到 Java EE 5 服务器时使用该方法。关于如何将自定义 JPA 提供者部署到服务器,以及允许使用服务器提供的缺省提供者之外的 JPA 提供者,请查看服务器文档的相关说明。

1.3 LocalContainerEntityManagerFactoryBean

LocalContainerEntityManagerFactoryBean 提供了对JPA EntityManagerFactory 的全面控制,非常适合那种需要细粒度定制的环境。LocalContainerEntityManagerFactoryBean 将基于 persistence.xml 文件创建 PersistenceUnitInfo 类,并提供 dataSourceLookup 策略和 loadTimeWeaver。 因此它可以在JNDI之外的用户定义的数据源之上工作,并控制织入流程。

Spring 中的配置:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="persistenceUnitName" value="persistenceUnit" />
	<property name="dataSource" ref="dataSource" />
	<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
</bean>
AI 代码解读

这是最为强大的JPA配置方式,允许在应用程序中灵活进行本地配置。它支持连接现有JDBC DataSource , 支持本地事务和全局事务等等。然而,它也将需求强加到了运行时环境中,例如,如果持久化提供者需要字节码转换,则必须有织入ClassLoader的能力。

注意,这个选项可能与 Java EE 5 服务器内建的 JPA 功能相冲突。因此,当运行在完全 Java EE 5 环境中时, 要考虑从 JNDI 获取 EntityManagerFactory。另一种可以替代的方法是,在 LocalContainerEntityManagerFactoryBean 定义中通过 persistenceXmlLocation 指定相关位置, 例如 META-INF/my-persistence.xml,并且只将包含该名称的描述符放在应用程序包文件中。因为 Java EE 5 服务器将只 查找默认的 META-INF/persistence.xml 文件,它会忽略这种定制的持久化单元,因而避免与前面 Spring 驱动的 JPA 配置冲突。

一个配置实例:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	<property name="persistenceXmlLocation" value="test/persistence.xml"/>
	<!-- gDickens: BOTH Persistence Unit and Packages to Scan are NOT compatible, persistenceUnit will win -->
	<property name="persistenceUnitName" value="persistenceUnit"/>
	<property name="packagesToScan" value="com.javachen.example.springmvc"/>
	<property name="persistenceProvider" ref="persistenceProvider"/>
	<property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
	<property name="jpaDialect" ref="jpaDialect"/>
	<property name="jpaPropertyMap" ref="jpaPropertyMap"/>
</bean>

<util:map id="jpaPropertyMap">
	<entry key="dialect" value="${hibernate.dialect}"/>
	<entry key="hibernate.ejb.naming_strategy" value="${hibernate.ejb.naming_strategy}"/>
	<entry key="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}"/>
	<entry key="hibernate.cache.use_second_level_cache" value="false"/>
	<entry key="hibernate.cache.use_query_cache" value="false"/>
	<entry key="hibernate.generate_statistics" value="false"/>
	<entry key="show_sql" value="${hibernate.show_sql}"/>
	<entry key="format_sql" value="${hibernate.format_sql}"/>
</util:map>

<bean id="persistenceProvider" class="org.hibernate.ejb.HibernatePersistence"/>

<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
	<property name="generateDdl" value="false" />
	<property name="showSql" value="false" />
	<property name="database" value="HSQL"/>
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
AI 代码解读

说明:

  • `LocalContainerEntityManagerFactoryBean:指定使用本地容器管理 EntityManagerFactory,从而进行细粒度控制;
  • dataSource:属性指定使用 Spring 定义的数据源;
  • persistenceXmlLocation:指定 JPA 配置文件为 test/persistence.xml,且该配置文件非常简单,具体配置完全在Spring中进行;
  • persistenceUnitName:指定持久化单元名字,即 JPA 配置文件中指定的;
  • packagesToScan:指定扫描哪个包下的类,当 persistenceUnitName 和 packagesToScan 属性同时存在时,会使用 persistenceUnitName 属性
  • persistenceProvider:指定 JPA 持久化提供商,此处使用 Hibernate 实现 HibernatePersistence类;
  • jpaVendorAdapter:指定实现厂商专用特性,即 generateDdl= false 表示不自动生成 DDL,database= HSQL 表示使用 hsqld b数据库;
  • jpaDialect:如果指定 jpaVendorAdapter 此属性可选,此处为 HibernateJpaDialect;
  • jpaPropertyMap:此处指定一些属性。

处理多持久化单元

对于那些依靠多个持久化单元位置(例如存放在 classpath 中的多个 jar 中)的应用程序, Spring 提供了作为中央仓库的 PersistenceUnitManager, 避免了持久化单元查找过程。缺省实现允许指定多个位置 (默认情况下 classpath 会搜索 META-INF/persistence.xml 文件),它们会被解析然后通过持久化单元名称被获取:

<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
	<property name="persistenceXmlLocation">
	    <list>
	     <value>org/springframework/orm/jpa/domain/persistence-multi.xml</value>
	     <value>classpath:/my/package/**/custom-persistence.xml</value>
	     <value>classpath*:META-INF/persistence.xml</value>
	    </list>
	</property>
	<property name="dataSources">
	   <map>
	    <entry key="localDataSource" value-ref="local-db"/>
	    <entry key="remoteDataSource" value-ref="remote-db"/>
	   </map>
	</property>
	<!-- if no datasource is specified, use this one -->
	<property name="defaultDataSource" ref="remoteDataSource"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="persistenceUnitManager" ref="persistenceUnitManager"/>
</bean>
AI 代码解读
目录
相关文章
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
65 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
17天前
|
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的使用
本文详细介绍了Swagger2的使用方法,包括在Spring Boot项目中的配置与应用。重点讲解了Swagger2中常用的注解,如实体类上的`@ApiModel`和`@ApiModelProperty`,Controller类上的`@Api`、`@ApiOperation`以及参数上的`@ApiParam`等。通过示例代码展示了如何为实体类和接口添加注解,并在页面上生成在线接口文档,实现接口测试。最后总结了Swagger的优势及其在项目开发中的重要性,提供了课程源代码下载链接供学习参考。
58 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的使用
|
17天前
|
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
55 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
17天前
|
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
55 0
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
56 0
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
39 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
46 0
|
17天前
|
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的 maven 依赖
在项目中使用Swagger2工具时,需导入Maven依赖。尽管官方最高版本为2.8.0,但其展示效果不够理想且稳定性欠佳。实际开发中常用2.2.2版本,因其稳定且界面友好。以下是围绕2.2.2版本的Maven依赖配置,包括`springfox-swagger2`和`springfox-swagger-ui`两个模块。
32 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档—— Swagger 简介
第6课介绍了在Spring Boot中集成Swagger2以展示在线接口文档的方法。随着前后端分离架构的发展,API文档成为连接前端与后端开发的重要纽带。然而,代码更新频繁导致文档难以同步维护,Swagger2解决了这一问题。通过Swagger,在线API文档不仅方便了接口调用方查看和测试,还支持开发者实时测试接口数据。本文使用Swagger 2.2.2版本,讲解如何在Spring Boot项目中导入并配置Swagger2工具,从而高效管理接口文档。
73 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
48 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等