本文主要是介绍hibernate之表关系中的多对多,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
多对多示例:
多对多和一对多基本相同,配置文件稍有区别,需要指定中间表,和中间表中两表的外键
注意的是:多对多两方同时维护关系,会导致中间表中插入重复数据。而一对多两方同时维护关系,只会导致多余的sql(维护关系实质在代码中指:setCustomer(customer),customer.getLinkMens().add(linkMan),这些建立对象关联的代码)
多对多JavaBean文件:User.java
public class User {
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private Set<Role> roles = new HashSet<Role>(); //表达多对多
//省略了get和set...
多对多映射文件:User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example.domain" >
<class name="User" table="sys_user" >
<id name="user_id" >
<generator class="native"></generator>
</id>
<property name="user_code" ></property>
<property name="user_name" ></property>
<property name="user_password" ></property>
name: 集合变量名 table: 中间表名
Key标签的column:自己的外键
<set name="roles" table="sys_user_role" cascade="save-update" >
<key column="user_id" ></key>
<many-to-many class="Role" column="role_id" ></many-to-many>
</set>
</class>
</hibernate-mapping>
多对多JavaBean文件:Role.java
public class Role {
private Long role_id;
private String role_name;
private String role_memo;
private Set<User> users = new HashSet<User>();//维护多对多
//省略set和get方法
多对多映射文件:Role.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example.domain" >
<class name="Role" table="sys_role" >
<id name="role_id" >
<generator class="native"></generator>
</id>
<property name="role_name" ></property>
<property name="role_memo" ></property>
<--inverse="true" 表示Role放弃维护外键-->
<set name="users" table="sys_user_role" inverse="true" >
<key column="role_id" ></key>
<many-to-many class="User" column="user_id" ></many-to-many>
</set>
</class>
</hibernate-mapping>
多对多测试代码:
public class Demo {
@Test
//保存用户以及其关联的角色:注意要单方关联,双方关联会插入相同的数据到表中
public void fun1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//创建两个 User
User u1 = new User();
u1.setUser_name("用户1");
User u2 = new User();
u2.setUser_name("用户2");
//创建两个 Role
Role r1 = new Role();
r1.setRole_name("角色1");
Role r2 = new Role();
r2.setRole_name("角色2");
//用户关联来维护关系
u1.getRoles().add(r1);
u1.getRoles().add(r2);
u2.getRoles().add(r1);
u2.getRoles().add(r2);
//角色表达关系:因为角色放弃了外键维护,故不会重复向中间表插入数据
r1.getUsers().add(u1);
r1.getUsers().add(u2);
r2.getUsers().add(u1);
r2.getUsers().add(u2);
//调用Save方法一次保存
session.save(u1);
session.save(u2);
session.save(r1);
session.save(r2);
tx.commit();
session.close();
}
@Test
//为用户新增一个角色
public void fun3(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
User user = session.get(User.class, 1l);
Role r = new Role();
r.setRole_name("角色3");
user.getRoles().add(r);//维护外键实质是:向中间表插入关联数据
tx.commit();
session.close();
}
@Test
//为用户解除关联的角色
public void fun4(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
User user = session.get(User.class, 1l);
Role r1 = session.get(Role.class, 1l);
Role r2 = session.get(Role.class, 5l);
user.getRoles().remove(r1);//实质是delete中间表的关联数据
user.getRoles().remove(r2);
tx.commit();
session.close();
}
}
这篇关于hibernate之表关系中的多对多的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!