Hibernate關聯關係的CRUD

來源:互聯網
上載者:User

標籤:style   blog   color   os   io   strong   資料   for   

本文以Group和User(一對多、多對一)雙向關聯為例,介紹關聯關係的CRUD

 

下面先介紹兩個屬性

cascade:隻影響CRUD中的CUD,即儲存(save)、更新(update)、刪除(delete)fetch:隻影響CRUD中的R,即讀取(get、load)

 

cascade(級聯):此屬性僅僅協助我們簡化編程,不是必選項如果A和B為單向關聯,則在主導方設定cascade屬性如果A和B為雙向關聯,則在雙方都要設定cascade屬性
如果兩個對象之間有關聯關係,比如User和Group多對一關聯如果想要儲存User的時候自動儲存Group,可在User類的@ManyToOne註解中設定cascade(級聯)屬性反過來,如果想要儲存Group的時候自動儲存User,可在Group類的@OneToMany註解中設定cascade(級聯)屬性

 

對於User(多方)和Group(一方)執行如下語句 User u = (User) session.get(User.class, 1);在取出多方對象u的同時也會把一方對象對應屬性取出來,這是@ManyToOne的預設設定.相當於設定@ManyToOne(fetch=FetchType.EAGER)反過來,取一方對象的時候,則不會把多方對象取出若想要在取出一方對象g的同時取出多方對象,則應在Group類的@OneToMany註解中設定fetch屬性fetch的取值有兩個fetch=FetchType.EAGER :執行語句就取出fetch=FetchType.LAZY :用的時候才取出兩者的區別類似於get和load的區別 注意:對於雙向關聯,不要兩邊都設EAGER(會有多餘的查詢語句發出),可以都設LAZY一般是多對一設定EAGER,一對多設定LAZY

 

建Group實體類和User實體類,以及Junit測試類別

@Entity@Table(name="_group")public class Group {private int id;private String name;private Set<User> users = new HashSet<User>();@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")public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}}

 

@Entity@Table(name="_user")public class User {private int id;private String name;private 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;}@ManyToOnepublic Group getGroup() {return group;}public void setGroup(Group group) {this.group = group;}}

 

public class ORMappingTest {private static SessionFactory sf = null;@BeforeClasspublic static void beforeClass(){sf = new Configuration().configure().buildSessionFactory();}@AfterClasspublic static void afterClass(){sf.close();}@Testpublic void test() {//下面將會完善此test()方法}}

 

接下來開始CRUD的練習

首先在Group類和User類的@OneToMany和@ManyToOne註解中添加cascade屬性

//Group類@OneToMany(mappedBy="group",cascade={CascadeType.ALL},fetch=FetchType.LAZY)public Set<User> getUsers() {    return users;}

 

//User類@ManyToOne(cascade={CascadeType.ALL})public Group getGroup() {    return group;}

 

然後,完善Junit測試類別的test()方法

 

CRUD----C   增   session.save()

1.儲存User對象的同時自動儲存Group對象

@Testpublic void test() {Session session = sf.getCurrentSession();session.beginTransaction();Group g = new Group();g.setName("lisi");User u = new User();u.setName("user1");u.setGroup(g);session.save(u);   //因為在User類的@ManyToOne註解中設定了cascade(級聯)屬性,故只需儲存User對象即可,Group對象會自動儲存session.getTransaction().commit();}

2.儲存Group對象的同時自動儲存User對象

@Testpublic void test() {Session session = sf.getCurrentSession();session.beginTransaction();User u1 = new User();User u2 = new User();Group g = new Group();u1.setName("user1");u1.setGroup(g);u2.setName("user2");u2.setGroup(g);g.setName("group1");g.getUsers().add(u1);g.getUsers().add(u2);session.save(g);   //因為在Group類的@OneToMany註解中設定了cascade(級聯)屬性,故只需儲存Group對象即可,User對象會自動儲存session.getTransaction().commit();}

 

CRUD----R   查   session.get()和session.load()

1.取出User對象的同時取出Group對象

@Testpublic void test() {Session session = sf.getCurrentSession();session.beginTransaction();User u = (User) session.get(User.class, 1);   //在取出多方對象u的同時也會把一方對象對應屬性取出來,這是@ManyToOne的預設設定System.out.println(u.getGroup().getName());   //列印輸出_group表中對應的name值session.getTransaction().commit();}

2.取出Group對象的同時取出User對象

@Testpublic void test() {Session session = sf.getCurrentSession();session.beginTransaction();Group g = (Group) session.get(Group.class, 2); //在取出一方對象g的同時取出多方對象,此時應在Group類的@OneToMany註解中設定fetch屬性for(User u : g.getUsers()){System.out.println(u.getId()+","+u.getName());  //列印輸出_user表中的相關資料}session.getTransaction().commit();}

CRUD----U   改   session.update()

通過取出的User對象,既可以更改User對象中的屬性名稱字,也可以更改與其級聯的Group對象中的屬性名稱字

@Testpublic void test {Session session = sf.getCurrentSession();session.beginTransaction();User u = (User) session.get(User.class, 3);   //在取出多方對象u的同時也會把一方對象對應屬性取出來,這是@ManyToOne的預設設定u.setName("name");                            //更改User對象中的屬性名稱字u.getGroup().setName("Groupname");            //也可以更改與其級聯的Group對象中的屬性名稱字session.update(u);session.getTransaction().commit();}

CRUD----D   刪   session.delete()

刪除User表中的某一條記錄

兩種方式,如下:

@Testpublic void testDelete() {Session session = sf.getCurrentSession();session.beginTransaction();//刪除User表中id值為1的記錄User u = (User) session.get(User.class, 1);   //在取出多方對象u的同時也會把一方對象對應屬性取出來,這是@ManyToOne的預設設定u.setGroup(null);                             //應該先消除關聯關係,再刪除對應記錄session.delete(u);                            //如果直接刪除,由於設定了cascade屬性,則會刪除Group和User中相關的所有資料      //刪除User表中id值為2的記錄session.createQuery("delete from User u where u.id=2").executeUpdate();session.getTransaction().commit();}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.