Hibernate组件映射

2023-05-16

转载自:点击打开链接

        在Hibernate中,component是某个实体的逻辑组成部分,它与实体的根本区别是没有oid(对象标识符),component是一个被包含的对象,它作为值类型被持久化,而非一个实体。

下面举两个例子说明其使用和配置:

1.以User和Address为例,一个User有id(Long类型)、name(String类型)、address地址(Address类型),其中Address类中没有id属性(即无对象标识符),则address就是User的一个component组件。

User持久化类:

public class User  {
	private Long id;
	private String name;
	private Address address;
	//省略set、get方法
}

组件类Address:
public class Address {//注意Address类中无id属性(Address并不会被映射为一张表)
	private String addressName;
	private String addressValue;
        //省略set、get方法
}

User.hbm.xml配置:
<hibernate-mapping>
	<class name="bean.User" table="users">
		<id name="id" column="id" type="long">
			<generator class="increment"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<component name="address" class="bean.Address">
			<property name="addressName" column="address_name"></property>
			<property name="addressValue" column="address_value"></property>
		</component>
	</class>
</hibernate-mapping>

说明:

(1).User类映射的表为users,id为其主键,name为User的一般属性,被映射为name字段。

(2).<component>指定User类的address为User的组件,address并不是一个可以直接映射为表字段的属性而是一个类对象,class指定类的名称,<component>的子元素<property>指定组件类的属性与users表字段的映射关系。

(3)不必为Address写一个Address.hbm.xml映射文件,因为Address是作为User的一部分即值类型而不是实体被持久化的,所以Address的属性会与User的其它属性一样被映射为users表中的字段,而不会将Address映射为单独的一个表。

(4)User与Address的关系是"整体与部分",也可以将他们表示为一对一关联关系,这样的话两者就是“平等"关系,那么Address就会被映射为单独的一张表(需要配置Address.hbm.xml文件)。

(5)users表的结构为:

保存User对象:

        	tx=session.beginTransaction();
        	User user=new User();
        	user.setName("zhangsan");
        	Address address=new Address();
        	address.setAddressName("HomeAddress");
        	address.setAddressValue("青岛");
        	user.setAddress(address);
        	session.save(user);
        	tx.commit();

执行的SQL语句为:

Hibernate: insert into users (name, address_name, address_value, id) values (?, ?, ?, ?)

2.若User可有多个地址,即User类中的address属性为Set<Address>类型时,配置如下:

持久化类User:

public class User  {
	private Long id;
	private String name;
	private Set<Address> address;
	//省略set、get方法
}

Address类不变。

配置User.hbm.xml:

	<class name="bean.User" table="users">
		<id name="id" column="id" type="long">
			<generator class="increment"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<!--注意<set>中并不是<one-to-many>而是<composite-element>-->
		<set name="address" table="address_table">
			<key column="user_id"></key>
			<composite-element class="bean.Address">
				<property name="addressName" column="address_name"></property>
				<property name="addressValue" column="address_value"></property>
			</composite-element>
		</set>
	</class>

说明:

(1)与一对多关联关系不同,<set>中使用的不是<one-to-many>而是<composite-element>,Hibernate会将User对象address属性(Set类型)中的所有元素映射到另外一张表中(显然users中的一个记录不能表示Set中的多个元素),table属性指定另一张表的名称为address_table,该表存放Set中的元素,并且该表中还有一个参照users表id的外键字段user_id。

(2)users表与address_table表的结构为:(使用Hibernate自动建表功能创建)

address_table表的各字段说明:

可以发现address_table表中并没有主键,只有user_id参照users表中的主键id。

保存User对象:

        	tx=session.beginTransaction();
        	User user=new User();
        	user.setName("zhangsan");
        	Address address=new Address();
        	address.setAddressName("HomeAddress");
        	address.setAddressValue("青岛");
        	Address address2=new Address();
        	address2.setAddressName("SchoolAddress");
        	address2.setAddressValue("北京");
        	user.setAddress(new HashSet<Address>());
        	user.getAddress().add(address);
        	user.getAddress().add(address2);
        	session.save(user);
        	tx.commit();

输出的SQL语句为:

