孫衛琴的《精通JPA與Hibernate》的讀書筆記:JPA API的級聯操做

在JPA API中,javax.persistence.CascadeType類中定義了一些常量,分別表示特定的級聯操做:java

  • CascadeType.PERSIST :當經過EntityManager的persist()方法來保存當前對象時,會級聯保存全部關聯的新建的臨時對象。
  • CascadeType.REMOVE :當經過EntityManager的remove()方法來刪除當前持久化對象時,會級聯刪除全部關聯的持久化對象。
  • CascadeType.DETACH :當經過EntityManager的detach()方法來從持久化緩存中清除當前對象時,會級聯清除全部關聯的對象。
  • CascadeType.MERGE :當經過EntityManager的merge()方法來融合當前對象時,會級聯融合全部關聯的對象。
  • CascadeType.REFRESH :當經過EntityManager的refresh()方法刷新當前對象時,會級聯刷新全部關聯的對象。
  • CascadeType.ALL 包含了以上全部的級聯操做行爲。

當經過註解來映射持久化類時,若是但願使用底層Hibernate的一些級聯特性,那麼還能夠使用org.hibernate.annotations. CascadeType類的一些常量,例如:數據庫

  • org.hibernate.annotations.CascadeType.LOCK:當經過底層Session的lock()方法把當前遊離對象加入到持久化緩存中時,會把全部關聯的遊離對象也加入到持久化緩存中。
  • org.hibernate.annotations.CascadeType.REPLICATE:當經過底層Session的replicate()方法複製當前對象時,會級聯複製全部關聯的對象。
  • org.hibernate.annotations.CascadeType.SAVE_UPDATE:當經過底層Session的save()、update()及saveOrUpdate()方法來保存或更新當前對象時,會級聯保存全部關聯的新建的臨時對象,而且級聯更新全部關聯的遊離對象。

例如如下@OneToMany註解的cascade屬性的取值爲「org.hibernate.annotations.CascadeType.SAVE_UPDATE」:緩存

@OneToMany(mappedBy="parentCategory",
  targetEntity=Category.class)

@org.hibernate.annotations.Cascade(
  org.hibernate.annotations.CascadeType.SAVE_UPDATE)

private Set<Category> childCategories = new HashSet<Category>(0);

Category類是具備自身雙向關聯的類,它的childCategories屬性以及parentCategory屬性,進行了以下映射:markdown

@OneToMany(mappedBy="parentCategory",
             targetEntity=Category.class,
             cascade=CascadeType.ALL,
             fetch=FetchType.EAGER)
private Set<Category> childCategories = new HashSet<Category>(0);  //子商品類別

@ManyToOne(targetEntity =Category.class,
            cascade=CascadeType.ALL,
            fetch=FetchType.EAGER)
@JoinColumn(name="CATEGORY_ID")
private Category parentCategory;  //父商品類別

對於以上兩個屬性,它們的級聯操做都是CascadeType.ALL,這意味着對當前的Category對象進行特定操做時,會對所關聯的父類別Category對象,以及所關聯的全部子類別Category對象進行一樣的級聯操做。
另外,爲了保證從數據庫中加載一個Category對象時,會當即加載所關聯的父類別和子類別Category對象,採用了當即檢索策略:FetchType.EAGER。
在這裏插入圖片描述app

相關文章
相關標籤/搜索