Spring&JPA
1.JPA的EntityManager和EntityManagerFactory
基于JPA的应用程序要使用EntityManagerFactory的实现类来获取EntityManager实例,通过EntityManager来实现增删改查等数据库访问操作。
JPA有两种类型的实体管理器工厂:应用程序管理类型和容器管理类型。这两种区别在于EntityManager的创建和管理方式。应用程序管理类型模式中,程序负责打开或关闭实体管理器并在事务中对其进行控制。 容器管理类型模式下,JavaEE负责创建和管理实体管理器。应用程序不与实体管理器工厂打交道。建议选择容器管理类型的JPA
2.在Spring应用上下文中配置实体管理器工厂(Entity Manager Factory)
在Spring中使用JPA的第一步:在Spring应用上下文中 把 将实体管理器工厂(Entity Manager Factory) 配置成bean。就相当于在Spring中使用Hibernate的第一步:在Spring应用上下文中 把 将Hibernate SessionFactory配置成bean。参考 Spring&Hibernate 2
应用程序管理类型的EntityManagerFactory 完全由应用程序本身来负责获取EntityManagerFactory 。容器管理类型的,使用容器提供的信息来生成EntityManagerFactory。 这儿只介绍容器管理类型的如何配置。
配置EntityManagerFactory第一步:配置DataSource数据源 参考 数据库的总篇&配置数据源
配置EntityManagerFactory第二步:配置JpaVendorAdapter:Spring提供了多个JPA厂商适配器:EclipseLinkJpaVendorAdapter;HibernateJpaVendorAdapter;OpenJpaVendorAdapter等,如果选用Hibernate作为JPA的实现,需要配置HibernateJpaVendorAdapter。配置厂商适配器时最重要的是database属性,它可选的值有:MySQL,ORACLE,SQLSERVER等代表选用的数据库平台。
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
// 设置数据库类型
jpaVendorAdapter.setDatabase(Database.ORACLE);
jpaVendorAdapter.setShowSql(true);
jpaVendorAdapter.setGenerateDdl(false);
// 设置数据库方言
jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.Oracle10gDialect");
return jpaVendorAdapter;
}
配置EntityManagerFactory第三步:配置EntityManagerFactory需要两个参数 DataSource 和 JpaVendorAdapter。所以还需要配置DataSource数据源和JpaVendorAdapter用于指明所使用的是哪一个厂商的JPA实现。
import javax.sql.DataSource;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource,
JpaVendorAdapter jpaVendorAdapter) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
//设置数据源
entityManagerFactory.setDataSource(dataSource);
//设置JPA厂商适配器
entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter);
//设置扫描的基础包查找 带有@Entity注解的类
enttyManagerFactory.setPackagesToScan("com.xxx.entity");
return entityManagerFactory;
}
3.构建不依赖Spring的JPA Repository
添加mvn依赖
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
配置Spring的PersistenceAnnotationBeanPostProcessor,使Spring理解JPA规范提供的@PersistenctContext注解,并注入EntityManagerFactory或者EntityManager
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor;
@Bean
public PersistenceAnnotationBeanPostProcessor paPostProcessor() {
return new PersistenceAnnotationBeanPostProcessor();
}
使用@PersistenceContext注解 注入EntityManager实体管理器,使用 EntityManager来进行数据库访问:增删改查等。
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
@Transactional
public class StudentRepositoryImpl implements StudentRepository {
@PersistenceContext
private EntityManager em;
public void add(Student student){
em.persist(student);
}
}