【hibernate框架】一对多(多对一)双向CRUD-关于delete2
生活随笔
收集整理的這篇文章主要介紹了
【hibernate框架】一对多(多对一)双向CRUD-关于delete2
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
如果沒有關(guān)聯(lián)關(guān)系,平常我們使用save、get、update、delete方法即可對實體對象進行增刪改查,但是一旦實體對象有關(guān)聯(lián)關(guān)系的時候,就不能直接使用save、get、update、delete方法了,就要進行一系列的語句拆分和組合。
牽扯到對一個實體對象做操作,是否要對關(guān)聯(lián)的另外一個實體對象做操作。
這里來探討一下刪除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)//不指定的話會有兩個相同的字段產(chǎn)生@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互相之間不會有重復(fù)的//跟數(shù)據(jù)庫模型比較匹配@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關(guān)聯(lián)的user全部刪除了(u3和u4都是關(guān)聯(lián)g4的,全被刪)。原因是因設(shè)置了cascade={CascadeType.ALL}。
如果不想刪除關(guān)聯(lián)的u3和u4怎么辦呢?
很簡單,還是將關(guān)聯(lián)去除(將group的user全部提取出來,去除關(guān)聯(lián)關(guān)系,即group設(shè)置為null,),然后在刪除即可。(但是u3、u4就變成了“垃圾數(shù)據(jù)”)建議把關(guān)聯(lián)的也刪除,根據(jù)情況而定了(一般都是根刪除,孩子也刪除)。
牽扯到對一個實體對象做操作,是否要對關(guān)聯(lián)的另外一個實體對象做操作。
這里來探討一下刪除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)//不指定的話會有兩個相同的字段產(chǎn)生@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互相之間不會有重復(fù)的//跟數(shù)據(jù)庫模型比較匹配@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關(guān)聯(lián)的user全部刪除了(u3和u4都是關(guān)聯(lián)g4的,全被刪)。原因是因設(shè)置了cascade={CascadeType.ALL}。
如果不想刪除關(guān)聯(lián)的u3和u4怎么辦呢?
很簡單,還是將關(guān)聯(lián)去除(將group的user全部提取出來,去除關(guān)聯(lián)關(guān)系,即group設(shè)置為null,),然后在刪除即可。(但是u3、u4就變成了“垃圾數(shù)據(jù)”)建議把關(guān)聯(lián)的也刪除,根據(jù)情況而定了(一般都是根刪除,孩子也刪除)。
覺得難控制,自己寫HQL語句就行了。
尊重開源精神,尊重勞動成果,轉(zhuǎn)載請注明出處:http://blog.csdn.net/acmman/article/details/43889447
總結(jié)
以上是生活随笔為你收集整理的【hibernate框架】一对多(多对一)双向CRUD-关于delete2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把普通的git库变成bare库
- 下一篇: webbench 代码阅读