Hibernate关联关系映射

来源:互联网 发布:常州瑞声科技 知乎 编辑:程序博客网 时间:2024/04/27 01:52
     说到关联关系映射,首先我们需要了解一个名词 ORM ,全称是( Object Relational Mapping ),即对象关系映射。 ORM 的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。 Hibernate 正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作。
     映射定义( Mapping declaration ):对象和关系数据库之间的映射通常是用一个 XML 文档来定义的。这个映射文档被设计为易读的,并且可以手工修改。映射语言是以 Java 为中心,这意味着映射文档是按照持久化类的定义来创建的,而非表的定义。
     关联关系映射通常情况是最难配置正确的。在这个部分中,我们从单向关系映射开始,然后考虑双向关系映射,逐步讲解典型的案例。在所有的例子中,我们都使将用 Person 和 Address 。我们根据映射关系是否涉及连接表以及多样性( multiplicity )来划分关联类型。在传统的数据建模中,允许为 Null 值的外键被认为是一种不好的实践,因此我们所有的例子中都使用不允许为 Null 的外键。这并不是 Hibernate 的要求,即使你删除掉不允许为 Null 的约束, Hibernate 映射一样可以工作的很好。
     表结构
create table Person(personId bigint not null primary key, addressId bigint not null);create table Address(addressId bigint not null primary key);
一、单向关联( Unidirectional associations )
  1.多对一( many-to-one )
     单向 many-to-one 关联是最常见的单向关联关系。
<class name="Person"><id name="id" column="personId"><generator class="native"/></id><many-to-one name="address" column="addressId" not-null="true"/></class><class name="Address"><id name="id" column="addressId"><generator class="native"/></id></class>
  2.一对一( one-to-one )
     基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。
<class name="Person"><id name="id" column="personId"><generator class="native"/></id><many-to-one name="address" column="addressId" unique="true" not-null="true"/></class><class name="Address"><id name="id" column="addressId"><generator class="native"/></id></class>
  3. 一对多(one-to-many)
     基于外键关联的单向一对多关联是一种很少见的情况,不推荐使用它。
<class name="Person"><id name="id" column="personId"><generator class="native" /></id><set name="addresses"><key column="personId" not-null="true" /><one-to-many class="Address" /></set></class><class name="Address"><id name="id" column="addressId"><generator class="native" /></id></class>
二、双向关联(Bidirectional associations)
  1.一对多(one to many)/多对一(many to one)
     双向多对一关联 是最常见的关联关系。下面的例子解释了这种标准的父/子关联关系。
<class name="Person"><id name="id" column="personId"><generator class="native" /></id><many-to-one name="address" column="addressId" not-null="true" /></class><class name="Address"><id name="id" column="addressId"><generator class="native" /></id><set name="people" inverse="true"><key column="addressId" /><one-to-many class="Person" /></set></class>
     如果你使用 List(或者其他有序集合类),你需要设置外键对应的 key 列为 not null。Hibernate 将从集合端管理关联,维护每个元素的索引,并通过设置 update="false" 和 insert="false" 来对另一端反向操作。
  2. 一对一(One-to-one)
     基于外键关联的双向一对一关联也很常见。
<class name="Person"><id name="id" column="personId"><generator class="native" /></id><many-to-one name="address" column="addressId" unique="true"not-null="true" /></class><class name="Address"><id name="id" column="addressId"><generator class="native" /></id><one-to-one name="person" property-ref="address" /></class>
  3. 多对多(many-to-many)
     下面是一个双向多对多关联的例子。
create table Person ( personId bigint not null primary key )create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key(personId, addressId) )create table Address ( addressId bigint not null primary key )
<class name="Person"><id name="id" column="personId"><generator class="native" /></id><set name="addresses" table="PersonAddress"><key column="personId" /><many-to-many column="addressId" class="Address" /></set></class><class name="Address"><id name="id" column="addressId"><generator class="native" /></id><set name="people" inverse="true" table="PersonAddress"><key column="addressId" /><many-to-many column="personId" class="Person" /></set></class>





2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手臂和膝盖摔烂了好痛?怎么办 结扎一个月后坐太久腰酸怎么办 杠铃深蹲肩关节背不过去怎么办 QQ音乐在别的地方停不了歌怎么办 孕8周胎儿发育变慢怎么办 8个月宝宝肋张力高怎么办 术后5个月左手张力高怎么办 宝宝4个月体检四肢张力稍高怎么办 上腹绷紧大便酸臭酸臭的怎么办 小学生从双杠上摔下来会怎么办 去健身房碰到教练让你报私教怎么办 提踵把小腿练粗了怎么办 健身后两个小腿不一边粗怎么办 宿舍床上隔段时间有虫子怎么办 b2驾照实习证扣6分怎么办 健身房有个教练想撩我怎么办 学车跟校长投诉了教练怎么办 打架把眼睛打肿怎么办属于什么伤 罗马椅有点高做不了山羊挺身怎么办 节食一周后暴食肚子胀的难受怎么办 健身教练和会员聊天说错肌肉怎么办 两个月宝宝吃奶老是呛到怎么办 怀孕六个月体重一天增加两斤怎么办 备孕同房后一直乳头立起来怎么办 夏天出汉内衣老是湿的怎么办 大腿旁边长了红色的癣怎么办 跑步膝盖疼怎么办能不能再跑了 两周宝宝剧烈运动后咳嗽怎么办 bra的M有点紧L有点宽怎么办 穿吊带总是会露出来左胸罩杯怎么办 生小孩后腰部有一圈黑色勒痕怎么办 新买的饮水机热水口出水小怎么办 新买的饮水机热水口不出水怎么办 平胸没有适合自己的内衣怎么办 售楼小姐穿坏的丝袜都怎么办了 蛋白粉一天喝十克补不起来怎么办 跑步时没有卸妆毛孔堵塞了怎么办 自己做的葡萄酒太甜了怎么办 健身馆碰到一个帅的健身教练怎么办 随着年龄的增长脖子越来越短怎么办 安装软件时解析包出现问题怎么办