JPA快速入门(三)

本文介绍了Spring整合JPA的三种方式,重点讲解了LocalContainerEntityManagerFactoryBean的配置,包括persistenceUnitManager、dataSource等属性的设置。通过示例展示了如何在Spring中配置JPA并创建实体类,最后通过一个测试类演示了整合后的操作。

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

前言:

JPA是Java EE5规范之一,是一个orm规范,由厂商来实现该规范。目前有hibernate,OpenJPA,TopLink和EclipseJPA等实现,

spring提供三种方法集成JPA:

  1. LocalEntityManagerFactoryBean:适用于那些仅使用JPA进行数据访问的项目。该FactoryBean根据 JPA PersistenceProvider自动检测配置文件进行工作,一般从“META-INF/persistence.xml”读取配置信息。这种方式最简单,但是不能设置Spring中定义的DataSource,且不支持Spring管理的全局事务。不建议使用此方式。这种方法实际上只适用于独立的应用程序和测试环境
    在Spring中的配置:

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistenceUnit"/>
    </bean>
    
  2. 从JNDI中获取:用于从Java EE服务器中获取指定的EntityManagerFactory,这种方式在Spring事务管理时一般要使用JTA事务管理。

    在标准的java EE 5启动过程中,Java EE服务器自动检测持久化单元(例如应用程序文件包中的META-INF/persistence.xml) ,以及java 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服务器时使用该方法。

  3. LocalContainerEntityManagerFactoryBean:适用于所有环境的FactoryBean,能全面控制EntityManagerFactory配置,非常适合那种需要细粒度定制的环境。
    该bean有以下属性:

    • persistenceUnitManager:用于获取JPA持久化单元,默认实现DefaultPersistenceUnitManager用于解决多配置文件情况。

    • dataSource:用于指定Spring定义的数据源。

    • persistenceXmlLocation:用于指定JPA配置文件,对于多JPA配置文件情况请选择设置persistenceUnitManager属性来解决。

    • persistenceUnitName:用于指定持久化单元名称。

    • persistenceProvider:用于指定持久化实现厂商类,如hibernate为: org.hibernate.ejb.HibernateProvider 类。

    • jpaVendorAdapter:用于设置JPA实现厂商的特定属性,如设置hibernate的是否自动生成DDL的属性generateDdl,这些属性是厂商特定的,因此最好在这里设置。目前spring提供HibernateJpaVendorAdapter,OpenJpaVendorAdapter,EclipseJpaVendorAdapter,TopLinkJpaVenderAdapter四个实现。其中最主要的属性是“database”,用来指定使用的数据库类型。从而根据数据库类型决定如何将数据库特定异常转换为Spring一致性异常。目前支持以下数据库:DB2,DERBY,H2,HSQL,INFORMIX,MySQL,Oracle,POSTGRESQL,SQL_SERVER,SYBASE

    • jpaDialect:用于指定一些高级特性,如事务管理等。目前Spring提供HibernateJpaDialect,OpenJpaDialect,EclipseJpaDialect,TopLinkJpaDialect和DefaultJpaDialect实现。注意DefaultJpaDialect不提供任何功能,因此在使用特定实现厂商的JPA实现时需要指定jpaDialect实现,如使用hibernate就使用HibernateJpaDialect。当指定jpaVendorAdapter属性时可以不指定jpaDialect,会自动设置相应的JpaDialect实现;

    • jpaProperties和jpaPropertyMap:指定JPA属性;如Hibernate中指定是否显示SQL的“hibernate.show_sql”属性,对于jpaProperties设置的属性自动会放进jpaPropertyMap中;
      loadTimeWeaver:用于指定LoadTimeWeaver实现,从而允许JPA 加载时修改相应的类文件。具体使用得参考相应的JPA规范实现厂商文档,如Hibernate就不需要指定loadTimeWeaver。

以上是对Spring整合JPA的方式的介绍之后,接下来我们选择第三中方式来完成Spring对JPA的整合

首先,导入相应的包,我们这里使用的是maven项目,所以,在pom.xml文件中做如下的配置

```

然后,在applicationContext.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" default-lazy-init="true">

<!-- JPA实体管理工厂的配置 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
    <!--待扫描的实体类包,不再需要persistence.xml了-->
    <property name="packagesToScan" value="cn.wolfcode.jpa.domain"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>

<!--指定实现JPA的适配器-->
<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
</bean>

<!-- local development环境 -->
<context:property-placeholder ignore-resource-not-found="true" system-properties-mode="NEVER"  location="classpath*:/db.properties"/>

<!-- DBCP连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${driverClassName}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
    <property name="defaultAutoCommit" value="false"/>
</bean>

</beans>


最后,编写测试需要使用到的实体类

package cn.wolfcode.jpa.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.persistence.*;
import java.util.Date;

//创建一个实体类,和user表对应
@Getter
@Setter
@ToString
@Entity(name = “UserInfo”)
public class User {

@Id
@GeneratedValue
private Long id;
private String name;
private Integer age;
// 对日期类型的属性做映射
@Temporal(TemporalType.DATE)
private Date hiredate;
private String sn;

}


测试类

@RunWith(SpringJUnit4ClassRunner.class)
//指定加载classpath跟路径下的applicationContext.xml文件启动Spring容器
@ContextConfiguration(“classpath:applicationContext.xml”)
public class EntityManagerTest {

//获取容器中对应的EntityManager对象
@PersistenceContext
private EntityManager em;

@Test
public void test() throws  Exception{
    //查询id为1的员工对象
    User user = em.find(User.class, 1L);
    System.out.println(user);
}

}
```

执行结果:
User(id=1, name=Neld, age=10, hiredate=2018-06-30, sn=001)

到此,我们完成了Spring整合JPA,今后在开发中,我们在DAO中使用@PersistenceContext注解来注入EntityManager对象,然后完成对应的CRUD操作即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值