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>();//维护多对多

//省略setget方法

多对多映射文件: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();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值