问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

hibernate有几种映射关系

发布网友 发布时间:2022-04-08 20:40

我来回答

1个回答

热心网友 时间:2022-04-08 22:10

Hibernate的关联关系映射大概有这么几种:

1、单向N-1

2、单向1-1

3、单向1-N

4、单向N-N

5、双向1-N

6、双向N-N

7、双向1-1

下面就对这七种关联关系映射进行一个简单的总结:

一、单向的多对一

看两个POJO

public class Person{

private int pid;

private String name;

private Address address;

...//生成相应的getter、setter方法

}

----------------------------------------

public class Address{

private int id;

private String detail;

...//生成相应的getter、setter方法

}

这里我们需要维护的关系是多个Person可以对应同一个地址,使用单向的N-1映射我们只需要在多的一端加入一个外键指向一的一端即可

**看配置文件

<class name="Person">

<id name="id">

<generator class="native"/>

</id>

...//部分字段配置省略

<many-to-one name="address" column="addressId"/>//关键配置

</class>

这样配置以后hibernate就会帮我们在多的一端(Person)添加一个外键addressId指向一的一端

二、单向的1-1(外键关联)

可以采用<many-to-one>标签,指定多的一端的unique=true,这样就*了多的一端的多重性唯一

通过这种手段映射一对一唯一外键关联

配置文件只需要修改为:

<many-to-one name="address" column="addressId" unique="true"/>

三、单向的1-N

**看代码,我们知道一个班级有多名学生,这就是一个典型的1-N关系

public class Classes {
private int id;
private String name;
private Set students;

...//生成相应的getter、setter方法

}

---------------------------------------------------------------------------

public class Student {
private int id;
private String name;

..//生成相应是getter、setter方法

}

**映射原理:一对多关联映射,在多的一端添加一个外键指向一的一端,它维护的关系是一指向多

**配置文件:

<class name="Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students">
<key column="classesid"/>//在一的一端添加的外键指向多的一端(默认情况下市主键匹配)
<one-to-many class="xxx.Student"/>//注意它维护的是一指向多的关系
</set>
</class>

四、双向1-N

上面提到了单向的1-N在一的一端添加的外键指向多的一端即可,对于双向的1-N则类似于N-N,集合元素中不使用<one-to-many>

元素映射关联属性,而使用<many-to-many>元素,但是为了保证一的一端,因此需要增加unique="true"属性

**配置,简单修改单向1-N的配置文件

<class name="xxx.Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students">
<key column="classesid"/>

<many-to-many class="xxx.Student" unique="true"/>
</set>
</class>

五、单向多对多

**先看两个POJO

public class User {
private int id;
private String name;
private Set roles;

..//生成相应的getter、setter方法

}

---------------------------------------------------------------------------

public class Role {
private int id;
private String name;

..//生成相应的getter、setter方法

}

现在需要映射这样的N-N关系,一个User可以有多个Role,而一个Role有可以被多个User所拥有

这样我们就可以将一个N-N关系拆分为两个N-1的关系

**看配置文件

<class name="xxx.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="xxx.Role" column="roleid"/>
</set>
</class>

这样我们的关系的明确了

t_user t_user_role t_role

id name < -------userid roleid ----- > id name

六、双向的多对多关系

双向的多对多映射需要在两边都增加集合元素,用于映射集合属性

修改上面的单向N-N映射

在Role中添加集合属性

public class Role {
private int id;
private String name;

privarte Set user

..//生成相应的getter、setter方法

}

修改配置文件

<class name="xxx.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="xxx.Role" column="roleid"/>
</set>
</class>

------------------------------------------------------------------------------------------------

<class name="xxx.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="users" table="t_user_role" order-by="userid">
<key column="roleid"/>
<many-to-many class="xxx.User" column="userid"/>
</set>
</class>

注意点:1、双向多对多关联两边都需要指定连接表的表名和外键列的列名

2、两个集合元素Set的table值必须指定,而且需要相同

七、双向的一对一关联

双向的1-1关联有两种形式:

1、基于外键的双向1-1关联

我们可以回想一下上面提到的单向1-1映射,它是有N-1的一个特例,只需要在<many-to-one>标签多的一端添加unique="true"属性就可以形成单向的1-1映射关系,那么该怎么样将这种映射改为双向的呢?

