Hibernate的多对多关联关系映射

版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/84790785

创建三张表的数据模型如下

 创建实体类

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

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/84790785
今日推荐