Hibernate(四)一对多映射关系(set映射自定义对象)
续set映射自定义对象的用法
element标签:使用在能直接映射到表中的hibernate支持的java类型数据
one-to-many、many-to-one:使用在映射自定义类中
- One to Many映射关系
- 单向多对一外键关联(XML/Annotation)(xml和annotation都实现了)
- 单向一对多外键关联(XML/Annotation) (xml和annotation都实现了)
- 双向一对多外键关联(XML/Annotation) (xml和annotation都实现了)
注: Project中使用XML/Annotation时应统一
一、单向多对一
例子:一个人有多本书,每本书对应一个人,能通过书查找修改人的信息,不能通过人查找修改书的信息,Book为多的一方,只需要在Book原有的xml中添加many-to-one映射自定义类
类属性变化:Book类中要添加User类的对象,并提供get和set方法,User类无需修改属性
- XML:
Book类
<hibernate-mapping><class name="entity.Book" table="hbn_bookr" ><many-to-one name="user" class="entity.User" column="user_id"/></class><!--name属性名,class属性对应的类位置,类名大写,column字段名-->
</hibernate-mapping>
- Annotation:
Book类
@ManyToOne()
@JoinColumn(name="user_id",referencedColumnName="id")
//name外键列的字段名,referencedColumnName是关联少的一方的属性名
private User user;
注:单向多对一注解如果不添加@JoinColumn(),新增字段名则会按默认的关联属性名_id
二、单向一对多
例子:一个人有多本书,每本书对应一个人,能通过人查找修改书,不能通过书查找修改人的信息,
类属性变化:User中要添加泛型为Book类的set集合,用来存储多个书的对象,提供get和set方法,Book类无需修改属性
- XML:
User类
<hibernate-mapping><class name="entity.User" table="hbn_user" ><set name="books"> <!--name属性名,class属性对应的类位置--><key column="uid"/> <!--比较特殊,会在多的一方添加外键列维护,取字段名为少的一方--><one-to-many class="entity.Book"/></set></class>
</hibernate-mapping>
- Annotation:
User类
@OneToMany()
@JoinColumn(name="uid")
private Set<Book> books = new HashSet<Book>();
//set不可存储重复的值,提前初始化,方便用get存值
注:单向一对多注解如果不添加@JoinColumn(),则会自动生成以"少的一方的表名_多的一方的表名"命名的表来维护关系,如hbn_user_hbn_book,如果添加注解,像上述代码,则仍然会在多的一方添加column维护关系
三、双向一对多:
例子:每本书对应一个人,一个人对应多本书,可相互查找并修改信息,主要多的一方维护,少的一方响应
类属性变化:Book类添加User属性,User类添加泛型为Book的set属性,提供get和set方法
- XML: 注意两个类的xml中的column都需要以少的一方命名(key标签和many-to-one标签加入的字段保持一致),否者会在多的一方表中产生两个字段列,造成冗余,因为单向一对多也是通过在多的一方添加外键列来维护关系的,可设置在一的一方inverse="true"让出管理关系权,让多的一方管理
Book类
<hibernate-mapping><class name="entity.Book" table="hbn_bookr" ><many-to-one name="user" class="entity.User" column="uid"/></class><!--name属性名,class属性对应的类位置,类名大写,column字段名-->
</hibernate-mapping>
User类
<hibernate-mapping><class name="entity.User" table="hbn_user" ><set name="books" inverse="true"> <!--name属性名--><key column="uid"/> <!--比较特殊,会在多的一方添加外键列维护,取字段名为少的一方--><one-to-many class="entity.Book" /><!--class属性对应的类位置--></set></class>
</hibernate-mapping>
- Annotation:
Book类
@ManyToOne()
@JoinColumn(name="uid",referencedColumnName="id")//在Book类的表中生成uid,是关联Userid的外键
private User user;
User类
@OneToMany(mappedBy="user") //相当于inverse=true,让出关系维护权给book类
private Set<Book> books = new HashSet<Book>();
注:单向关系的缺点还是比较明显的,比如一对多单向,多的那一方没有任何关于另一方的信息,多对一单向则是反之。所以正常使用时,双向一对多是最常用的,双方都有彼此的信息。
资料来源:
单向多对一映射
单向一对多映射和双向一对多映射
Hibernate(四)一对多映射关系(set映射自定义对象)相关推荐
- Hibernate(六)一对一映射关系
One to One 映射关系(只有当映射自定义对象时,才会用,hibernate支持的java类型都可直接设成属性,了解第一和第二种的xml即可) 基于外键的单向一对一 (xml和annotatio ...
- js自定义对象 (转)
原文地址:https://sjolzy.cn/js-custom-object.html 29 March 2010 9:53 Monday by 小屋 javascript进阶之对象篇 一,概述 在 ...
- hibernate中一对多关系的映射
昨天初次接触hibernate,仅仅弄懂了一对一关系的映射.今天学习了一天又有了新的收获,弄懂了一对多之间关系的映射. 一.一对多的关系映射 建立一对多关系关系的表的原则是将一的一方的主键加入到多的一 ...
- Hibernate本地SQL结果集转换为自定义POJO对象
Hibernate如果用于单表的增删改查,其方便性不言而喻,但很多时候我们需要进行关联查询.这时候Hibernate可能不是太方便了.好在Hibernate提供了本地SQL,允许我们手写SQL语句. ...
- hibernate中一对一关系映射
这篇文章讲述的是hibernate中一对一关系映射,如有错误或者不当之处还望各位大神批评指正. 一对一映射(外键关联) 目标 假设一个人对应养一只狗,一只狗只能由一个人来养,完成一对一相关操作. 类编 ...
- log4net进阶手札(四):保存自定义对象到oracle
有些时候,log4net内置的日志信息不能满足实际需要,在log4net中可以保存自定义对象,主要是通过扩展内置的两个类:PatternLayout类和PatternLayoutConverter类, ...
- Flask数据库模型之数据库模型关系反向映射(四)
Flask数据库关系反向映射 db.relationship 当前字段用于一对多或者多对多反向映射: 第一个参数是 映射向的模型名称 Secondary 参数 指向多对多的关系表 backref 参数 ...
- Js中自定义对象四种方式
Js中自定义对象四种方式 1 类似JAVA有参构造方式: 1.定义对象: function 对象(属性[age]){追加属性:如(this.age = age)[this代表当前对象的地址值的引用]追 ...
- 【Hibernate步步为营】--多对多映射详解
上篇文章详细讨论了一对多映射,在一对多映射中单向的关联映射会有很多问题,所以不建议使用如果非要采用一对多的映射的话可以考虑使用双向关联来优化之间的关系,一对多的映射其实质上是在一的一端使用<ma ...
最新文章
- java源码保护技术,sourceguard
- 拜读及分析Element源码-alert组件篇
- window msdn原版下载
- POJ1988 Cube Stacking
- c 5.6 mysql 配置文件_Windows系统中MySQL 5.6的配置文件(my.ini)修改方法_MySQL
- [Axios] 基于Promise封装属于自己的Ajax库
- java 校验的接口中的字符必须是半角的_初识Java,笔记1
- onclick控制元素显示与隐藏时,点击第一次无反应的原因
- 三星s9刷android原生6,【极光ROM】-【三星S9/S9+ G9600/G9650-845】-【V22.0 Android-Q-TF6】...
- 【KAFKA】使用星环大数据平台客户端操作kafka的topic
- iPhone手机开启定位权限后,仍然无法定位
- jlink接口定义接stm32_图解Stm32使用jlink程序时jtag接口(SW和JTAG模式)的简化方法
- 手把手教你获取一年免费通配符泛域名SSL证书
- python开发本地WEB项目
- 数字华容道 逆时针
- Java String、StringBuffer、StringBuilder类解析
- java生成word几种解决方案
- Android使用DownLoadManager(下载管理器)更新版本
- istat menus 序列号
- 如何使步进电机旋转更平稳的方法