下面我们再举个例子:一个User必须要有一个唯一的identityId

首先创建两个POJO类

public class Person {

private int id;
private String name;
private IdentityId identityId;

..//生成相应的getter、setter方法

}

public class IdentityId {
private int id;
private String cardNo;
private Person person;

..//生成相应的getter、setter方法

}

**看配置文件

<class name="xxx.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="identityId" class="xxx.IdentityId" unique="true"/>
</class>

-----------------------------------------------------------------------------------

<class name="xxx.IdentityId" table="t_identity">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person" class="xxx.Person" property-ref="identityId"/>
</class>

注意:这里的property-ref属性为identity表明建立了从identity对象到person对象的关联.

因此只要调用identity持久化对象的getIdentityId()方法就可以导航到Person对象 由此可见:

Person对象和IdentityId对象之间为双向的关联关系person.getIdentityId().getPerson()

2、基于主键的1-1双向关联

上面的POJO类不需要有任何变化,我们只需要修改配置文件

<class name="xxx.Person" table="t_person">
<id name="id" column="ID">
<generator class="foreign">
<param name="property">identityId</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="identity" clsss="xxx.IdentityId" constrained="true"/>
</class>

注意:这里的constrained="true"表明Person表的主键ID同时作为外键参考IdentityId表

--------------------------------------------------------------------------------------

<class name="xxx.Identity" table="t_identity">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person" class="xxx.Person"/>
</class>

注意:这里Person表中ID既是主键同时还作为外键参照表IdentityId,因为使用了foreign标识符生成策略Hibernate就保证了Person

对象与关联的IdentityId对象共享一个主键

综上所述,hibernate的实体映射方式很灵活,如果我们使用hibernate映射得当将可以大大简化持久层数据的访问!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
饥荒巨鸟图腾有什么用 饥荒巨鸟图腾怎么激活 恐惧饥荒健康怎么回复 健康值系统详解 想在京东买32g内存卡,发个商品号给我吧 民族文化浅谈普米族的宗教信仰 iphone4s进入恢复模式后,过几十秒就自动关机 hdr10是什么意思(hdr10是什么) 郑州禧年化妆摄影学校的专业设置 乔迁择吉2022年属鸡4月最佳入新居日子? 变电站中110kv配电变压器最小多大容量? 中国移动用户怎么查飞信号和密码 中国移动飞信我电脑怎么登陆飞信老出现程序错误啊 http;//f10086·ch如何登录中国移动飞信 内存卡数据丢失用数据恢复会不会泄密 内存卡数据丢失了怎么办? 储存卡损坏文件丢失怎么办? 暖心爱的句子 心连心暖人心的句子 请问招商银行信用卡分期利息怎么计算? 送给女朋友的录音句子 你听过最暖心的一句情话是什么? 临沂拆废空调的招工吗? 刷招商银行7000元分12期还 一共要还多少钱啊 招商银行信用卡 现金分期7000元12期,每个月还多少,怎样合适? 我会一直在的,你可以一次又一次的向我确认怎么回答? QQ被改了密保手机怎么办,找也找不回 山东临沂海尔空调售后中心电话是多少? 号被盗了 密保手机被改了怎么找回? 谈恋爱突然没有话题了怎么办? 恋爱三个月和男朋友越来越没话说了怎么办? 电脑开机停留在屏保 状态的意思是什么 状态的英语翻译 状态用英语怎么说 状态的意思 关于状态的句子 “状态”是什么意思? 表示状态的动词有哪些,它们有什么用法(尤其在时态上) 状态的状态与过程 年满十六周岁办银行卡需要有自己身份证办的电话卡吗?是在满十六周岁第二天才可以办银行卡吗? 状态的态可以组什么词 Wifi密钥哪个好 物体的状态有哪些? 状态的状的词语 “状态词”的意思是什么? 一般我在户外搜到的WIFI的共享密钥应该是什么?有通用的吗 樱花XQB65-168洗衣机怎么换离合器 破解无线网络密匙的软件 我的世界匠魂生存中史莱姆树怎么撸 草酸根 C2O4 2- 的C、O的化合价各是多少? 常见酸根 化合价都要 化学式也要