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引數關係
4、Delete時@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();
user.setGroup(null);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());
}
//再將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() {