Hibernate 多對多的增刪改查。
阿新 • • 發佈:2018-12-09
inverse
Hibernate 多對多的增刪改查你得先了解inverse功能作用。
百度文件:
Inverse是hibernate雙向關係中的基本概念。inverse的真正作用就是指定由哪一方來維護之間的關聯關係。當一方中指定了“inverse=false”(預設),那麼那一方就有責任負責之間的關聯關係。
Hibernate僅僅按照主控方物件的狀態的變化來同步更新資料庫。按照原來的對映文 件,people.getAddresses().add(address),即主控方物件的狀態發生了改變,因此資料庫會跟著物件狀態的變化來同步更新 資料庫;而address.setPeople(people),即被控方物件的狀態發生了改變,它是不能觸發物件和資料庫的同步更新的。
下面直接上程式碼(簡單的五表許可權):
實體類:
Menu 實體類:
package com.zking.entity; import java.util.HashSet; import java.util.Set; import java.util.UUID; public class Menu { private String mid=String.valueOf(UUID.randomUUID());; private String mname; private transient Set<Role> sr=new HashSet<>(); public Menu() { super(); // TODO Auto-generated constructor stub } public Menu(String mid, String mname, Set<Role> sr) { super(); this.mid = mid; this.mname = mname; this.sr = sr; } public String getMid() { return mid; } public void setMid(String mid) { this.mid = mid; } public String getMname() { return mname; } public void setMname(String mname) { this.mname = mname; } public Set<Role> getSr() { return sr; } public void setSr(Set<Role> sr) { this.sr = sr; } }
Role實體類:
package com.zking.entity; import java.util.HashSet; import java.util.Set; import java.util.UUID; public class Role { private String rid=String.valueOf(UUID.randomUUID());; private String rname; private transient Set<Users> su=new HashSet<>(); private Set<Menu> sm=new HashSet<>(); public Role() { super(); // TODO Auto-generated constructor stub } public Role(String rid, String rname, Set<Users> su, Set<Menu> sm) { super(); this.rid = rid; this.rname = rname; this.su = su; this.sm = sm; } public String getRid() { return rid; } public void setRid(String rid) { this.rid = rid; } public String getRname() { return rname; } public void setRname(String rname) { this.rname = rname; } public Set<Users> getSu() { return su; } public void setSu(Set<Users> su) { this.su = su; } public Set<Menu> getSm() { return sm; } public void setSm(Set<Menu> sm) { this.sm = sm; } }
Users實體類:
package com.zking.entity;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class Users {
private String uid=String.valueOf(UUID.randomUUID());
private String uname;
private Set<Role> sr=new HashSet<>();
public Users() {
super();
// TODO Auto-generated constructor stub
}
public Users(String uid, String uname, Set<Role> sr) {
super();
this.uid = uid;
this.uname = uname;
this.sr = sr;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Set<Role> getSr() {
return sr;
}
public void setSr(Set<Role> sr) {
this.sr = sr;
}
}
實體類HBM.XML的文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-9-11 11:25:08 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.zking.entity.Menu" table="MENU">
<id name="mid" type="java.lang.String">
<column name="MID" />
<generator class="assigned" />
</id>
<property name="mname" type="java.lang.String">
<column name="MNAME" />
</property>
<set name="sr" table="rolemenu" inverse="true" lazy="false"
cascade="save-update">
<key column="mid"></key>
<many-to-many column="rid" class="com.zking.entity.Role"></many-to-many>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-9-11 11:25:08 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.zking.entity.Users" table="USERS">
<id name="uid" type="java.lang.String">
<column name="UID" />
<generator class="assigned" />
</id>
<property name="uname" type="java.lang.String">
<column name="UNAME" />
</property>
<set name="sr" table="usersrole" inverse="true" lazy="false"
cascade="save-update">
<key column="uid"></key>
<many-to-many class="com.zking.entity.Role" column="rid"></many-to-many>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-9-11 11:25:08 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.zking.entity.Role" table="ROLE">
<id name="rid" type="java.lang.String">
<column name="RID" />
<generator class="assigned" />
</id>
<property name="rname" type="java.lang.String">
<column name="RNAME" />
</property>
<set name="su" table="usersrole" inverse="false" lazy="false"
cascade="save-update">
<key column="rid"></key>
<many-to-many column="uid" class="com.zking.entity.Users"></many-to-many>
</set>
<set name="sm" table="rolemenu" inverse="false" lazy="false"
cascade="save-update">
<key column="rid"></key>
<many-to-many column="mid" class="com.zking.entity.Menu"></many-to-many>
</set>
</class>
</hibernate-mapping>
CFG.XML文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-9-11 11:25:08 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.zking.entity.Users" table="USERS">
<id name="uid" type="java.lang.String">
<column name="UID" />
<generator class="assigned" />
</id>
<property name="uname" type="java.lang.String">
<column name="UNAME" />
</property>
<set name="sr" table="usersrole" inverse="true" lazy="false"
cascade="save-update">
<key column="uid"></key>
<many-to-many class="com.zking.entity.Role" column="rid"></many-to-many>
</set>
</class>
</hibernate-mapping>
測試類:
package com.zking.test;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.alibaba.fastjson.JSON;
import com.zking.entity.Menu;
import com.zking.entity.Role;
import com.zking.entity.Users;
public class MyTest {
@Test
public void add() {
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//使用者
Users u1=new Users();
u1.setUname("admin");
Users u2=new Users();
u2.setUname("System");
//角色
Role r1=new Role();
r1.setRname("Admin");
Role r2=new Role();
r2.setRname("System_Admin");
//選單
Menu m1=new Menu();
m1.setMname("角色管理");
Menu m2=new Menu();
m2.setMname("檢視資訊");
//互設
u1.getSr().add(r1);
u2.getSr().add(r2);
r1.getSu().add(u1);
r2.getSu().add(u2);
r1.getSm().add(m1);
r2.getSm().add(m2);
//儲存
session.save(u1);
session.save(u2);
//提交
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void query() {
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
//h獲得當前使用者
Users u=session.get(Users.class, "265bdd39-5b11-4deb-9099-2b04a714ebe2");
//轉為JSON格式
String str=JSON.toJSONString(u);
//輸出Str
System.out.println(str);
}
@Test
public void delete() {
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 得到使用者
Users u = session.get(Users.class, "265bdd39-5b11-4deb-9099-2b04a714ebe2");
// 得到當前使用者所有許可權
Set<Role> sr = u.getSr();
// 迴圈SET集合
for (Role r : sr) {
// 判斷需要刪除的許可權
if (r.getRname().equals("Admin")) {
// 從許可權表中獲得使用者再刪除當前使用者
r.getSu().remove(u);
}
}
session.update(u);
transaction.commit();
session.close();
sessionFactory.close();
}
}
程式碼什麼的都在上面!
有什麼不足的地方還請各位多多指教!!!