- 浏览: 245587 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
javatozhang:
讲解的的确不错。很实用。
Hibernate数据拦截与事件监听 -
sjx19871109:
更正一个地方:<event type="pos ...
Hibernate search -
xifan:
你好,楼主。
mutable="false 好像是 ...
Hibernate持久化对象生命周期 -
leo_cao:
很好,很实用
Hibernate数据拦截与事件监听 -
fehly:
47816778 写道你这样不会出现number 的精度问题吗 ...
Hibernate Annotations
组件Components
除了粗粒度的对象模型设计(一个表映射成一个持久化类)之外,还可以采用细粒度的对象模型,吧一个表的映射成两个或者多个类。
被细化出来的类,可以称为组件(Component)
组件映射
组件映射的单向关联
组件映射的双向关联
组件集合映射
使用组件集合,可以让组件对象的集合依附于一个持久化对象上
本来说自己写的,网上看了看资料太全面了 就收集整理好了
Component这个概念在Hibernate中几处不同的地方为了不同的目的被重复使用.
Component是一个被包含的对象,它作为值类型被持久化,而非一个实体。“component(组件)”这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)举个例子, 你可以对人(Person)如以下这样来建模:
public class Person { private java.util.Date birthday; private Name name; private String key; public String getKey() { return key; } private void setKey(String key) { this.key=key; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } ...... ...... }
public class Name { char initial; String first; String last; public String getFirst() { return first; } void setFirst(String first) { this.first = first; } public String getLast() { return last; } void setLast(String last) { this.last = last; } public char getInitial() { return initial; } void setInitial(char initial) { this.initial = initial; } }
现在,姓名(Name)是作为人(Person)的一个组成部分。需要注意的是:需要对姓名 的持久化属性定义getter和setter方法,但是不需要实现任何的接口或申明标识符字段。
以下是这个例子的Hibernate映射文件:
<class name="eg.Person" table="person"> <id name="Key" column="pid" type="string"> <generator class="uuid.hex"/> </id> <property name="birthday" type="date"/> <component name="Name" class="eg.Name"> <!-- class attribute optional --> <property name="initial"/> <property name="first"/> <property name="last"/> </component> </class>
人员(Person)表中将包括pid, birthday, initial, first和 last等字段。
就像所有的值类型一样, Component不支持共享引用。Component的值为空从语义学上来讲是专有的。 每当 重新加载一个包含组件的对象,如果component的所有字段为空,那么将Hibernate将假定整个component为 空。对于绝大多数目的,这样假定是没有问题的。
Component的属性可以是Hibernate类型(包括Collections, many-to-one 关联, 以及其它Component 等等)。嵌套Component不应该作为特殊的应用被考虑(Nested components should not be considered an exotic usage)。 Hibernate趋向于支持设计细致(fine-grained)的对象模型。
<component> 元素还允许有 <parent>子元素 ,用来表明component类中的一个属性返回包含它的实体的引用。
<class name="eg.Person" table="person"> <id name="Key" column="pid" type="string"> <generator class="uuid.hex"/> </id> <property name="birthday" type="date"/> <component name="Name" class="eg.Name"> <parent name="namedPerson"/> <!-- reference back to the Person --> <property name="initial"/> <property name="first"/> <property name="last"/> </component> </class>
Hibernate支持component的集合(例如: 一个元素是“姓名”这种类型的数组)。 你可以使用<composite-element>标签替代<element>标签来定义你的component集合。
<set name="someNames" table="some_names" lazy="true"> <key column="id"/> <composite-element class="eg.Name"> <!-- class attribute required --> <property name="initial"/> <property name="first"/> <property name="last"/> </composite-element> </set>
注意,如果你决定定义一个元素是联合元素的Set,正确地实现equals()和hashCode()是非常重要的。
组合元素可以包含component但是不能包含集合。如果你的组合元素自身包含component, 必须使用<nested-composite-element>标签。这是一个相当特殊的案例 - 组合元素的集合自身可以包含component。 这个时候你就应该考虑一下使用one-to-many关联是否会更恰当。 尝试对这个组合元素重新建模为一个实体-但是需要注意的是,虽然Java模型和重新建模前 是一样的,关系模型和持久性语义上仍然存在轻微的区别。
请注意如果你使用<set>标签,一个组合元素的映射不支持可能为空的属性. 当删除对象时, Hibernate必须使用每一个字段的来确定一条记录(在组合元素表中,没有单个的关键字段), 如果有为null的字段,这样做就不可能了。你必须作出一个选择,要么在组合元素中使用不能为空的属性, 要么选择使用<list>, <map>,<bag> 或者 <idbag>而不是 <set>。
组合元素有个特别的案例,是组合元素可以包含一个<many-to-one> 元素。类似这样的映射允许你映射一个many-to-mang关联表作为组合元素额外的字段。(A mapping like this allows you to map extra columns of a many-to-many association table to the composite element class.) 接下来的的例子是从Order到Item的一个多对多的关联关系,而 purchaseDate, price 和 quantity 是Item的关联属性。
<class name="eg.Order" .... > .... <set name="purchasedItems" table="purchase_items" lazy="true"> <key column="order_id"> <composite-element class="eg.Purchase"> <property name="purchaseDate"/> <property name="price"/> <property name="quantity"/> <many-to-one name="item" class="eg.Item"/> <!-- class attribute is optional --> </composite-element> </set> </class>
即使三重或多重管理都是可能的:
<class name="eg.Order" .... > .... <set name="purchasedItems" table="purchase_items" lazy="true"> <key column="order_id"> <composite-element class="eg.OrderLine"> <many-to-one name="purchaseDetails" class="eg.Purchase"/> <many-to-one name="item" class="eg.Item"/> </composite-element> </set> </class>
在查询中,组合元素使用的语法是和关联到其他实体的语法一样的。
<composite-index>元素允许你映射一个Component类作为Map的key, 但是你必须确定你正确的在这个类中重写了hashCode() 和 equals()方法。
你可以使用一个component作为一个实体类的标识符。 你的component类必须满足以下要求:
-
它必须实现java.io.Serializable接口
-
它必须重新实现equals()和hashCode()方法, 始终和组合关键字在数据库中的概念保持一致
你不能使用一个IdentifierGenerator产生组合关键字。作为替代应用程序必 须分配它自己的标识符.
既然联合标识符必须在对象存储之前被分配,我们就不能使用标识符的unsaved-value来把刚刚新建的实例和在先前的session保存的实例区分开来。
如果你希望使用saveOrUpdate()或者级联保存/更新(cascading save / update),你应该实现 Interceptor.isUnsaved()。使用<composite-id> 标签(它和<component>标签有同样的属性和元素)代替<id>标签。 下面有个联合标识符类的定义:
<class name="eg.Foo" table"FOOS"> <composite-id name="compId" class="eg.FooCompositeID"> <key-property name="string"/> <key-property name="short"/> <key-property name="date" column="date_" type="date"/> </composite-id> <property name="name"/> .... </class>
这时候,任何到FOOS的外键也同样是联合的, 在你其他类的映射文件中也必须同样定义。 一个到Foo的定义应该像以下这样:
<many-to-one name="foo" class="eg.Foo"> <!-- the "class" attribute is optional, as usual --> <column name="foo_string"/> <column name="foo_short"/> <column name="foo_date"/> </many-to-one>
新的 <column> 标签同样被用于包含多个字段的自定义类型(This new columntag is also used by multi-column custom types)。 事实上在各个地方它都是一个可选的字段属性。要定义一个元素是Foo的集合类,要这样写:
<set name="foos"> <key column="owner_id"/> <many-to-many class="eg.Foo"> <column name="foo_string"/> <column name="foo_short"/> <column name="foo_date"/> </many-to-many> </set>
另一方面,<one-to-many>元素通常不定义字段.
如果 Foo 自己包含集合, 那么他们也需要使用联合外键。
<class name="eg.Foo"> .... .... <set name="dates" lazy="true"> <key> <!-- a collection inherits the composite key type --> <column name="foo_string"/> <column name="foo_short"/> <column name="foo_date"/> </key> <element column="foo_date" type="date"/> </set> </class>
你甚至可以映射Map类型的属性:
<dynamic-component name="userAttributes"> <property name="foo" column="FOO"/> <property name="bar" column="BAR"/> <many-to-one name="baz" class="eg.Baz" column="BAZ"/> </dynamic-component>
从<dynamic-component>映射的语义上来讲,它和<component>是相同的。 这种映射类型的优点在于通过修改映射文件,就可以具有在部署时检测真实属性的能力.(利用一个DOM解析器, 是有可能在运行时刻操作映射文件的。)
评论
组件映射的好处和作用到底是什么?
发表评论
-
Hibernate与Struts2,Spring
2010-04-25 19:23 1515Struts2 框架 Struts是Apache ... -
Hibernate search
2010-04-22 15:28 6170搜索引擎 全文搜索引 ... -
Hibernate Annotations
2010-04-21 14:54 6968在过去几年里,Hibernate不断发展,几乎成为Jav ... -
Hibernate性能优化
2010-04-20 16:25 1359使用dynamic-insert与dynamic-update ... -
Hibernate的缓存
2010-04-19 19:47 1989持久层缓存的级别 事务级别的缓存 应用(进程)级别的缓存 ... -
Hibernate数据拦截与事件监听
2010-04-17 19:33 6466拦截器(Interceptor)org.hibernate.I ... -
Hibernate过滤器
2010-04-16 17:31 1457Hibernate过滤器的概念 Hibernate过滤器类 ... -
Hibernate继承映射
2010-04-15 19:48 987继承映射 3种方式,继承关系映射到数据库的表中 1.继承关 ... -
Hibernate的事务管理
2010-04-14 20:00 1283数据库事务数据库的事务指的是把一系列的数据库操作组成一个单元, ... -
Native SQL查询
2010-04-13 23:15 1185HQL写的有点累有些东西 ... -
HQL查询
2010-04-13 20:46 1492Query接口Query类型与org.hibernate.Cr ... -
Criteria查询
2010-04-12 18:42 12331Hibernate的三种查询方式 1.HQL (Hibern ... -
映射多对多关联关系
2010-04-10 15:19 1325多对多单向关联 使用多对多关联,需要借助一个起中介作用的连接 ... -
映射一对一关联关系
2010-04-09 21:08 941共享主键关系 两个关联表使用相同的主键值 类: ... -
Hibernate映射多对一关联关系
2010-04-08 15:03 1419多对一的单向关联 表于表的关联可以分为一对一,一对多,多对一 ... -
Hibernate的集合映射
2010-04-06 15:31 1206Set 接口 set类型的对象,被加入的对象不能重复, ... -
浅谈OSIV与泛型DAO模式
2010-04-05 22:13 3561open session in view 简称 O ... -
java.lang.NoClassDefFoundError: org/hibernate/Session的异常
2010-03-22 15:15 7057今天写程序突然报这个错误,挺郁闷的,因为这个包是导入别人的(事 ... -
Hibernate持久化对象生命周期
2010-03-19 14:41 2302持久化对象生命周期 Persisten ... -
Hibernate标示符属性的生成策略
2010-03-18 16:53 1476标示符属性 Hibernate中的标示符属性,也可以称为Hi ...
相关推荐
自己学习hibernate的心得。这个文档很不错哦,很不错,很不错
主要介绍了Hibernate组件映射代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
NULL 博文链接:https://cdxs2.iteye.com/blog/1932569
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
022 component(组件)关联映射 023 复合主键 关联映射 024 其它 关联映射 025 hibernate 悲观锁、乐观锁 026 hibernate 操作树形结构 027 hibernate 查询语言(HQL) 028 hibernate 缓存(性能优化策略) 029 hibernate ...
\contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...
hibernate实体层设计+hibernate实体映射+hibernate复合组件
组件component映射(hibernate_component) 27 复合(联合)主键映射(hibernate_composite) 27 集合(collection)映像 (hibernate_collection) 28 Hibernate 对数据库的并发支持 30 悲观锁(hibernate_pessimistic...
11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 用UserType映射枚举类型 11.2.3 实现CompositeUserType接口 11.2.4 运行本节范例程序 11.3 操纵Blob和Clob类型数据 11.4 小结 11.5 思考题 第12章 ...
介绍HIBERNATE高级特性,组件映射,继承映射,事务和并发,拦截器,批量处理等.
包括:cfg配置、mapping配置、组件映射、事务配置、缓存配置 第四章:Hibernate开发 包括:使用Hibernate实现增删改查、HQL语句、条件查询、Native SQL、批量处理 第五章:关系映射 包括:集合映射、一对一、一对...
Hibernate 是一种OR/M(object relation mapping)对象关系映射工具,是一个可以自动的根据xml 完成 对象关系映射,并持久化到数据库的开源组件,是对JDBC 的封装,主要负责java 对象的持久化.。 对象序列化适应临时...
hibernate 中常用到的技术点,如hibernate的开发流程、hibernate中对象的三种状态、映射关系:一对一、一对多、多对多、组合映射、继承关系映射、组件映射、onetomanyList、一级缓存、二级缓存、查询HQL语言等。
嵌入式对象(又名组件) 2.2.2.4. 无注解之属性的默认值 2.2.. 映射主键属性 2.2.4. 映射继承关系 2.2.4.1. 每个类一张表 2.2.4.2. 每个类层次结构一张表 2.2.4.3. 连接的子类 2.2.4.4. 从父类继承的属性 2.2.5...
8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 (Collections of dependent objects) 8.3. 组件作为Map的索引(Components as Map indices ) 8.4. 组件作为联合...
4.4.2 映射组件 4.5 小结 第5章 继承和定制类型 5.1 映射类继承 5.1.1 每个带有隐式多态的具体类一张表 5.1.2 每个带有联合的具体类一张表 5.1.3 每个类层次结构一张表 5.1.4 每个...
每当Hibernate重新加载一个包含组件的对象,如果该组件的所有字段为空,Hibernate将假定整个组件为空。 在大多数情况下,这样假定应该是没有问题的。 组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联...
7、组件映射 8、继承映射 9、操作持久化数据 10、事务和并行 11、Hibernate查询语言 12、条件查询 13、原生SQL查询 14、性能提升 15、工具箱指南 16、示例:父子关系 17、示例:Weblog应用程序 18、示例:不同的映射...