一、一對多/多對一:
1.關系表達:
1)表中的表達:
2)實體中的表達:
3)orm元數(shù)據(jù)中表達:
一對多:
多對一:
2.基本操作:
3.級聯(lián)操作:
結論: 簡化操作.一定要用,save-update,不建議使用delete.
4.關系維護:
舉例:
兩個表:customer表和linkman表:
Customer.java:
public class Customer {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
//使用set集合,表達一對多關系
private Set<LinkMan> linkMens = new HashSet<LinkMan>();
//get跪另,set方法以省略
}
LinkMan.java:
public class LinkMan {
private Long lkm_id;
private Character lkm_gender;
private String lkm_name;
private String lkm_phone;
private String lkm_email;
private String lkm_qq;
private String lkm_mobile;
private String lkm_memo;
private String lkm_position;
//表達多對一關系
private Customer customer ;
//get,set方法以省略
}
Customer.hbm.xml:
<set name="linkMens" inverse="true" cascade="save-update" >
<key column="lkm_cust_id" ></key>
<one-to-many class="LinkMan" />
</set>
LinkMan.hbm.xml:
<many-to-one name="customer" column="lkm_cust_id" class="Customer" >
</many-to-one>
Demo.java:
//一對多|多對一關系操作
public class Demo {
@Test
//保存客戶 以及客戶 下的聯(lián)系人
public void fun1(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
Customer c = new Customer();
c.setCust_name("傳智播客");
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("黎活明");
LinkMan lm2 = new LinkMan();
lm2.setLkm_name("劉悅東");
//表達一對多,客戶下有多個聯(lián)系人
c.getLinkMens().add(lm1);
c.getLinkMens().add(lm2);
//表達對對對,聯(lián)系人屬于哪個客戶
lm1.setCustomer(c);
lm2.setCustomer(c);
session.save(c);
// session.save(lm1);
// session.save(lm2);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
@Test
//為客戶增加聯(lián)系人
public void fun2(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
//1> 獲得要操作的客戶對象
Customer c = session.get(Customer.class,1l);
//2> 創(chuàng)建聯(lián)系人
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("郝強勇");
//3> 將聯(lián)系人添加到客戶,將客戶設置到聯(lián)系人中
c.getLinkMens().add(lm1);
lm1.setCustomer(c);
//4> 執(zhí)行保存
session.save(lm1);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
@Test
//為客戶刪除聯(lián)系人
public void fun3(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
//1> 獲得要操作的客戶對象
Customer c = session.get(Customer.class,1l);
//2> 獲得要移除的聯(lián)系人
LinkMan lm = session.get(LinkMan.class, 3l);
//3> 將聯(lián)系人從客戶集合中移除
c.getLinkMens().remove(lm);
lm.setCustomer(null);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
}
Demo2.java
//測試級聯(lián)操作
public class Demo2 {
@Test
//保存客戶 以及客戶 下的聯(lián)系人
//cascade:save-update
public void fun1(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
Customer c = new Customer();
c.setCust_name("傳智播客");
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("黎活明");
LinkMan lm2 = new LinkMan();
lm2.setLkm_name("劉悅東");
//表達一對多,客戶下有多個聯(lián)系人
c.getLinkMens().add(lm1);
c.getLinkMens().add(lm2);
//表達對對對,聯(lián)系人屬于哪個客戶
lm1.setCustomer(c);
lm2.setCustomer(c);
session.save(c);
// session.save(lm1);
// session.save(lm2);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
@Test
//測試刪除客戶時,級聯(lián)刪除客戶下的聯(lián)系人
//cascade:delete
public void fun2(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
//1> 獲得要操作的客戶對象
Customer c = session.get(Customer.class,1l);
//2>調用delete刪除客戶
session.delete(c);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
@Test
//保存聯(lián)系人以及聯(lián)系人對應的客戶
//cascade:save-update
public void fun3(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
Customer c = new Customer();
c.setCust_name("北大青鳥");
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("劉總");
//表達一對多,客戶下有多個聯(lián)系人
c.getLinkMens().add(lm1);
//表達對對對,聯(lián)系人屬于哪個客戶
lm1.setCustomer(c);
session.save(lm1);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
}
Demo3.java:
//操作進階--關系維護屬性
public class Demo3 {
@Test
//保存客戶 以及客戶 下的聯(lián)系人
public void fun1(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
Customer c = new Customer();
c.setCust_name("傳智播客");
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("黎活明");
LinkMan lm2 = new LinkMan();
lm2.setLkm_name("劉悅東");
//表達一對多,客戶下有多個聯(lián)系人.
// 如果客戶放棄維護與聯(lián)系人的關系. 維護關系的代碼可以省略
//c.getLinkMens().add(lm1);
//c.getLinkMens().add(lm2);
//表達對對對,聯(lián)系人屬于哪個客戶
lm1.setCustomer(c);
lm2.setCustomer(c);
session.save(c);
session.save(lm1);
session.save(lm2);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
@Test
//刪除客戶
public void fun2(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
Customer customer = session.get(Customer.class, 1l);
session.delete(customer);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
}
二、多對多:
1.關系表達;
1)表中:
2)實體中:
3)orm元數(shù)據(jù)中:
2.操作:
3.inverse屬性:
4.級聯(lián)屬性:
舉例:
兩個表:User表和Role表
User.java:
public class User {
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private Character user_state;
//表達多對多
private Set<Role> roles = new HashSet<Role>();
}
Role.java:
public class Role {
private Long role_id;
private String role_name;
private String role_memo;
//表達多對多
private Set<User> users = new HashSet<User>();
}
User.hbm.xml:
<set name="roles" table="sys_user_role" cascade="save-update" >
<key column="user_id" ></key>
<many-to-many class="Role" column="role_id" ></many-to-many>
</set>
Role.hbm.xml:
<set name="users" table="sys_user_role" inverse="true" >
<key column="role_id" ></key>
<many-to-many class="User" column="user_id" ></many-to-many>
</set>
Demo.java
//多對多關系操作
public class Demo {
@Test
//保存員工以及角色
public void fun1(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
//1> 創(chuàng)建兩個 User
User u1 = new User();
u1.setUser_name("郝強勇");
User u2 = new User();
u2.setUser_name("金家德");
//2> 創(chuàng)建兩個 Role
Role r1 = new Role();
r1.setRole_name("保潔");
Role r2 = new Role();
r2.setRole_name("保安");
//3> 用戶表達關系
u1.getRoles().add(r1);
u1.getRoles().add(r2);
u2.getRoles().add(r1);
u2.getRoles().add(r2);
//4> 角色表達關系
r1.getUsers().add(u1);
r1.getUsers().add(u2);
r2.getUsers().add(u1);
r2.getUsers().add(u2);
//5> 調用Save方法一次保存
session.save(u1);
session.save(u2);
session.save(r1);
session.save(r2);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
@Test
//為郝強勇新增一個角色
public void fun3(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
//1> 獲得郝強勇用戶
User user = session.get(User.class, 1l);
//2> 創(chuàng)建公關角色
Role r = new Role();
r.setRole_name("男公關");
//3> 將角色添加到用戶中
user.getRoles().add(r);
//4> 將角色轉換為持久化
//session.save(r);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
@Test
//為郝強勇解除一個角色
public void fun4(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 開啟事務
Transaction tx = session.beginTransaction();
//-------------------------------------------------
//3操作
//1> 獲得郝強勇用戶
User user = session.get(User.class, 1l);
//2> 獲得要操作的角色對象(保潔,保安)
Role r1 = session.get(Role.class, 1l);
Role r2 = session.get(Role.class, 2l);
//3> 將角色從用戶的角色集合中移除
user.getRoles().remove(r1);
user.getRoles().remove(r2);
//-------------------------------------------------
//4提交事務
tx.commit();
//5關閉資源
session.close();
}
}