一、什么是JPA
1、JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
- 实现:EclipseLink、Hibernate、Apache OpenJPA
二、JPA核心概念
1、实体
- 实体表示关系数据库中的表
- 每个实体实例对应于该表中的行
- 类必须用javax.persistense.Entity注解
- 类必须有一个public或者protected的无参数的构造函数
- 实体实例被当作值以分离对象方式进行传递(例如通过会话bean的远程业务接口),则该类必须实现Serializable接口
- 唯一的对象标识符:简单主键(javax.persistence.Id)、复合主键(javax.persistence.Embeddedld和javax.persistence.IdClass)
2、关系
- 一对一
- 一对多
- 多对一
- 多对多
3、EntityManager
EntityManager接口
- 定义用于与持久性上下文进行交互的方法
- 创建和删除持久实体实例,通过实体的主键查找实体
- 允许在实体上运行查询
获取EntityManager实例
@PersistenceUnit
EntityManagerFactory emf;
EntityManager em;
@Resource
UserTransaction utx;
...
em = emf.createEntityManager();
try{
utx.begin();
em.persist(SomeEntity);
em.merge(AnotherEntity);
em.remove(ThirdEntity);
em.commit();
} catch(Exception e){
utx.rollback();
}
查找实体
@PersistenceContext
EntityManager em;
public void enterOrder(int custID, CustomerOrder newOrder){
Customer cust = em.find(Customer.class,custID);
cust.getOrders().add(newOrder);
newOrder.setCustomer(cust);
}
三、什么是Spring Data JPA
- 是更大的Spring Data家族的一部分
- 对基于JPA的数据访问层的增强支持
- 更容易构建基于使用Spring数据访问技术栈的应用程序
Spring Data JPA常用接口
CrudRepository
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID>{
<S extends T> S save(S entity);
T findOne(ID primaryKey);
Iterable<T> findAll();
Long count();
void delete(T entity);
boolean exists(ID primaryKey);
}
PagingAndSortingRepository
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID>{
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
根据方法名创建查询
public interface PersonRepository extends Repository<User, Long>{
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
// 启用distinct标志
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
// 给独立的属性启用ignore case
List<Person> findByLastnameIgnoreCase(String lastname);
// 给所有适合的属性启用ignore case
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname);
// 启用ORDER BY
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnamedDesc(String lastname);
}
四、Spring Data JPA、Hibernate与Spring Boot集成
1、添加依赖
2、自定义Hibernate版本
3、添加配置