日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【hibernate框架】一对多(多对一)双向CRUD-关于delete2

發布時間:2025/1/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【hibernate框架】一对多(多对一)双向CRUD-关于delete2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如果沒有關聯關系,平常我們使用save、get、update、delete方法即可對實體對象進行增刪改查,但是一旦實體對象有關聯關系的時候,就不能直接使用save、get、update、delete方法了,就要進行一系列的語句拆分和組合。

牽扯到對一個實體對象做操作,是否要對關聯的另外一個實體對象做操作。

這里來探討一下刪除delete“多對一”中“多”這一方的問題:

User.java:
package cn.edu.hpu.one2many;import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.Table;@Entity @Table(name="m_user") public class User {private int id;private String name;private Group group;//只要有雙向就要指定制定一個屬性(mapedby)//不指定的話會有兩個相同的字段產生@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)public Group getGroup() {return group;}public void setGroup(Group group) {this.group = group;}@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

Group.java:
package cn.edu.hpu.one2many;import java.util.HashSet; import java.util.Set;import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table;@Entity @Table(name="m_group") public class Group {private int id;private String name;private Set<User> users=new HashSet<User>();//選擇set的原因是因為,set互相之間不會有重復的//跟數據庫模型比較匹配@Id@GeneratedValuepublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@OneToMany(mappedBy="group",cascade={CascadeType.ALL},fetch=FetchType.LAZY)public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}}

刪除多那一方的測試代碼:
@Test public void testDeleteGroup(){sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();Session s=sessionFactory.openSession();s.beginTransaction();Group g=(Group)s.load(Group.class,4);s.delete(g);s.getTransaction().commit(); }

輸出的sql語句:
Hibernate:?
? ? select
? ? ? ? group0_.id as id0_0_,
? ? ? ? group0_.name as name0_0_?
? ? from
? ? ? ? m_group group0_?
? ? where
? ? ? ? group0_.id=?
Hibernate:?
? ? select
? ? ? ? users0_.group_id as group3_0_1_,
? ? ? ? users0_.id as id1_,
? ? ? ? users0_.id as id1_0_,
? ? ? ? users0_.group_id as group3_1_0_,
? ? ? ? users0_.name as name1_0_?
? ? from
? ? ? ? m_user users0_?
? ? where
? ? ? ? users0_.group_id=?
Hibernate:?
? ? delete?
? ? from
? ? ? ? m_user?
? ? where
? ? ? ? id=?
Hibernate:?
? ? delete?
? ? from
? ? ? ? m_user?
? ? where
? ? ? ? id=?
Hibernate:?
? ? delete?
? ? from
? ? ? ? m_group?
? ? where
? ? ? ? id=?
說明把與group關聯的user全部刪除了(u3和u4都是關聯g4的,全被刪)。原因是因設置了cascade={CascadeType.ALL}。
如果不想刪除關聯的u3和u4怎么辦呢?


很簡單,還是將關聯去除(將group的user全部提取出來,去除關聯關系,即group設置為null,),然后在刪除即可。(但是u3、u4就變成了“垃圾數據”)建議把關聯的也刪除,根據情況而定了(一般都是根刪除,孩子也刪除)。

覺得難控制,自己寫HQL語句就行了。

尊重開源精神,尊重勞動成果,轉載請注明出處:http://blog.csdn.net/acmman/article/details/43889447

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【hibernate框架】一对多(多对一)双向CRUD-关于delete2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。