Java之hibernate表間關係
一對多
Customer實體類
表示一對多關係的容器:
// 容器必須初始化才能儲存東西
private Set<LinkMan> linkMans = new HashSet<>();
LinkMan實體類
// 使用一的物件來表示表與表之間的關係
private Customer customer;
Customer.hbm.xml
<hibernate-mapping package="com.lanou3g.bean">
<class name="Customer" table="cst_customer" >
<id name="cust_id" column="cust_id">
<generator class="native"></generator>
</id>
<property name="cust_name" column="cust_name" ></property>
<property name="cust_source" column="cust_source" ></property>
<property name="cust_industry" column="cust_industry" ></property>
<property name="cust_level" column="cust_level" ></property>
<property name="cust_linkman" column="cust_linkman" ></property>
<property name="cust_phone" column="cust_phone" ></property >
<property name="cust_mobile" column="cust_mobile" ></property>
<!-- 配置表關係的容器 -->
<!--
name:實體類中容器的屬性名
column:表中的外來鍵名
class:表示一對多中 多表的類(全類名)
inverse 控制是否維護外來鍵關係
預設維護外來鍵的關係 預設值false
結語 inverse 可以減少hibernate 無用操作 提高效率
cascade 級聯操作 減少點程式碼
save-update
delete
all == save-update + delete
如果要用級聯操作 就用save-update
請慎用delete
-->
<set name="linkMans" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"/>
</set>
</class>
</hibernate-mapping>
LinkMan.hbm.xml
<hibernate-mapping package="com.lanou3g.bean">
<class name="LinkMan" table="cst_linkman">
<id name="lkm_id" column="lkm_id">
<generator class="native"></generator>
</id>
<property name="lkm_name" column="lkm_name" ></property>
<property name="lkm_gender" column="lkm_gender" ></property>
<property name="lkm_phone" column="lkm_phone" ></property>
<property name="lkm_mobile" column="lkm_mobile" ></property>
<property name="lkm_email" column="lkm_email" ></property>
<property name="lkm_qq" column="lkm_qq" ></property>
<property name="lkm_position" column="lkm_position" ></property>
<property name="lkm_memo" column="lkm_memo" ></property>
<!-- 配置表關係 -->
<!--
name:表示關係的物件的屬性名
column:表中的外來鍵名
class:多對一關係中 對應的實體類名(全類名)
注意:外來鍵的屬性 不要重複配置
-->
<many-to-one name="customer" column="lkm_cust_id" class="Customer"></many-to-one>
</class>
</hibernate-mapping>
測試新增一個客戶 兩個聯絡人
@Test
public void fun1() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
// 建立客戶
Customer customer = new Customer();
customer.setCust_name("lanou");
// 建立聯絡人
LinkMan linkMan1 = new LinkMan();
linkMan1.setLkm_name("wl");
LinkMan linkMan2 = new LinkMan();
linkMan2.setLkm_name("lck");
// 新增實體類中的關係
// 把聯絡人新增到集合中
customer.getLinkMans().add(linkMan1);
customer.getLinkMans().add(linkMan2);
// 給聯絡人設定客戶
linkMan1.setCustomer(customer);
linkMan2.setCustomer(customer);
// 儲存到資料庫
session.save(customer);
session.save(linkMan1);
session.save(linkMan2);
transaction.commit();
session.close();
}
對hibernate執行的sql語句的優化
列印的插入語句 是linkman在維護自己的表
並且在插入的時候 已經插入了外來鍵(外來鍵已經有了)
列印的更新語句 是Customer來維護從而打印出來的
這裡對外來鍵的維護 兩個表都維護一遍 造成了多餘的sql語句操作
使用inverse控制是否維護外來鍵關係
刪除客戶為1的id為2的聯絡人
@Test
public void fun2() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
// 獲取id為1的客戶
// 持久態 在事務提交的時候 如果該物件被修改了 那麼修改的資料 會被同步到資料庫中
Customer customer = session.get(Customer.class, 1l);
// 獲取id為2的聯絡人
LinkMan linkMan = session.get(LinkMan.class, 2l);
// 處理實體類的關係
customer.getLinkMans().remove(linkMan);
linkMan.setCustomer(null);
// 從資料庫中刪除
session.delete(linkMan);
transaction.commit();
session.close();
}
為客戶id為1 新增聯絡人
@Test
public void fun3() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
// 獲取id為1的客戶
Customer customer = session.get(Customer.class, 1l);
// 建立聯絡人
LinkMan linkMan = new LinkMan();
linkMan.setLkm_name("zs");
// 處理實體類的關係
customer.getLinkMans().add(linkMan);
linkMan.setCustomer(customer);
// 儲存到資料庫
session.save(linkMan);
transaction.commit();
session.close();
}
測試級聯操作(可以讓你減少幾行程式碼的工作量)
save-update:
public void fun4() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("JD");
LinkMan linkMan = new LinkMan();
linkMan.setLkm_name("lsy");
customer.getLinkMans().add(linkMan);
//linkMan.setCustomer(customer);
session.save(customer);
//session.save(linkMan);
transaction.commit();
session.close();
}
delete:
@Test
public void fun5() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
Customer customer = session.get(Customer.class, 1l);
session.delete(customer);
transaction.commit();
session.close();
}
多對多
User實體類
// 表示多對多關係
private Set<Role> roles = new HashSet<>();
Role實體類
// 表示多對多關係
private Set<User> users = new HashSet<>();
User.hbm.xml
<hibernate-mapping package="com.lanou3g.bean">
<class name="User" table="sys_user">
<id name="user_id" column="user_id">
<generator class="native"></generator>
</id>
<property name="user_code" column="user_code" ></property>
<property name="user_name" column="user_name" ></property>
<property name="user_password" column="user_password" ></property>
<property name="user_state" column="user_state" ></property>
<!-- 表示多對多關係 -->
<!--
name:對應容器的名
table:中間表的名字
column:被引用的外來鍵
*****************
class:與之對應的表的類名(全類名)
column: 前面class中被引用的外來鍵
-->
<set name="roles" table="sys_user_role" inverse="true">
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml
<hibernate-mapping package="com.lanou3g.bean">
<class name="Role" table="sys_role">
<id name="role_id" column="role_id">
<generator class="native"></generator>
</id>
<property name="role_name" column="role_name" ></property>
<property name="role_memo" column="role_memo" ></property>
<set name="users" table="sys_user_role">
<key column="role_id"></key>
<many-to-many class="User" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
儲存兩個員工兩個角色
@Test
public void fun1() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
User user1 = new User();
user1.setUser_name("sc");
User user2 = new User();
user2.setUser_name("kd");
Role role1 = new Role();
role1.setRole_name("保鏢");
Role role2 = new Role();
role2.setRole_name("保姆");
user1.getRoles().add(role1);
user1.getRoles().add(role2);
user2.getRoles().add(role1);
user2.getRoles().add(role2);
role1.getUsers().add(user1);
role1.getUsers().add(user2);
role2.getUsers().add(user1);
role2.getUsers().add(user2);
session.save(user1);
session.save(user2);
session.save(role1);
session.save(role2);
transaction.commit();
session.close();
}
每個表預設都會維護自己的外來鍵關係
中間表使用的聯合主鍵 如果兩張表都維護外來鍵關係
也就是說 都會對中間表進行操作 這時會發生重複插入相同的外來鍵值
注意:所以多對多操作必須要有一張表放棄對外來鍵關係的維護
為id為1的員工增加一個角色
@Test
public void fun2() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 1l);
Role role = new Role();
role.setRole_name("保潔");
// 注意雙側關係都要新增上
user.getRoles().add(role);
role.getUsers().add(user);
session.save(role);
transaction.commit();
session.close();
}
為id為1的員工解除一個角色
@Test
public void fun3() {
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 1l);
Role role = session.get(Role.class, 2l);
user.getRoles().remove(role);
role.getUsers().remove(user);
session.save(user);
session.save(role);
transaction.commit();
session.close();
}
相關推薦
Java之hibernate表間關係
一對多 Customer實體類 表示一對多關係的容器: // 容器必須初始化才能儲存東西 private Set<LinkMan> linkMans = new HashSet<>(); LinkMan實體類
Node.js ORM框架Sequlize之表間關係
1 /** 2 * 大家就按照我的步驟來,一點一點,要有耐心哦 3 * 我相信,最後肯定有你想要的!加油 4 */ 5 //引入框架 6 const Sequelize = require('sequelize'); 7 //建立ORM例項 8 const sequel
MYSQL查詢之多表查詢、子查詢及表間關係
一對一關係 一對一的表關係: 例如:qq和qq的詳盡資訊 建立外來鍵的時候 如果明確主從關係? 被引用的表是主表,外來鍵在從表中建立 關聯主表 實現程式碼如下: CREATE TABLE qq( qqid
# Mybatis(四)表間關係分析,高階對映(一對一,一對多,多對多) 菜鳥日記--day05(下_02)
Mybatis(四)表間關係分析,高階對映(一對一,一對多,多對多) 菜鳥日記–day05(下_02) 花了很多時間,去看sql複雜查詢,更新慢了 電腦斷電寫的太急,綠色補更 一、表間關係分析 1.分析資料庫表的方法 思路: 需要分模組的對多張表進行邏輯分析 表記錄
SAP-MM採購訂單相關的主要後臺表間關係
主要的表及描述如下: 1.相關表列舉說明 EKPO 採購憑證專案 EKKO 採購憑證擡頭 EORD 採購貨源清單 EINA 採購資訊記錄 - 一般資料 EINE 採購資訊記錄 - 採購組織資料 EKET 計劃協議計劃行 EKES 供應商確認 EKKN 採購憑證中的帳
SQL server基礎之(表間關聯)
首先先準備一些資料 --E-R圖 --學生(學號,姓名,性別,生日,班級,密碼) --課程(編號,課程) --分數(學號,編號,分數) (學生表:Student) (課程表:KC) (分數表:Coure) 很簡單的三個表。。接著我們來用幾種常見的連線方法把三張表連線在
java 之 執行緒間變數共享
import java.util.Random; public class StaticTest { private static int data = 0; public static void main(String[] args) { //開三個執行緒
java之finalize在繼承關係中的使用
轉載請註明出處 http://blog.csdn.net/pony_maggie/article/details/44524077 作者:小馬 假設在基類BaseA中過載了finalize,如果繼承類DerivedA中也要過載finalize,一定要先呼叫基類的版
Hibernate之表間關系
關系數據庫 creat arc shc vat arr 單向 ring array ManyToOne 多對一,是最常見的表間關系,對應關系數據庫中的外鍵關系。通常用於建立子實體和其父實體的關聯關系 @Entity(name = "Person") pu
Java程式設計師從笨鳥到菜鳥之(五十四)細談Hibernate(五)Hibernate一對多關係對映
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興! 前幾篇系列部落格: 在前幾篇部落格,我們初步對Hibernate有了一定的基礎性的認知了,也能夠簡單的用hibernate進行
【java】itoo項目實戰之hibernate 懶載入優化性能
bsp xtra extra pda 程序 前端框架 外連接 獲取 轉換成 在做itoo 3.0 的時候,考評系統想要上線,就開始導入數據了,僅僅導入學生2萬條數據,可是導入的速度特別的慢。這個慢的原因是由於導入的時候進行了過多的IO操作。可是導入成功之後,
【java】itoo項目實戰之hibernate 批量保存優化
新的 hibernate 缺點 try 實戰 lis 插入 entity man 在itoo中。基本上每一個系統都有一個導入功能,大量的數據填寫進入excel模板中。然後使用導入功能導入的數據庫中,這樣能夠大大的提高工作效率。那麽導入就涉及到了批量保存數據庫的
hibernate 表關系映射詳解之繼承關系
子類 用戶 .cn cnblogs -1 擁有 nat src 實體類 舉例:亞馬遜的網上商城可以賣很多東西,比如說圖書,電器,水果等等,那麽我們以面向對象的理念去抽象一個商品類,他具有商品的共有屬性,比如說上架時間,當前 價格,優惠價格等待,商品可以繼承商
Java之旅hibernate(3)——第一個hibernate的樣例
數據庫方言 自由 article 存儲 代理 mit rup 方便 post 在解說樣例之前。我們首先來理解一下hibernate的工作原理。理解原理將會幫助我們更好地理解hibernate和運用hibernate。 1. 原理圖 利用hibe
Java並發之線程間協作Object的wait()、notify()、notifyAll()
它的 ring sleep方法 子類 string exce 程序退出 data- 差異 wait()、notify()和notifyAll()是Object類中的方法: 1)wait()、notify()和notifyAll()方法是本地方法,而且為fina
【數據結構】之順序表(Java語言描述)
arraylist 表數據 nbsp real 不同 1.5 根據 長度 tar 之前總結過使用C語言描述的順序表數據結構。在C語言類庫中沒有為我們提供順序表的數據結構,因此我們需要自己手寫,詳細的有關順序表的數據結構描述和C語言代碼請見【我的這篇文章】。 在Jav
Hibernate裏面表間有連接,查詢一個表出org.hibernate.HibernateException: HHH000142: Javassist Enhancement failed: 表聯系的類名 異常
延遲加載 配置文件 poj led 希望 java main.c exceptio 加載 這個問題我學Hibernate的時候遇到了,各種方法都試過,兩天才查出了,不過學的不是很深。感覺是因為表間聯系才出的問題。 最近又有人來問我這個問題,他是其他的都能查出來,但是排序查詢
Java並發工具類之線程間數據交換工具Exchanger
catch exchanger 系統 chang data 完成後 () time ktr Exchanger是一個用於線程間協做的工具類,主要用於線程間的數據交換。它提供了一個同步點,在這個同步點,兩個線程可以彼此交換數據。兩個線程通過exchange方法交換數據,如
Hibernate初探之單表映射
每次 otf 程序 nat 關系 領域 持久 對象類型 維護 http://www.imooc.com/video/78161.什麽是ORM?為什麽使用Hibernate? 對象關系映射;為了少寫和底層數據庫相關的sql語句,方便程序的維護、修改,提高跨平臺性和可擴展性。
Java數據結構之單鏈表
java 數據結構 單鏈表 鏈表的組成:鏈表頭+結點? ?鏈表頭一般只存儲下一個節點的引用? ?節點:存數據+下一個節點的引用鏈表頭代碼:package?com.xingej.algorithm.datastructure.linkedList.singleLinkedList; /** ?*?