Hibernate5.x表与表之间的关系操作代码实现

一、一对多操作(客户和联系人)

1、一对多基本实现步骤

第一步 创建两个实体类,客户和联系人

第二步 让两个实体类之间互相表示

(1)在客户实体类里面表示多个联系人

- 一个客户里面有多个联系人

(2)在联系人实体类里面表示所属客户

- 一个联系人只能属于一个客户

第三步 配置映射关系

(1)一般一个实体类对应一个映射文件

(2)把映射最基本配置完成

(3)在映射文件中,配置一对多关系

- 在客户映射文件中,表示所有联系人

 1 <?xml version="1.0" encoding="UTF-8"?>
 2
 3 <!-- hibernate入门 搭建hibernate环境 第一步 导入hibernate的jar包 -->
 4 <!-- 映射配置文件dtd约束 -->
 5 <!DOCTYPE hibernate-mapping PUBLIC
 6     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 7     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 8     <hibernate-mapping>
 9     <class name="com.cn.entity.Custom" table="t_custom">
10     <id name="cid" column="cid">
11     <generator class="native"></generator>
12     </id>
13     <property name="custName" column="custName"></property>
14     <property name="custLevel" column="custLevel"></property>
15     <property name="custSource" column="custSource"></property>
16     <property name="custPhone" column="custPhone"></property>
17     <property name="Mobile" column="Mobile"></property>
18     <!-- 在客户映射文件中,表示所有联系人,使用set标签表示所有联系人
19     set标签里面有name属性:属性值写在客户实体类里面表示联系人的set集合名称 -->
20     <!-- cascade属性:级联添加 级联删除 -->
21     <!-- batch-size:值越大发送语句越少 -->
22     <set name="setLinkMan" cascade="save-update,delete" batch-size="10">
23     <!-- 一对多建表,有外键
24     hibernate机制:双向维护外键,在一和多那一方都配置外键 column属性值:外键名称 -->
25     <key column="clid"></key>
26     <!-- 客户所有联系人,class里面写联系人实体类全路径 -->
27     <one-to-many class="com.cn.entity.LinkMan"/>
28     </set>
29     </class>
30     </hibernate-mapping>

- 在联系人映射文件中,表示所属客户

 1 <?xml version="1.0" encoding="UTF-8"?>
 2
 3 <!-- hibernate入门 搭建hibernate环境 第一步 导入hibernate的jar包 -->
 4 <!-- 映射配置文件dtd约束 -->
 5 <!-- 最好每一个实体类对应一个映射文件 -->
 6 <!DOCTYPE hibernate-mapping PUBLIC
 7     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 8     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 9     <hibernate-mapping>
10     <class name="com.cn.entity.LinkMan" table="t_linkMan">
11     <id name="lkm_id" column="lkm_id">
12     <generator class="native"></generator>
13     </id>
14     <property name="lkm_name" column="lkm_name"></property>
15     <property name="lkm_gender" column="lkm_gender"></property>
16     <property name="lkm_phone" column="lkm_phone"></property>
17
18     <!-- 表示联系人所属客户 name属性:因为在联系人实体类使用custom对象表示,写custom名称
19     class属性:custom全路径 column属性:外键名称 -->
20     <many-to-one name="custom" class="com.cn.entity.Custom" column="clid"></many-to-one>
21     </class>
22     </hibernate-mapping>

第四步 创建核心配置文件,把映射文件引入到核心配置文件中

2、一对多级联操作

1 级联保存:添加一个客户,为这个客户添加多个联系人

2 级联删除:删除某一个客户,这个客户里面的所有的联系人也删除

(1)添加客户,为这个客户添加一个联系人

① 复杂写法:

//级联添加
	@Test
	public void testAdd1() {
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction tx = null;
		try {
			sessionFactory = DUtils.getSessionFactory();
			session = DUtils.getSessionObject();
			//开启事务
			tx = session.beginTransaction();

			//创建客户和联系人对象
			Custom custom = new Custom();
			custom.setCustName("网易");
			custom.setCustLevel("vip");
			custom.setCustSource("网络传播");
			custom.setCustPhone("220");
			custom.setMobile("333");

			LinkMan linkman = new LinkMan();
			linkman.setLkm_name("mary");
			linkman.setLkm_gender("女");
			linkman.setLkm_phone("8888");

			//2在客户表示所有联系人 在联系人表示客户
			//建立客户对象和联系人对象关系
			//2.1 把联系人对象放到客户对象的set集合里面
			custom.getSetLinkMan().add(linkman);
			//2.2 把客户对象放到联系人里面
			linkman.setCustom(custom);
			//3 保存到数据库
			session.save(custom);
			session.save(linkman);
			//提交事务
			tx.commit();
		}catch(Exception e) {
			e.printStackTrace();
			//回滚事务
			tx.rollback();
		}
	}

②  简化写法

- 一般根据客户添加联系人

第一步 在客户映射文件中进行配置

- 在客户映射文件里面set标签进行配置

第二步 创建客户和联系人对象,只需要把联系人放到客户里面就可以了,最终只需要保存客户就可以了

2、删除某个客户,把客户里面所有的联系人删除

第一步 在客户映射文件set标签,进行配置

(1)使用属性cascade属性值 delete

第二步 在代码中直接删除客户

