Hibernate的多對多關聯關係對映
阿新 • • 發佈:2018-12-09
建立三張表的資料模型如下
建立實體類
package cn.com.dao; import java.util.HashSet; import java.util.Set; public class Sys_Role { private int role_id; private String role_name; private String role_memo; // 一個角色可以對應多個使用者 private Set<Sys_User> users = new HashSet<Sys_User>(); public int getRole_id() { return role_id; } public void setRole_id(int role_id) { this.role_id = role_id; } public String getRole_name() { return role_name; } public void setRole_name(String role_name) { this.role_name = role_name; } public String getRole_memo() { return role_memo; } public void setRole_memo(String role_memo) { this.role_memo = role_memo; } public Set<Sys_User> getUsers() { return users; } public void setUsers(Set<Sys_User> users) { this.users = users; } }
package cn.com.dao; import java.util.HashSet; import java.util.Set; public class Sys_User { private int user_id; private String user_code; private String user_name; private String user_password; private String user_state; // 一個使用者可以擁有多個角色 private Set<Sys_Role> roles = new HashSet<Sys_Role>(); public int getUser_id() { return user_id; } public void setUser_id(int user_id) { this.user_id = user_id; } public String getUser_code() { return user_code; } public void setUser_code(String user_code) { this.user_code = user_code; } public String getUser_name() { return user_name; } public void setUser_name(String user_name) { this.user_name = user_name; } public String getUser_password() { return user_password; } public void setUser_password(String user_password) { this.user_password = user_password; } public String getUser_state() { return user_state; } public void setUser_state(String user_state) { this.user_state = user_state; } public Set<Sys_Role> getRoles() { return roles; } public void setRoles(Set<Sys_Role> roles) { this.roles = roles; } }
Sys_role.hbm.xml
這裡需要注意區別
描述 | 一對多的關聯關係對映 | 多對多的關聯關係對映 |
<set name=""> | 相關聯的另一方的集合名稱 | 相關聯的另一方的集合名稱 |
<set table=""> | 無 | 中間表的mysql的表名稱 |
<key column=""> | 當前物件在相關聯的表中的外來鍵名稱 | 當前物件在中間表中的外來鍵名稱 |
<many-to-many class="" column=""> | 無 | 相關聯的另一方的類的全名稱; 相關聯的另一方在中間表中的外來鍵名稱 |
<one-to-many class=""> | 相關聯的另一方的類的全名稱 | 無 |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="cn.com.dao.Sys_Role" table="sys_role" catalog="lf">
<id name="role_id" column="role_id" type="int" length="255">
<generator class="assigned"></generator>
</id>
<property name="role_memo" column="role_memo" type="string" length="255"></property>
<property name="role_name" column="role_name" type="string" length="255"></property>
<!-- set集合 name="關聯的另一方的集合屬性" table="中間表的表名稱"-->
<set name="users" table="sys_user_role" >
<!-- key column="當前物件在中間表中的外來鍵名稱" -->
<key column="role_id" ></key>
<!-- class="關聯的另一方類的名稱" column="關聯的另一方類在中間表中的外來鍵名稱"-->
<many-to-many class="cn.com.dao.Sys_User" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Sys_User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="cn.com.dao.Sys_User" table="sys_user" catalog="lf">
<id name="user_id" column="user_id" type="int" length="255">
<generator class="assigned"></generator>
</id>
<property name="user_code" column="user_code" type="string" length="255"></property>
<property name="user_name" column="user_name" type="string" length="255"></property>
<property name="user_password" column="user_password" type="string" length="255"></property>
<property name="user_state" column="user_state" type="string" length="255"></property>
<!-- set集合 name="關聯另一方的集合屬性名稱" table="中間表的表名稱" -->
<set name="roles" table="sys_user_role" inverse="true">
<!-- key column="當前物件在中間表中的外來鍵的名稱" -->
<key column="user_id" ></key>
<!-- many-to-many class="關聯另一方的類全名稱 column="在中間表中另一方外來鍵的名稱"" -->
<many-to-many class="cn.com.dao.Sys_Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
把對映檔案新增到核心檔案中去
<mapping resource="cn/com/dao/Sys_Role.hbm.xml"/>
<mapping resource="cn/com/dao/Sys_User.hbm.xml"/>
測試類如下
一定要記住,多對多的關係中,一定要有一方選擇放棄對外來鍵的維護權
不然會報如下錯誤
org.hibernate.exception.ConstraintViolationException: could not execute statement
org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback
(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100
(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl
Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '11-3' for key 'PRIMARY'
package cn.com.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.com.dao.Sys_Role;
import cn.com.dao.Sys_User;
import cn.com.util.Hibernate_Utils;
public class Demo9 {
/*author:命運的信徒
* date:2018/12/04
* arm:hibernate多對多的關聯關係
*/
@Test
public void demo(){
Session session=Hibernate_Utils.openSession();
Transaction tx=session.beginTransaction();
Sys_Role role1=new Sys_Role();
role1.setRole_id(1);
role1.setRole_memo("相對上司而言的下屬");
role1.setRole_name("下屬");
Sys_Role role2=new Sys_Role();
role2.setRole_id(2);
role2.setRole_memo("相對下屬而言的上司");
role2.setRole_name("上司");
Sys_Role role3=new Sys_Role();
role3.setRole_id(3);
role3.setRole_memo("公司的人");
role3.setRole_name("員工");
Sys_User u1=new Sys_User();
u1.setUser_code("哈哈哈");
u1.setUser_id(12);
u1.setUser_name("小明");
u1.setUser_password("123");
u1.setUser_state("啟動");
Sys_User u2=new Sys_User();
u2.setUser_code("呵呵呵");
u2.setUser_id(11);
u2.setUser_name("小周");
u2.setUser_password("321");
u2.setUser_state("啟動");
u1.getRoles().add(role2);
u1.getRoles().add(role3);
u2.getRoles().add(role1);
u2.getRoles().add(role3);
role1.getUsers().add(u2);
role2.getUsers().add(u1);
role3.getUsers().add(u1);
role3.getUsers().add(u2);
//多對多的關係中,一定要有一方放棄對外來鍵的維護,如果都不放棄的話,會導致重複插入資料到資料庫中,由於唯一性,會導致報錯
session.save(u2);
session.save(u1);
session.save(role1);
session.save(role2);
session.save(role3);
tx.commit();
}
}