hibernate笔记1
1. 数据库中的表关系
一对一、一对多(多对一)、多对一
2. 如何确立表中的表关系
一对多的关系如何实现:使用外键约束,一的方称为主表,多的方称为从表。
外键:从表中有一列,该列的取值除了null之外,只能来源于主表的主键,默认情况下,外键字段的值是可以重复的
多对多的表关系如何实现?
使用中间表,中间表只能有两个外键,引用两个多对多表的主键,不能有其他字段信息,中间表的主键采用联合主键
如果任何一个多方的表和中间表比较,都是一对多的关系。
一对一的表关系在数据库中如何实现?两种
1.建立外键的方式:
使用外键约束、唯一约束、非空约束,他是把外键约束加了唯一约束和非空约束,从而实现一对一。
2.使用主键的方式:
让其中一张表既是主键,又是外键
如何确定两张表之间的关系:找外键
3. 多表映射遵循的步骤
第一步:确立两张表之间的关系
第二步:在数据库中实现多对多的表关系的建立
第三步:在实体类中描述出两个实体类之间的关系
第四步:在映射配置中建立两张表和两个实体之间的关系
4. 一对多关系映射配置及其操作
实例:客户和联系人两张表
第一步:确立两张表之间的关系
一个客户可以包含多个联系人,多个联系人可以属于同一个客户,所以客户和联系人是多对多的关系
第二步:在数据库中实现多对多的表关系的建立
实现一对多的关系靠的是外键,客户是主表,联系人是从表,需要在联系人表中添加外键
第三步:在实体类中描述出两个实体类之间的关系
主表的实体类包含从表实体类的集合引用
<!-- 一对多主表实体的配置
标签
Set
用于配置set集合属性
属性:
name:指定实体类中set集合的属性名称
table:指定从表的名称,在一对多配置时候,可以不写
key
作用:用于映射外键字段
属性:
column:指定外键字段名称
one-to-many:
作用:用于建立一对多的映射配置
属性:
class:用于指定从表实体的名称
-->
<set name="linkmans" table="cust_linkman">
<key column="lkm_cust_id" ></key>
<one-to-many class="LinkMan"></one-to-many>
</set>
从表的实体类应该包含主表实体类的对象引用
<?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.wbs.domain">
<class name="LinkMan" table="cust_linkman">
<id name="lkmId" column="lkm_id">
<generator class="native"></generator>
</id>
<property name="lkmName" column="cust_lkmName"></property>
<property name="lkmGender" column="cust_lkmGender"></property>
<property name="lkmPhone" column="cust_lkmPhone"></property>
<property name="lkmMobile" column="cust_lkmMobile"></property>
<property name="lkmEmail" column="cust_lkmEmail"></property>
<property name="lkmPosition" column="cust_lkmPosition"></property>
<property name="lkmMemo" column="cust_lkmMemo"></property>
<!-- 一对多关系映射:从表实体的映射配置 -->
<!-- many-to-one建立一对多的映射配置
属性:
name 从表实体中引用实体对象引用的名称
class 指定这个属性对应的实体类名称
column 指定从表中外键字段的名称
-->
<many-to-one name="customer" class="Customer" column="lkm_cust_id"></many-to-one>
</class>
第四步:在映射配置中建立两张表和两个实体之间的关系

字符在数据库中用char或者varchar,但是在实体类中用String或者Criteria
- 1. 多对多关系映射配置及其操作
- 1. 确定两张表之间的关系
一个用户可以有多个角色
一个角色可以赋给多个角色
所以用于和角色之间是多对多
- 2. 数据库中两张表之间的关系建立
在数据库中实现多对多要靠中间表
中间表只能出现用户和角色的主键
- 3. 在实体类中描述出两个实体类之间的关系
各自包含对方一个集合引用
下边是多对多关系中的一个映射配置文件中的一部分
<!--
set
用于映射集合属性
属性:
name:用于指定集合名称
table:指的是中间表的名称(多对多的表中间一定要写)
key:用于映射外键字段
key中的属性column指的是当前实体在中间表的外键字段名称
many-to-many:用于映射多对多关系
属性:
column:对方在中间表中的外键字段名称
class:对方的实体类名称
-->
<set name="roles" table="user_role_ref">
<key column="user_id"></key>
<many-to-many class="SysRole" column="role_id"></many-to-many>
</set>

