【Hibernate】多对一关联映射
来源:互联网 发布:linux centos官网 编辑:程序博客网 时间:2024/06/01 08:12
hibernate提供了多种映射机制,创建映射文件要以.hbm.xml为后缀名,在映射文件中注册实体类,将实体类的属性添加到映射文件中,本篇博客介绍多对一关联映射,在介绍多对一关联映射前先简单的说一下映射的基本内容。
一、基本标签:
class标签:
name表示映射实体类,需要把值设置为转化成表的实体类的名称,在同步时会根据该属性查找相应的实体类。
table表示映射数据库的表的名称,如果要映射的表的名称和实体类名称不相同,使用该属性来指定映射的表,如果不存在的话会根据该属性值创建一个表。
id或property标签:
name:功能类似于class标签的name,值定实体类的映射属性名。
column:指定映射表的列名称,如果不存在将会创建。
type:指定映射到数据库中字段的数据类型。
generator:用来为一个持久类生成一个唯一的标识。
其他:
identity:返回的标识符是long, short 或者int类型的。类似于数据库的自增字段。
sequence:在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。在整个数据库中自增,而不是单个的表中自增,需要指定单个的表中自增需要添加属性。
uuid:用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串,类似于.NET时使用的guid。
native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个。灵活的方式,会根据使用的数据库来确定使用的标识类型,MySQL会选择identity,Oracle选择sequence。
assigned:手动为实体类制定一个标识id。这是 <generator>元素没有指定时的默认生成策略。
foreign:使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。
二、多对一关联映射
多对一关系映射的原理就是在多的一端加入一个外键,指向一的一端。就像用户和组之间的关系,一个组中可能有多个用户,多个用户可能属于一个组,我们可以将组号作为外键添加到用户表中,关系如下所示:
对象模型:
关系模型:
(1)直接映射
使用<many-to-one>标签,many指多的一端,one指少的一端,通常在多的一端使用这个标签。
User.hbm.xml中的<many-to-one>,name的值为User表的外键,为user.java中对应的外键属性值。代码如下:
<hibernate-mapping> <class name="com.hibernate.User" table="t_user"> <id name="id" type="java.lang.Long"> <column name="ID" /> <generator class="assigned" /> </id> <!-- name的值group为User.java中的一个对应的one中的一个属性,它会自动在表中生成一列,所以使用column对列进行了重命名 --> <many-to-one name="group" column="groupid"></many-to-one> </class> </hibernate-mapping>Group.hbm.xml代码:
<hibernate-mapping><class name="com.hibernate.Group" table="t_group"><id name="id"><generator class="native"/></id><property name="name"/></class></hibernate-mapping>User.java类代码,group属性为<many-to-one>的one一端的name值。
package com.bjpowernode.hibernate;public class User {private int id;private String name;private Group group;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Group getGroup() {return group;}public void setGroup(Group group) {this.group = group;}}
(2)级联映射
实现多对一关联映射还可以在<many-to-one>属性中添加cascade属性,赋值为save-update,这样只需要将两个user对象的Group属性设置为同一个group对象即可实现多对一的映射关系。
User.hbm.xml代码如下:
<hibernate-mapping> <class name="com.hibernate.User" table="t_user"> <id name="id" type="java.lang.Long"> <column name="ID" /> <generator class="assigned" /> </id> <!-- 级联修改表 --> <many-to-one name="group" column="groupid" cascade="save-update"></many-to-one> </class> </hibernate-mapping>
小结:
第一种实现方式没有采用Hibernate字段的的属性,支持增删改查,第二种级联修改则采用hibernate提供的方法,不支持查询。两种方法都需要讲<many一端的映射文件添加该标签,并将标签的name属性赋值为对应类中one一端的属性值。
这篇博客作为一个基础的总结,欢迎大家补充指正。
- Hibernate关联映射--多对一映射
- Hibernate关联关系映射(多对一关联映射)
- Hibernate多对一单向关联映射
- hibernate多对一关联映射
- hibernate多对一关联映射
- hibernate映射多对一关联
- hibernate:多对一单向关联映射
- hibernate多对一关联映射
- hibernate---->多对一关联映射
- Hibernate多对一映射单向关联
- hibernate 关联映射 多对一
- Hibernate多对一关联映射(单向)
- Hibernate多对一关联映射
- 【Hibernate】多对一关联映射
- 【Hibernate】多对一关联映射
- hibernate关联映射:多对一、一对一
- Hibernate 关联映射 之 多对多 关联(一)
- Hibernate 关联映射 之 多对多 关联(一)
- 人脸识别算法调研
- 服务端使用c++实现websocket协议解析及通信
- mlpy机器学习库的介绍
- Linux:UbuntuServer14.04.1 C++开发环境配置
- 一个日期时间段有交集求并集的问题
- 【Hibernate】多对一关联映射
- Conway’s Game of Life中看C++SSE2并行化计算
- JAVA接口
- 22-Oracle入门之总结
- [生存志] 第104节 吕览一字千金
- memcached的安装(win8.1 64)
- ASP.NET Aries 入门开发教程4:查询区的下拉配置
- Vue.js学习
- 【leetcode】114. Flatten Binary Tree to Linked List【java】