Hibernate: insert into users (name, id) values (?, ?)  
Hibernate: insert into address_table (user_id, address_name, address_value) values (?, ?, ?)  
Hibernate: insert into address_table (user_id, address_name, address_value) values (?, ?, ?)  

address_table的内容:

(因为address_table表没有主键,所以在MySQL WorkBench中无法通过图形化界面添加记录,但是可以操纵SQL语句添加记录,例:


要插入记录的user_id必须为users表中存在的id(因为user_id参照users表的id),可使用update语句更改使表中存在相同的记录,下面会查询id为1L的User对象的Set中的Address对象以检验Hibernate是否会自动排除重复的元素以符合Set中无重复元素的原则。

查询User对象:

        	User u=(User)session.get(User.class, 1L);
        	Set<Address> address=u.getAddress();
        	for (Iterator iterator = address.iterator(); iterator.hasNext();) {
			                Address a = (Address) iterator.next();
			                System.out.println(a.getAddressName()+":"+a.getAddressValue());}

控制台输出:

Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_ from users user0_ where user0_.id=?
Hibernate: select address0_.user_id as user1_0_, address0_.address_name as address2_0_, address0_.address_value as address3_0_ from address_table address0_ where address0_.user_id=?
HomeAddress:青岛
HomeAddress:青岛
H:S
Hibernate: delete from address_table where user_id=? and address_name=? and address_value=?
Hibernate: delete from address_table where user_id=? and address_name=? and address_value=?
Hibernate: delete from address_table where user_id=? and address_name=? and address_value=?
Hibernate: insert into address_table (user_id, address_name, address_value) values (?, ?, ?)
Hibernate: insert into address_table (user_id, address_name, address_value) values (?, ?, ?)
Hibernate: insert into address_table (user_id, address_name, address_value) values (?, ?, ?)

可知,Hibernate并没有过滤掉多余的元素,对于输出的3条delete和insert语句,尚不知其机制,但我认为Hibernate没有过滤掉重复的元素是因为Address类中没有实现 hashCode() equals() 方法,使用MyEclipse在Address类中生成hashCode及equals方法后再执行上述查询语句:

控制台输出:

Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_ from users user0_ where user0_.id=?
Hibernate: select address0_.user_id as user1_0_, address0_.address_name as address2_0_, address0_.address_value as address3_0_ from address_table address0_ where address0_.user_id=?
HomeAddress:青岛
H:S

可知Hibernate已将多余的重复元素排除。


转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8706555


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate组件映射 的相关文章

  • PHP实现页面静态化——局部动态化

    上回说到 xff1a PHP实现页面静态化 全部纯静态化 这次实现PHP的局部动态化 xff0c 也就是说静态化的页面存在 动态 过程 xff0c 结合全部静态化技术 43 Ajax技术实现局部动态化 xff0c 局部更新页面 在上文的数据
  • CSS3的过渡 transition

    这里只考虑 chrome 的兼容 transition html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 3
  • CSS3中的3D旋转 rotate、3D位移 translate

    这里只考虑 chrome 的兼容 3DrotateDemo html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8
  • CSS3让登陆面板旋转起来

    这里只考虑chrome的兼容 LoginRotate html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34
  • CSS3 卡片翻转(transform)

    这里只考虑chrome的兼容 card1 html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt
  • 他们的CSS3 3D正方体

    摘自 xff1a 程旭元 所分享的程序 效果图如下 xff1a cube html lt DOCTYPE html gt lt html lang 61 34 zh CN 34 gt lt head gt lt title gt 3D正方体
  • html自定义复选框

    自定义复选框的素材 xff1a icon check circle png icon checked png checkbox html xff08 为了方便起见 xff0c 这里使用到了jQuery xff09 lt DOCTYPE ht
  • CSS3的基本介绍

    知识点记录 xff1a 1 圆角效果 border radius 如 xff1a border radius 10px 所有角都使用半径为10px 的圆角 border radius 5px 4px 3px 2px 四个半径值分别是左上角
  • CSS3选择器(上)

    1 属性选择器 E att 61 val 选择匹配元素 E xff0c 且 E元素定义了属性 att xff0c 其属性值以 val开头的任何字符串 E att 61 val 选择匹配元素 E xff0c 且 E元素定义了属性 att xf
  • CSS3实现曲线阴影和翘边阴影

    效果图如下 xff1a index html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt ti
  • THINKPHP 数据操作方法

    一 ThinkPHP Insert 添加数据 ThinkPHP 内置的 add 方法用于向数据表添加数据 xff0c 相当于 SQL 中的 INSERT INTO 行为 添加数据 add 方法是 CURD xff08 Create Upda
  • PHP文件上传的实现及其介绍

    关于实现及介绍在程序注释中 提交文件的页面 xff1a xff08 可以分别提交到doAction php doAction1 php doAction2 php进行测试 xff09 upload php lt doctype html g
  • PHP单文件上传的过程化函数封装

    提交文件的页面 xff1a upload php lt doctype html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt
  • PHP的单个文件上传、多个单文件上传、多文件上传

    单文件上传 upload1 php lt doctype html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title g
  • PHP实现单文件上传、多个单文件上传、多文件上传的过程化封装

    上回提到 PHP的单个文件上传 多个单文件上传 多文件上传 这里给出 三种方式的统一实现 下面先给出各种方式的文件提交页面 xff1a 单个文件上传 upload1 php lt doctype html gt lt html lang 6
  • PHP的单文件上传类

    提交单文件的页面 upload php lt doctype html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title
  • PHP的多文件上传类

    提交表单的页面 upload php lt doctype html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title
  • Nginx负载均衡配置实例详解

    转载自 xff1a http www php100 com html program nginx 2013 0905 5525 html 负载均衡是我们大流量网站要做的一个东西 xff0c 下面我来给大家介绍在Nginx服务器上进行负载均衡
  • 基于Bootstrap使用jQuery实现简单可编辑表格

    editTable js 提供编辑表格当前行 添加一行 删除当前行的操作 xff0c 其中可以设置参数 xff0c 如 xff1a operatePos 用于设置放置操作的列 xff0c 从0开始 xff0c 1表示以最后一列作为放置操作的
  • ThinkPHP 大D方法思想下的JDBC操作数据库D类

    这里我封装出来的D 类 xff0c 是根据 ThinkPHP 中的 D 方法中做出来的 xff0c 其中有些出入的地方 xff0c 我进行了一些个性化的修正 xff0c 如 xff1a ThinkPHP 中操作数据库时 xff0c 需要在配

随机推荐

  • 基于MVC设计模式实现简单PHP框架(雏形)-初期

    xff08 记住 xff1a 这里只是提供思考的过程 xff09 其实这里只是一个我们课的Web实验 课程设计题目统计系统 xff0c 在做实验的过程中起初只是想往MVC靠拢而已 xff0c 却不知不觉地 实现 了基于MVC的简单框架的雏形
  • Rocketmq入门介绍

    目录 一 Rocketmq优势 二 Rocketmq与其他MQ对比 三 MQ基本概念 四 RocketMQ的4个组件 五 集群部署结构 工作流程 xff1a 模块功能特性 xff1a Nameserver Broker 生产者 Produc
  • 我的简单PHP框架——LabPHP

    就我上次提到的 基于MVC设计模式实现简单PHP框架 xff08 雏形 xff09 初期 这次列出我实现的LabPHP简易框架 xff0c 该框架中没有使用任何的模板引擎 xff0c 所以说要在模板中使用到php变量的话 xff0c 仍然需
  • 我的LabPHP框架的Demo应用——课程设计题目统计系统

    1 界面制作 xff08 为了方便起见 xff0c 这里我采用了Bootstrap 框架制作界面 xff09 xff1b 2 数据库设计 xff0c 正确创建students 表 xff1b admin表 xff1a 3 项目目录结构如下
  • 基于Bootstrap使用jQuery实现输入框组input-group的添加与删除

    注意这里要求使用到Bootstrap框架的输入框组 xff0c 如 xff1a lt div class 61 34 row 34 gt lt div class 61 34 col lg 6 34 gt lt div class 61 3
  • 网页中时光轴的简单实现

    时光轴效果如下 xff1a 鼠标滑过当前项时 xff0c 左侧图标大小变大 xff1a index html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta
  • 伸缩自如的时光轴实现

    上回说到简单时间轴的实现 xff0c 这一次针对上回的实现的时光轴 xff0c 增加时光轴收起的功能 为了方便重用 xff0c 我分离css样式和js 使用过程中主要注意一下尽量使用css定义的时光轴样式即可 时光轴收起功能的实现过程可以查
  • 伸缩自如的时光轴实现——改进版

    上回讲到的是时光轴 伸缩自如 的实现 xff0c 如果基于响应式制作的话 xff0c 可能存在着许多潜在的BUG 如 xff1a 窗口变化时 xff0c 时光轴的 收起 和 展开 xff0c 都发生了一些变形 为此 xff0c 对原来的 t
  • 伸缩自如的时光轴实现_样式改版

    针对前几篇文章中实现的 伸缩自如 的时光轴 xff0c 对时光轴的样式进行又一次修改 xff0c 效果如下 xff1a 点击 收起 后 xff1a 修改后的 timeline css xff0c 如下 xff1a vertical time
  • ThinkPHP中的create方法与自动令牌验证

    转载自 xff1a Thinkphp中Create方法深入探究 ThinkPHP中的create方法与自动令牌验证实例教程 Thinkphp中Create方法深入探究 由于工作原因在thinkPHP的create 方法上遇到了问题 xff0
  • web安全之token和CSRF攻击

    上文我转载了两篇关于ThinkPHP令牌验证的文章 xff08 ThinkPHP中的create方法与自动令牌验证 xff09 其中提及到了 token xff0c 这里针对 token 的作用 xff0c 转载了另外两篇文章 xff08
  • java中的==、equals和hashCode以及hashCode生成

    转载自 xff1a xff08 点击打开链接 xff09 前言 java中 61 61 equals hashCode 都和对象的比较有关 xff0c 在java中这三者各有什么用处呢 xff0c 即java中为什么需要设计这三种对象的比较
  • javascript调用微信或QQ扫一扫

    项目里为了体验做的好点 xff0c 想直接通过js调用手机的扫一扫 xff1a 服务的用户主要是通过 xff1a 微信或QQ 之前使用过 微信或QQ的分享 腾讯移动WEB开发平台的 39 对外分享组件接口文档 39 http open mo
  • Java中的反射机制

    获取类的类类型的3种方式 xff0c 以及如何通过类的类类型创建实例对象 xff1f ClassDemo1 java package com reflect public class ClassDemo1 public static voi
  • Java中的自定义注解

    自定义注解 Description java xff08 这里自定义Description注解 xff09 package com ann test import java lang annotation Documented import
  • Java中自定义注解的应用

    来自 慕课网 的学习 我们可以使用自定义注解 xff0c 实现ORM xff0c 即对象 关系的映射 通过自定义注解 xff0c 定义对象对应数据表的属性 xff0c 如表名 xff0c 表字段等 Table java xff08 Tabl
  • Intellij IDEA下的第一个Hibernate项目

    参考 xff1a intellij配置hibernate自动生成hbm xml文件 从零开始用Intellij idea14创建hibernate项目 下面我要讲的创建方式 xff0c 可能更加原生态 xff0c 更加类似于Eclipse下
  • Intellij IDEA使用注解创建Hibernate项目中的OR映射类

    上回说到 xff1a Intellij IDEA下的第一个Hibernate项目 我们需要创建 对象到关系的映射配置文件 xff0c 如 entity hbm xml xff08 其中 entity 是我们将要创建的实体 xff09 下面讲
  • Hibernate中Blob对象类型的使用

    使用Intellij IDEA创建Hibernate项目 xff0c 目录结构如下 xff1a 其中 assets app png 为将要存储的照片 xff0c src hibernate cfg xml 为Hibernate的配置文件 x
  • Hibernate组件映射

    转载自 xff1a 点击打开链接 在Hibernate中 component 是某个实体的逻辑组成部分 xff0c 它与实体的根本区别是没有oid xff08 对象标识符 xff09 xff0c component是一个被包含的对象 它作为