前言
本章讲解Hibernate JPA的相关知识,用来作为Spring Data的准备章节
方法
1.概念
Spring Data 是持久层通用解决方案,支持 关系型数据库 Oracle、MySQL、非关系型数据库NoSQL、Map-Reduce 框架、云基础数据服务 、搜索服务
Spring Data 包含多个子项目,其中Spring Data JPA (简化创建 JPA 数据访问层和跨存储的持久层功能)正式我们本次需要重点关注的内容。其底层采用的就是Hibernate JPA技术,这也是为什么先讲Hibernate JPA的主要原因!
2.Spring整合Hibernate基于JPA规范
之前说了那么多,...JPA,那么什么是JPA呢?
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。
说白了目前市场上的ORM框架(Hibernate,Mybatis,EclipseLink,JFinal...)各为其主,刚开始做的时候都有他们自己的一套对象/关系映射技术,JPA的出现为了规约各方,使得大家按照JPA的标准管理对象/关系映射,真正做到天下统一!
其中,Hibernate JPA就是实现了其所谓的JPA规范来简化DAO层开发!
1)准备好Spring+Hibernate整合的Maven项目
这个需要大家提前准备好!不会配置的同学请自行复习。
2)修改pom文件,加入Hibernate JPA相关jar坐标
<!-- 引入Hibernate JPA的相关jar -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
3)修改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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 配置组件扫描,以便于告诉Spring哪里有注解 -->
<context:component-scan base-package="cn.edu.ccut"></context:component-scan>
<!-- 引入jdbc配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!-- 配置dataSource数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置Hibernate JPA EntityManagerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- 配置Hibernate相关的属性 -->
<property name="database" value="MYSQL"/>
<property name="generateDdl" value="true"/>
<property name="showSql" value="true"/>
</bean>
</property>
<property name="packagesToScan" value="cn.edu.ccut.bo"></property>
</bean>
<!-- 配置Hibernate JPA 事务管理器 -->
<bean id="tx" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<!-- 没有Hibernate JPA 配置sessionFactory -->
<!--<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="packagesToScan" value="cn.edu.ccut.bo"></property>
</bean>-->
<!-- 没有Hibernate JPA 配置hibernateTemplate -->
<!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> -->
<!-- 没有Hibernate JPA 配置事务管理器 -->
<!-- <bean id="tx" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> -->
<!-- 配置注解管理事务 -->
<tx:annotation-driven transaction-manager="tx" proxy-target-class="true"></tx:annotation-driven>
</beans>
3)使用Hibernate JPA后的DAO实现类CRUD
package cn.edu.ccut.dao.impl;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;
import cn.edu.ccut.bo.Users;
import cn.edu.ccut.dao.UserDAO;
@Repository
public class UserDAOImpl implements UserDAO {
//没有Hibernate JPA配置
/*@Autowired
private HibernateTemplate hibernateTemplate;*/
/*@Override
public Users findById(Integer id) {
return hibernateTemplate.get(Users.class, id);
}*/
//Hibernate JPA
@PersistenceContext(name="entityManagerFactory")//该注解表示从工厂中拿出对象
private EntityManager entityManager;
@Override
public void doCreate(Users user) {
entityManager.persist(user);
}
@Override
public Users findById(Integer id) {
return entityManager.find(Users.class, id);
}
@Override
public void doRemove(Integer id) {
Users user = this.findById(id);
entityManager.remove(user);
}
@Override
public void doUpdate(Users user) {
entityManager.merge(user);
}
}
以上呢就是我们使用Spring和Hibernate整合时基于JPA规范实现的增删改查,权当是SpringData JPA的知识铺垫!