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);
	}
}

 

posted on 2019-04-29 11:50  dreamstar  阅读(78)  评论(0编辑  收藏  举报