1. 程式人生 > >Hibernate 多對多的增刪改查。

Hibernate 多對多的增刪改查。

                                              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();
	}
}

程式碼什麼的都在上面!

有什麼不足的地方還請各位多多指教!!!