上边是数据库里面创建联合主键的方式
- 2. 进行多对多之间的保存操作
需要在任何一个set配置inverse=true,让某个实体类放弃维护关系,才可以正常的执行保存功能。
public class HibernateDemo1 {
/**
* 保存操作;
* 创建两个用户和三个角色
* 让1号用户具备具备1号和2号角色
* 让2号用户具备具备3号和2号角色
* 保存用户和角色
*/
@Test
public void test1(){
SysUser u1=new SysUser();
u1.setUserName("用户1");
SysUser u2=new SysUser();
u1.setUserName("用户2");
SysRole r1=new SysRole();
r1.setRoleName("角色1");
SysRole r2=new SysRole();
r1.setRoleName("角色2");
SysRole r3=new SysRole();
r1.setRoleName("角色3");
//建立双向关联关系
u1.getRoles().add(r1);
u1.getRoles().add(r2);
u2.getRoles().add(r2);
u2.getRoles().add(r3);
//再建立角色
r1.getUsers().add(u1);
r2.getUsers().add(u1);
r2.getUsers().add(u2);
r3.getUsers().add(u2);
Session s=HibernateUtils.getCurrentSession();
Transaction tx=s.beginTransaction();
s.save(r3);
s.save(r2);
s.save(r1);
s.save(u1);
s.save(u2);
tx.commit();
}
- 删除操作(实际开发禁止使用)
但是需要级联删除的时候需要配置级联的任一个配置文件的inverse=true,需要在两个多对多的实体类的配置文件中写出cascade=delete,不然不会级联删除
<set name="users" table="user_role_ref" inverse="true" cascade="delete">
<key column="role_id"></key>
<many-to-many class="SysUser" column="user_id"></many-to-many>
</set>
/**
* 删除操作
* 实际开发中多对多的双向级联删除是禁止的
*/
@Test
public void test2(){
Session s=HibernateUtils.getCurrentSession();
Transaction tx=s.beginTransaction();
//查询ID为103的用户
SysUser u=s.get(SysUser.class, 115L);
System.out.println(u);
s.delete(u);
tx.commit();
}
hibernate笔记1的更多相关文章
- 框架Hibernate笔记系列 基础Session
标题:框架Hibernate笔记 资料地址: 1. www.icoolxue.com 孔浩 1.背景简介 Hibenate是JBoss公司的产品.它是数据持久化的框架.Usually,我们使用JDBC ...
- hibernate笔记--cascade级联以及inverse属性
cascade : 不管是单向多对一还是一对多,或者是双向的一对多关系,在一的一端映射文件中有一个set标签,在多的一端有many-to-one标签,拿前几篇笔记里讲的Grade和Student举例, ...
- Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询
在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...
- Hibernate笔记一
背景 jdbc的优缺点 A:直接操作底层,提供了简单,便捷的访问数据库方法,跨平台比较强,灵活,可以写很多赋值的SQL语句:是最底层的数据库操作,所以效率比较高,Sql语句可以自己选择写,采用效率最高 ...
- hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存
二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...
- hibernate笔记--缓存机制之 一级缓存(session缓存)
一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...
- hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系
前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hi ...
- hibernate笔记--继承映射关系的三种实现方式
单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...
- hibernate笔记--单(双)向的多对多映射关系
在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...
- hibernate笔记--基于主键的单(双)向的一对一映射关系
上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...
随机推荐
- Android开发之EditText利用键盘跳转到下一个输入框
以前做项目的时候,从来没考虑过这些.这段时间公司内部用的一款APP,就出现了这个问题,在登录或者注册的时候,点击键盘的回车按钮,可以跳到下一个输入框的功能,这个属性一直也没记住,今天就把自己一直没记过 ...
- toMapFromStage layerDefinitions ClassBreakRenderer
class Map 方法 toMapFromStage 用于把屏幕坐标转换为地理坐标 public function toMapFromStage(stageX:Number, stageY:Numb ...
- matlab中repmat函数的用法(堆叠矩阵)
matlab中repmat函数的用法 B = repmat(A,m,n) B = repmat(A,[m n]) B = repmat(A,[m n p...]) 这是一个处理大矩阵且内容有重复时使用 ...
- JS实现“双色球”
需求: 双色球玩法简单介绍: “双色球”彩票投注区分为红色球号码区和蓝色球号码区.每注投注号码由6个红色球号码和1个蓝色球号码组成.红色球号码从1--33中选择:蓝色球号码从1--16中选择.程序要求 ...
- java之大文件断点续传
针对某些场景下,面对服务文件大,或者服务端服务器不稳定时使用该模块.功能代码如下: import java.io.File; import java.io.FileOutputStream; impo ...
- ring0 关于SSDTHook使用的绕过页面写保护的原理与实现
原博:http://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html 为了安全起见,Windows XP及其以后的系统将一些重要的内存页设 ...
- Django Request 与Response对象
Django使用请求和响应对象在系统中传递状态.当请求页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据. 然后Django加载适当的视图,将HttpRequest作为 ...
- python入门22 pymssql模块(python连接sql server查询)
安装 pip install pymssql 连接数据库 pymssql.connect() # coding:utf-8 import pymssql server = '192.168.8.1' ...
- Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用
1. 反射获取成员变量并且使用: (1)获取字节码文件对象: Class c = Class.forName("cn.itcast_01.Person"); (2) ...
- 【UVA1309】Sudoku(DLX)
点此看题面 大致题意: 让你填完整一个\(16*16\)的数独. 解题思路 我们知道,数独问题显然可以用\(DLX\)解决. 考虑对于一个数独,它要满足的要求为:每个位置都必须有数,每一行都必须有全部 ...