1. 程式人生 > >Hibernate關聯關係中的CRUD

Hibernate關聯關係中的CRUD

1、cascade  控制增刪改 (即CUD)

設定cascade以設定在持久化時對於關聯物件的操作(CUD,R歸Fetch管)

 cascade僅僅是幫我們省了程式設計的麻煩而已,不要把它的作用看的太大
 Cascade的屬性是陣列格式,指明做什麼操作的時候關聯物件是綁在一起的

11. cascade={CascadeType.ALL}
CascadeType取值
          ALL               Cascade all operations           所有情況
MERGE        Cascade merge operation     合併(merge=save+update)
PERSIST      Cascade persist operation    儲存 persist()
REFRESH    Cascade refresh operation    重新整理(sessionA裡面需要讀sessionB改過之後的資料)

          REMOVE      Cascade remove operation   刪除

2 鐵律:雙向關係在程式中要手動設定雙向關聯

3 鐵律:雙向mappedBy

2、Fetch   控制讀(管get(),load()和其他的讀取)

Fetch= FetchType.EAGER
Fetch= FetchType.LAZY(為了效能考慮

EAGER值代表取出關聯 ,立即載入 

LAZY值為不取關聯,延遲載入

hibernate  一對多(如Group/User)關聯關係中:

一的一方:

 class Group{

@OneToMany(fetch=FetchType.LAZY)

public Set<User> getUsers(){

        }  

  }

fetch的預設值為LAZY(取group時不會將關聯的users立即取出來,用到的時候再取也不遲)

多的一方:

class Users{

@ManyToOne(fetch=FetchType.EAGER)

public Group getGroup(){

        }

 }

fetch的預設值為EAGER(取user時將關聯的group一同取出)

a) 鐵律:雙向關聯關係中不要兩邊設定Eager(會有多餘的査詢語句發出)

b) 對多方設定fetch的時候要謹慎,結合具體應用,一般用Lazy不用eager,特殊情況(多方數量不多的時候可以考慮,提高效率的時候可以考慮)

另外:如果User設定了fetch=FetchType.LAZY ,則在取Group時需要在commit()之前 session還存在時呼叫 如:
System.out.println(user.getGroup().getName());

session.getTransaction().commit();

3、Update時@ManyToOne()中的cascade引數關係

       session.beginTransaction();

       User user = (User)session.load(User.class,1);

       //user物件屬性改變事務commit時自動判斷與資料庫原有資料不同可自動update

       //此時的update與@ManyToOne()中的cascade或fetch引數取值無關

       user.setName("user1");

       user.getGroup().setName("group1");

       session.getTransaction().commit();

如果user改變在commit()之後且想要執行Update方法時 user與group表同時更新則,則User類的cascade={CascadeType.ALL},並在程式中寫如下程式碼:

       session.beginTransaction();

       User user = (User)session.get(User.class,1);

       session.getTransaction().commit();

       user.setName("user1");

       user.getGroup().setName("group1");

       Session session2 = sessionFactory.getCurrentSession();

       session2.beginTransaction();

       session2.update(user);

       session2.getTransaction().commit();

4、Delete時@ManyToOne()中的cascade關係

       session.beginTransaction();

       User user = (User)session.load(User.class,1);

       session.delete(user);

       session.getTransaction().commit();

       注意:此處刪除的是多對一(即User對Group) 中的“多”的一方(User類)

會刪除user及user對應的group,再反向對應group的user都會刪除,原因就是設定了@ManyToOne(cascade={CascadeType.All})

三種方法可避免全部刪除的情況:

1.  去掉@ManyToOne(cascade={CascadeType.All})設定;

2.  直接寫Hql語句執行刪除;

3.  將user物件的group屬性設為null,相當於打斷User與Group間的關聯,程式碼如下

              session.beginTransaction();

              User user =(User)session.load(User.class,1);

              user.setGroup(null);

              session.delete(user);

  session.getTransaction().commit();

注意:如果刪除的是多對一中的“一”的一方(Group類)時,如果使用第3種方式(user屬性設為null)來打斷兩個物件間的關聯的話,程式碼與之前不同,如下:

session.beginTransaction();

       Group group = (Group)session.load(Group.class,1);

       //迴圈將group中的set集合下的各個user物件設為null

       //相當於先將資料庫中user表中與group表關聯的欄位(即groupid)設為null

       for(User user :group.getUsers()){

              System.out.println(user.getName());

              user.setGroup(null);

       }

       //再將group的set集合設為null,相當於將group表中與user表關聯的欄位(即userid)設為null

       //此句的前提是user表中的關聯欄位(groupid)已經為null,如沒有則相當於破壞了一對多關聯,會報錯

       group.setUsers(null);

       session.delete(group);

       session.getTransaction().commit();

相關推薦

Hibernate關聯關係CRUD

1、cascade  控制增刪改 (即CUD) 設定cascade以設定在持久化時對於關聯物件的操作(CUD,R歸Fetch管)  cascade僅僅是幫我們省了程式設計的麻煩而已,不要把它的作用看

hibernate關聯關係的一對一以及懶載入的原理:lazy和fetch的理解

