【Spring技術棧】初識Spring Data JPA

Admin_lee發表於2018-08-19

一、什麼是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、新增依賴
Spring Data JPA 與Mysql連線驅動依賴的依賴

2、自定義Hibernate版本
自定義Hibernate版本
3、新增配置
新增DataSource以及JPA的配置

相關文章