版权声明:博客知识产权来源命运的信徒,切勿侵权 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();
}
}