Spring-JPA(使用Hibernate作为JPA的实现)

1 简介

在Spring2.0版本中,Spring首次集成了JPA,很多开发人员都推荐在基于Spring的应用程序中使用JPA实现持久化。实际上,有些人还将Spring-JPA合称为POJO开发的梦之队。

2 示例

在本示例中使用Hibernate作为JPA的实现,也可以选择类似的其他技术如MyBatis也是可以的。

2.1 配置数据源

我这边采用的是Hive作为数据源从中读取records表的数据。

	@Bean
	public BasicDataSource dataSource(){
		BasicDataSource ds = new BasicDataSource();
		ds.setDriverClassName("org.apache.hive.jdbc.HiveDriver");
		ds.setUrl("jdbc:hive2://192.168.225.100:10000/default");
		ds.setUsername("hive");
		ds.setPassword("123456");
		ds.setInitialSize(5);
		ds.setMaxActive(10);
		return ds;
	

2.2 配置实体管理器工厂

基于JPA的应用程序需要使用EntityManagerFactory的实现类来获取EntityManager实例。JPA定义了两种类型的实体管理器:

  • 应用程序管理类型 – 这种方式的实体管理器适合于不运行在JavaEE容器中的独立应用程序。
  • 容器管理类型 – 这种类型的实体管理器适用于JavaEE容器。

我这里未来需要做个Web项目做大数据平台的展示,所以选择容器管理类型的实体管理器。

	@Bean
	public LocalContainerEntityManagerFactoryBean entityManageFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){
		LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
		emfb.setDataSource(dataSource);
		emfb.setJpaVendorAdapter(jpaVendorAdapter);
		emfb.setPackagesToScan("com.css.test.jpa");
		return emfb;
	}

2.3 JPA适配器

这里采用Hibernate作为JPA的实现方式。

	@Bean
	public JpaVendorAdapter jpaVendorAdapter(){
		HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
		adapter.setDatabase(Database.HSQL);
		adapter.setShowSql(true);
		adapter.setGenerateDdl(false);
		adapter.setDatabasePlatform("org.hibernate.dialect.HSQLDialect");
		return adapter;
	}

2.4 编写基于JPA的Repository

因为纯粹的JPA方式远胜于基于模板的JPA,所以我这里选择构建不依赖与Spring的JPA Repository。

import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
@Transactional
public class JpaRecordsRepository implements RecordsRepository {
	@PersistenceUnit
	private EntityManagerFactory emf;
	
	public void addRecords(Records record){
		emf.createEntityManager().persist(record);
	}
	
	public Records getRecordsByQuality(Integer quality){
		return emf.createEntityManager().find(Records.class, quality);
	}
	
	public void saveRecords(Records record){
		emf.createEntityManager().merge(record);
	}
}

3 完整源代码

代码清单

  • JpaConfig.java – JPA配置类
  • Records.java – 实体,用于描述records表的数据结构
  • RecordsRepository.java – 对records表进行操作的接口
  • JpaRecordsRepository.java – RecordsRepository接口的实现类
  • springContext.xml – Spring上下文配置文件
  • TestJPA.java – 测试程序

JpaConfig.java

/**
 * 配置类
 * @author HP
 *
 */
@Configuration
@ComponentScan
public class JpaConfig {
	@Bean
	public BasicDataSource dataSource(){
		BasicDataSource ds = new BasicDataSource();
		ds.setDriverClassName("org.apache.hive.jdbc.HiveDriver");
		ds.setUrl("jdbc:hive2://192.168.225.100:10000/default");
		ds.setUsername("hive");
		ds.setPassword("123456");
		ds.setInitialSize(5);
		ds.setMaxActive(10);
		return ds;
	}
	@Bean
	public LocalContainerEntityManagerFactoryBean entityManageFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){
		LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
		emfb.setDataSource(dataSource);
		emfb.setJpaVendorAdapter(jpaVendorAdapter);
		emfb.setPackagesToScan("com.css.test.jpa");
		return emfb;
	}
	@Bean
	public JpaVendorAdapter jpaVendorAdapter(){
		HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
		adapter.setDatabase(Database.HSQL);
		adapter.setShowSql(true);
		adapter.setGenerateDdl(false);
		adapter.setDatabasePlatform("org.hibernate.dialect.HSQLDialect");
		return adapter;
	}
}

Records.java

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
/**
 * 实体
 * @author HP
 *
 */