******************** Person.java主對像 ******************** package blog.hibernate.domain; public class Person { private int id; p

Hibernate(5.3.7)關聯關係的反轉和級聯

1、反轉: 反轉操作在對映檔案中通過對集合的inverse屬性設定,來控制關聯關係和物件的級聯關係。 inverse預設為false,關係的兩端都能夠控制,但會造成更新時出現重複更新的情況,產生多餘的SQL語句。所以在實際開發中,一對多的時候,將一的一方inverse設定為true,

Hibernate關聯關係之一對一關聯關係CRUD操作

說明:本文註釋的不是很多,只是功能上能簡單的基本達到。要看詳細的說明可參考另一篇博文超詳細的Hibernate關聯關係之雙向的一對多關聯關係的CRUD操作————學習至黑馬程式設計師視訊教程。。當然,one-to-one , many-to-one , many-to-man

Hibernate關聯關係之多對多關聯關係CRUD操作

========================================================== ========================================================== 1.專案結構: =====

hibernate關聯關係一對多

1. 什麼是關聯(association)   1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如:       public class A{         priva

hibernate關聯關係雙向OneToOne

     其實關聯關係看起來很簡單,就什麼一對一,一對多,多對多,但是深入發掘,你會知道其中它們之間的關係其實還是挺複雜的,所以今天先用個小例子講講雙向一對一吧~ 這裡我使用的是eclipse編寫的一個maven+hibernate的一個例子 首先

Hibernate關聯關係之一對一

Hibernate關聯關係之一對一 1.一對一關聯 1.1.單向一對一外來鍵關聯 實體類中屬性,因為是單向一對一,從Person到IdCard,所以Person中多一個能存放IdCard例項物件的屬性。 IdCard.java和IdCard.hbm.xml public class I

hibernate 關聯關係配置(一對多,多對一)

Hibernate 關聯關係:        1. 什麼是關聯(association)            1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類

Hibernate 關聯關係對映配置

Hibernate 關聯關係對映配置 問題背景 一個部門下有多個員工,每個員工只屬於一個部門 員工對部門(多對一) 部門對員工(一對多) 配置關聯關係 實體類 Employee.java publ

Hibernate關聯關係

                  關聯關係在orm框架中是一個比較重要的一部分,在學習Hibernate框架的朋友可以重點的關注一下。   關聯關係通俗一點來說就是資料庫表與表之間的關係(主外來鍵關係),hibernare框架弱化了資料庫表的一些操作,強化了實體類的操作,

hibernate關聯關係(一對多、多對一)

1.什麼是關聯關係? 關聯關係是指兩個實體或者表有相互關聯,比如在學生表中,學生表有班級id,那麼學生表中的班級id就關聯班級表中班級Id欄位。因此關聯關係,可以看成是一種外來鍵關係。 2.為什麼要有關聯關係? 為了實現級聯操作,刪除班級中某個學生,會連帶刪除學生表中的

hibernate 關聯關係

<hibernate-mapping package="com.srts.system.domain"> <class name="Sys_UserRole" table="srts_sys_userrole"> <id name="id">

Hibernate關聯關係註解配置簡單理解

Hibernate關聯關係註解配置 什麼是關聯關係?關聯關係有哪幾種? 關聯關係指實體之間的關係,也就是表與表之間的關係。一個關係用兩個屬性來描述,數量性和方向性。 從數量上來看,表與表之間主要有三種關係,一對一,一對多,多對多。 加上關係的方向,還有一個多對一。 hibernate中關聯關係的維護

Hibernate關聯關係對映-----單向一對一對映配置

     這裡舉了一夫一妻的例子。實體:package uni.one2one; public class Husband { private int id; private String name; private Wife wife; public Husba

Hibernate關聯關係配置-----基於連線表的雙向多對多配置

實體:package bi.many2many.jointable; import java.util.HashSet; import java.util.Set; public class Student { private int id; private Stri

web開發(十一)之Hibernate關聯關係配置

寫在前面 Hibernate中關係的對映共有以下四種:一對多、多對一、一對一、多對多這四種。 一對多單向關聯 xml對映 一對多即在A表中的每一條資料都會與B表中的n條有關聯;在這種情況下一般都是在B表新增一個欄位用來當作外來鍵與A表中的主鍵相關聯。而這種

hibernate關聯關係註解(一對多、多對一、一對一)

一對多、多對一、一對一的註解實現 casecade={CasecadeType.REFRESH}的含義是隻是查詢級聯,它還有其他3個型別: CascadeType.MERGE級聯更新 CascadeType.PERSIST級聯儲存 CascadeType.REMOVE級聯刪

Hibernate關聯關係配置(一對一,一對多,多對多)

第一種關聯關係:一對多(多對一) "一對多"是最普遍的對映關係,簡單來講就如消費者與訂單的關係。 一對多:從消費者角的度來說一個消費者可以有多個訂單,即為一對多。 多對一:從訂單的角度來說多個

Hibernate關聯關係對映-----基於連線表的單向一對多對映

實體:package uni.many2one.jointable; public class Parent { private int id; private String name; private Child child; public Parent() {