hibernate之表关系中的多对多

2024-06-03 00:48
文章标签 关系 hibernate 之表

本文主要是介绍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();

}

}

这篇关于hibernate之表关系中的多对多的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025573

相关文章

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

org.hibernate.hql.ast.QuerySyntaxException:is not mapped 异常总结

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [select u from User u where u.userName=:userName and u.password=:password] 上面的异常的抛出主要有几个方面:1、最容易想到的,就是你的from是实体类而不是表名,这个应该大家都知道,注意

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

数据依赖基础入门:函数依赖与数据库设计的关系

在数据库设计中,数据依赖 是一个重要的概念,它直接影响到数据库的结构和性能。函数依赖 作为数据依赖的一种,是规范化理论的基础,对数据库设计起着至关重要的作用。如果你是一名数据库设计的初学者,这篇文章将帮助你理解函数依赖及其在数据库设计中的应用。 什么是数据依赖? 数据依赖 是指同一关系中属性间的相互依赖和制约关系,它是数据库设计中语义的体现。在现实世界中,数据之间往往存在某种依赖关系,而这

c++ 和C语言的兼容性关系

C++ 和 C 语言有很高的兼容性,但也存在一些差异和限制。下面是它们的兼容性关系的详细介绍: 兼容性 C++ 是 C 的超集: C++ 语言设计为兼容 C 语言的语法和功能,大部分 C 代码可以在 C++ 编译器中编译运行。 标准库兼容性: C++ 标准库包含了 C 标准库的内容,如 stdio.h、stdlib.h、string.h 等头文件,但 C++ 的标准库也提供了额外的功能,如