(1)根据id查询对象,调用session里面delete方法删除

第三步 执行过程

(1)根据id查询客户

(2)根据外键id值查询联系人

(3)把联系人外键设置为null

(4)删除联系人和客户

二、多对多操作(用户和角色)

时间: 2024-08-04 00:52:16

Hibernate5.x表与表之间的关系操作代码实现的相关文章

【Python基础知识】(31)Set之间的关系操作

1. ==:判断集合是否相等 2. issubset:是否为子集 3. issuperset:是否为父集 4. isdisjoint:判断是否存在相同元素,存在返回False,不存在返回True # 集合间的关系操作 s1 = {1, 2, 3, 4, 5, 6} s2 = {6, 5, 4, 3, 2, 1} # ==判断两个集合是否相等 print(s1 == s2) # 输出:True s3 = {7, 8, 9, 10} s4 = {1, 2, 3, 4, 5, 6, 7, 8} # i

求解?表空间,表,用户这三者之间的 关系与区别?

发表于: 2012-02-11 16:40:58 小弟初学oracle,但是在表空间,用户,表这三者之间的关系,有点模糊,希望大牛指导下! 更多0分享到:       对我有用[0] 丢个板砖[0] 引用 | 举报| 管理 回复次数:21 关注 dengnanyi 一棵老松树 本版等级: #1 得分:0回复于: 2012-02-11 16:55:59 表空间:一个数据库划分为一个或多个逻辑单位,该逻辑单位称为表空间(TABLESPACE).一个表空间可将相关的逻辑结构组合在一起.表:表(tabl

第四天,表与表之间的关系,一对多,多对多,查询

※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样)SHOW VARIABLES; //查看系统变量//查询字符编码相关的系统变量SHOW VARIABLES WHERE variable_name LIKE 'character%'; 解决MySQK的中文乱码:character_set_client,character_set_connection和character_set_results这三者必须一致(GBK,GB2312,UTF8这三者都可以,但若采用其中一种则3

MySQL---数据库从入门走上大神系列(四)-子查询、表与表之间的关系

本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系! 准备: 首先我们创建一列sex.再为部分行设置好值0(女)或者1(男): delete from stud where age=26; 删除年龄为26的行. update stud set sex='1' where saddress like '湖南%'; 将地址中湖南开头的人的的sex修改为1. update stud set sex='0' where age>=30 and sex is null;

mysql表与表之间的关系(多对多,一对多)

#创建数据库CREATE DATABASE day15;#使用USE day15;#创建表CREATE TABLE test1( id INT PRIMARY KEY AUTO_INCREMENT,#这是主键 num INT UNIQUE, #这个唯一键不起作用? NAME VARCHAR(22));#存入数据INSERT INTO test1(NAME) VALUES('aaa'); #删除数据但是不重置自动增长数DELETE FROM test1; #删除数据重置行数(相当于删除掉整个表,然

PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系

看PostgreSQL9的官方文档,我越看越迷糊,这表空间,数据库,模式,表,用户,角色之间的关系怎么在PostgreSQL里这么混乱呢?经过中午的一个小实验,我逐渐理清了个中来龙去脉.下面我来还原我的试验,并循序讲清其中关系. 首先,实验出角色与用户的关系    在PostgreSQL中,存在两个容易混淆的概念:角色/用户.之所以说这两个概念容易混淆,是因为对于PostgreSQL来说,这是完全相同的两个对象.唯一的区别是在创建的时候: 1.我用下面的psql创建了角色kanon:   CRE

PostgreSQL表空间、模式、表、用户/角色之间的关系

PostgreSQL表空间.模式.表.用户/角色之间的关系是本文我们主要要介绍的内容,表空间,数据库,模式,表,用户,角色之间的关系到底是怎样的呢?接下来我们就开始介绍这一过程. 实验出角色与用户的关系 在PostgreSQL中,存在两个容易混淆的概念:角色/用户.之所以说这两个概念容易混淆,是因为对于PostgreSQL来说,这是完全相同的两个对象.唯一的区别是在创建的时候: 1.我用下面的psql创建了角色kanon:CREATE ROLE kanon PASSWORD 'kanon';接着

表与表之间关系回顾

------------------siwuxie095 表与表之间关系回顾 1.一对多 (1) 1)场景:分类和商品的关系 2)描述:一个分类里面有多个商品,一个商品只能属于一个分类 (2) 1)场景:客户和联系人的关系 2)描述:一个客户里面有多个联系人,一个联系人只能属于一个客户 注意:这里的客户是公司级的,即 公司,联系人 即 公司里的员工,实 际上就是公司和员工的关系 (3)一对多建表:通过外键建立关系 在多的那一方创建字段作为外键,指向一的那一方的主键 客户: cid cname 1

事实表,维度,度量,指标之间的关系

事实表:每个数据仓库都包含一个或者多个事实数据表.事实数据表可能包含业务销售数据,如销售商品所产生的数据,与软件中实际表概念一样 维度:说明数据,维度是指可指定不同值的对象的描述性属性或特征.例如,地理位置的维度可以包括"纬度"."经度"或"城市名称"."城市名称"维度的值可以为"旧金山"."柏林"或"新加坡". 指标:衡量数据,指标是指可以按总数或比值衡量的具体维度