您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關JPA中orphanRemoval 屬性有什么用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
JPA定義Model關系中有orphanRemoval 這個參數。其作用您是否了解?
orphanRemoval介紹和作用
上面截圖的jpa的官方文檔以及jpa規范中明確說明,如果javaBean中父實體和子實體之間有一對一或一對多的級聯關系的時候,如果我們想要刪除父實體,也必須要級聯刪除子實體,需要被刪除的級聯關系中的子實體則被稱為孤兒實體。
orphanremoval屬性的主要作用就是標記是否可以刪除孤兒實體,假設我們這里有一個訂單的案例,訂單下面有許多行記錄,假設我們刪除其中的一行記錄的話,需要被刪除的這一行記錄就被稱作是孤兒,當我們設置這個屬性為true的時候,意思就是我們可以從這個訂單的所有記錄中刪除標記為孤兒的這條記錄。
屬性詳解和案例代碼
@OneToMany(mappedBy="parent",targetEntity=Child.class, cascade={CascadeType.ALL},orphanRemoval=true)privateList<Child> children= newArrayList<Child>();@OneToMany(mappedBy="parent",targetEntity=Son.class, cascade={CascadeType.ALL},orphanRemoval=true)privateList<Son> son= newArrayList<Son>();Fistly,we save One Parent have two Son and two Child in database:Parent p = newParent();Child c1 = newChild();Child c2 = newChild();Son s1 = newSon();Son s2 = newSon();p.setParentName("AAA");c1.setChildName("BBB");c2.setChildName("CCC");s1.setName("s1");s2.setName("s2");//set relationshipp.getChildren().add(c1);p.getChildren().add(c2);p.getSon().add(s1);p.getSon().add(s2);c1.setParent(p);c2.setParent(p);s1.setParent(p);s2.setParent(p);em.merge(p);so we can see it in database:mysql> select * from Parent;+----+------------+| id | parentName |+----+------------+| 1 | AAA |+----+------------+ mysql> select * from Child;+----+-----------+-----------+| id | childName | parent_id |+----+-----------+-----------+| 1 | BBB | 1 || 2 | CCC | 1 |+----+-----------+-----------+mysql> select * from Son;+----+------+-----------+| id | name | parent_id |+----+------+-----------+| 1 | s1 | 1 || 2 | s2 | 1 |+----+------+-----------+then we can use merge to remove orphaned entities .At first, we should ceate a test Data.Parent p = newParent();//set id to the entity,when there is correspongding record in database,just update.p.setId(1);Child c1 = newChild();c1.setId(1);c1.setChildName("c3");Son s2 = newSon();s2.setId(2);s2.setName("c4");//new Child and Son Enity,and add it to Parent's List.Without id,so jpa will save a new record for them ,id auto-increment.Child c = newChild();c.setChildName("childNew");c.setParent(p);p.getChildren().add(c); Son s = newSon();s.setName("sonNew");s.setParent(p);p.getSon().add(s);//at last,merge the root Entity Parent,when we set the orphanRemoval truein @OneToMany,the Child(id=2) Son(id=1) entity will be deleted when the line item is removed from the order.em.merge(p);then we can see it in database:mysql> select * from Parent;+----+------------+| id | parentName |+----+------------+| 1 | AAAnew |+----+------------+mysql> select * from Child;+----+-----------+-----------+| id | childName | parent_id |+----+-----------+-----------+| 1 | c3 | 1 || 3 | childNew | 1 |+----+-----------+-----------+record with id=2 is removed.mysql> select * from Son;+----+--------+-----------+| id | name | parent_id |+----+--------+-----------+| 2 | c4 | 1 || 3 | sonNew| 1 |+----+--------+-----------+record with id=1 is removed.
與cascade的關系
二者的作用范圍不一樣,cascade的作用范圍是數據庫,當cascade屬性設置了delete時,當刪除級聯關系中的子集時,順便也會將數據庫中對應的數據刪除。orphanremoval屬性的作用范圍僅僅是java應用代碼中,做級聯刪除的操作也只適用于java實體代碼范疇,它可以清楚javabean的級聯關系,但并不能影響數據庫的數據,只要cascade不點頭是無法刪除掉數據庫的數據的
上述就是小編為大家分享的JPA中orphanRemoval 屬性有什么用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。