@Entity(name="records")
public class Records {
	@Column
	private String year;
	@Column
	private Integer temperature;
	@Column
	private Integer quality;
	
	public Records() {
		super();
	}

	public Records(String year, Integer temperature, Integer quality) {
		super();
		this.year = year;
		this.temperature = temperature;
		this.quality = quality;
	}

	public String getYear() {
		return year;
	}

	public void setYear(String year) {
		this.year = year;
	}

	public Integer getTemperature() {
		return temperature;
	}

	public void setTemperature(Integer temperature) {
		this.temperature = temperature;
	}
	@Id
	public Integer getQuality() {
		return quality;
	}

	public void setQuality(Integer quality) {
		this.quality = quality;
	}

	@Override
	public String toString() {
		return "Records [year=" + year + ", temperature=" + temperature + ", quality=" + quality + "]";
	}
}

RecordsRepository.java

public interface RecordsRepository {
	public void addRecords(Records record);
	public Records getRecordsByQuality(Integer quality);
	public void saveRecords(Records record);
}

JpaRecordsRepository.java

import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
@Transactional
public class JpaRecordsRepository implements RecordsRepository {
	@PersistenceUnit
	private EntityManagerFactory emf;
	
	public void addRecords(Records record){
		emf.createEntityManager().persist(record);
	}
	
	public Records getRecordsByQuality(Integer quality){
		return emf.createEntityManager().find(Records.class, quality);
	}
	
	public void saveRecords(Records record){
		emf.createEntityManager().merge(record);
	}
}

springContext.xml


TestJPA.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
 * 程序入口
 * @author HP
 *
 */
public class TestJPA {
	public static void main(String[] args) {
		ApplicationContext ac = new AnnotationConfigApplicationContext(JpaConfig.class);
		RecordsRepository rr = ac.getBean(RecordsRepository.class);
		Records record = rr.getRecordsByQuality(2);
		System.out.println(record);
	}
}

测试

Hive中的数据是这样的:
Spring-JPA(使用Hibernate作为JPA的实现)_第1张图片
运行测试程序(TestJPA.java)
Spring-JPA(使用Hibernate作为JPA的实现)_第2张图片

附录

在编写这个程序的时候有可能产生导入jar包出现问题,我把我的pom.xml文件也贴在这里方便大家查找问题。
pom.xml(运用的技术比较综合内容可能有点多……)


	4.0.0
	com.strategy
	second
	war
	0.0.1-SNAPSHOT
	second Maven Webapp
	http://maven.apache.org
	
		5.0.0.RELEASE
	
	
		
			jdk.tools
			jdk.tools
			1.8
			system
			${JAVA_HOME}/lib/tools.jar
		
		
			org.apache.hadoop
			hadoop-common
			2.7.3
		
		
			org.apache.hadoop
			hadoop-hdfs
			2.7.3
		
		
			org.apache.hadoop
			hadoop-client
			2.7.3
		
		
			org.apache.hadoop
			hadoop-minicluster
			2.7.3
		
		
		
			junit
			junit
			4.12
		
		
			org.springframework
			spring-core
			${spring.version}
		
		
			org.springframework
			spring-web
			${spring.version}
		
		
			org.springframework
			spring-webmvc
			${spring.version}
		
		
			org.springframework
			spring-aop
			${spring.version}
		
		
			org.springframework
			spring-jdbc
			${spring.version}
		
		
			org.springframework
			spring-test
			${spring.version}
		
		
			org.aspectj
			aspectjweaver
			1.8.4
		
		
			javax.servlet
			javax.servlet-api
			3.1.0
		
		
			com.codahale.metrics
			metrics-core
			3.0.2
		
		
			org.apache.hbase
			hbase
			0.98.13-hadoop2
			pom
		
		
		
			org.apache.hbase
			hbase-client
			0.98.13-hadoop2
		
		
		
			org.apache.hbase
			hbase-common
			0.98.13-hadoop2
		
		
		
			org.apache.hive
			hive-jdbc
			2.3.4
		
		
		
			org.springframework.data
			spring-data-jpa
			2.1.3.RELEASE
		
		
		
			org.hibernate.javax.persistence
			hibernate-jpa-2.0-api
			1.0.1.Final
		
		
		
			org.hibernate
			hibernate-core
			5.3.7.Final
		
		
			javax.persistence
			persistence-api
			1.0.2
		
	
	
		second
	

你可能感兴趣的:(大数据,Hive,Spring,Java,JPA)