- 浏览: 115380 次
- 来自: ...
文章分类
最新评论
-
xiangjun_yu:
2010年的时候短暂使用过三五个月的ftl 只能算入门级吧 现 ...
FreeMarker 1 概述() FMPP安装使用 -
远方的你:
谢谢,不错,学习了。
FreeMarker 1 概述() FMPP安装使用 -
talangniao:
http://blog.chinaunix.net/u2/83 ...
nginx+tomcat集群负载均衡(实现session复制) -
lzj0470:
怎么我测试了一下,不行呀
nginx+tomcat集群负载均衡(实现session复制) -
talangniao:
不好意思,看转载巴
struts2的新特性
http://www.iteye.com/topic/8900
How to use Hibernate @Any-related annotations?
http://stackoverflow.com/questions/217831/how-to-use-hibernate-any-related-annotations
hibernate annotation 使用@Any 跟下面等效果
Hibernate
中any元素的应用体会
关联(Associations)是Hibernate
核心概念之一,比较常用的有:
many-to-one, one-to-one, one-to-many, many-to-many
Hibernate
还提供了另外一种关联——异类关联(Heterogeneous Associations)
在Hibernate
Reference (cn) 2.1.6中是这样说明的:
<many-to-any>和<index-many-to-any>元素提供真正的异类关联。这些元素和<any>元素工作方式是同样的,他们都应该很少用到。
下面针对<any>元素,谈一些自己的体会。
一、什么时候需要<any>元素
持久类中“一个属性”关联“另外一个指定的
持久类”(几乎每个应用都有这种情况),多半会使用many-to-one, one-to-one这样的关联。映射到关系数据库中,也多半使用外键约束。
可能会遇到有这么一种特殊的情况,需要:持久类中“一个
属性”关联“另外一些
持久类”。
举个例子:Log类中使用logEntity属性关联一组业务持久类。(也就是说,在Log中记录不同业务类的实例对象)
如果使用many-to-one,则有很大的限制。首先,需要这些业务类都要继承一个超类,而且在数据库中必须有这个超类对应的表。在Hibernate
提供的三种继承映射策略中,只能使用前两种:
1、“每棵类继承树使用一个表(table per class hierarchy) ”
2、“每个子类一个表(table per subclass)”
第1种通常不大合适:所有的业务类映射为一张表,冗余过多,限制也多,增加一个业务类就需要修改表结构,不易扩展。
第2种的情况是:表的数量=业务表数量 + 一个超类表,子类表通过主键和超类表关联(所以实际上关系模型是一对一关联)。业务表数量比较多的时候,这种结构的性能和灵活性都有问题。
这时<any>元素就派上用场啦。
二、<any>元素的应用
1、类:
业务类:
- public class BizOne {
- private Long id;
- private String bizOneDescription;
- //Getters and Setters 省略
- }
- public class BizTwo {
- private Long id;
- private String bizTwoDescription;
- private Date createDate;
- //Getters and Setters 省略
- }
public class BizOne { private Long id; private String bizOneDescription; //Getters and Setters 省略 } public class BizTwo { private Long id; private String bizTwoDescription; private Date createDate; //Getters and Setters 省略 }
日志类:
- public class MyLog {
- private Long id;
- private Date logDate;
- private Object logEntity; //这就是<any>元素对应的属性。
- //Getters and Setter 省略
- }
public class MyLog { private Long id; private Date logDate; private Object logEntity; //这就是<any>元素对应的属性。 //Getters and Setter 省略 }
2、hbm.xml 和 表结构:
这里只给出MyLog的hbm.xml(BizOne, BizTwo很简单,不提了):
- <hibernate -mapping>
- <class name= "com.test.entity.MyLog" table= "MyLog" >
- <id name="id" column= "id" >
- <generator class = "native" />
- </id>
- <property name="logDate" />
- <any name="logEntity" meta-type= "string" id-type= "long" >
- <meta-value value="One" class = "com.test.entity.BizOne" />
- <meta-value value="Two" class = "com.test.entity.BizTwo" />
- <column name="entityMetaValue" length= "20" />
- <column name="entityId" />
- </any>
- </class >
- </hibernate -mapping>
<hibernate -mapping> <class name="com.test.entity.MyLog" table="MyLog"> <id name="id" column="id"> <generator class="native"/> </id> <property name="logDate"/> <any name="logEntity" meta-type="string" id-type="long"> <meta-value value="One" class="com.test.entity.BizOne"/> <meta-value value="Two" class="com.test.entity.BizTwo"/> <column name="entityMetaValue" length="20" /> <column name="entityId"/> </any> </class> </hibernate -mapping>
表结构(MySQL):
- create table MyLog (
- id BIGINT NOT NULL AUTO_INCREMENT,
- logDate datetime,
- entityMetaValue VARCHAR(20 );,
- entityId BIGINT,
- primary key (id);
- );
create table MyLog ( id BIGINT NOT NULL AUTO_INCREMENT, logDate datetime, entityMetaValue VARCHAR(20);, entityId BIGINT, primary key (id); );
对<any>元素中子元素和属性的理解,可以结合生成的表结构,及其表中的数据(见3):
name:
是持久类中属性名称。
meta-type:
是下面meta-value元素中value的类型,如"string","character"等。
id-type:
是引用类的主键类型。
meta-value元素中value:
该值将保存到数据库表中,用来标识其后的class,即引用的持久类。请参考下面的数据。
meta-value元素中class:
引用持久类的类全称。
第一个column:
保存上面value值的字段。
第二个column:
保存引用持久类的主键值的字段,它的类型是id-type对应到数据库中的字段类型。
3、记录日志的方法:
- public MyLog recordLog(Object biz);{
- MyLog log = new MyLog();;
- log.setLogDate(new Date(););;
- log.setLogEntity(biz);; //引用了传递过来的业务对象
- return getLogService();.save(log);; //保存log。我习惯用Spring+Hibernate 。
- }
public MyLog recordLog(Object biz);{
MyLog log = new MyLog();;
log.setLogDate(new Date(););;
log.setLogEntity(biz);; //引用了传递过来的业务对象
return getLogService();.save(log);; //保存log。我习惯用Spring+Hibernate
。
}
Hibernate
所保存的数据是这样:
-- --------------------------------- --------------- --------
id logDate entityMetaValue entityId
-- --------------------------------- --------------- --------
1 2004-11-15 20:48:52.211 One 1
2 2004-11-15 20:57:25.385 Two 2
3 2004-11-15 21:48:52.211 One 15
4 2004-11-15 22:51:15.185 Two 26
5 2004-11-15 23:27:55.123 Two 36
4、读取Log
- public MyLog readLog(Long id);{
- MyLog log = getLogService();.getLog(id);;
- Object biz = log.getLogEntity();;
- //...
- return log;
- }
public MyLog readLog(Long id);{ MyLog log = getLogService();.getLog(id);; Object biz = log.getLogEntity();; //... return log; }
用<any>所实现的关联,与<many-to-one>等关联的效果是相同的。例如,如果BizOne, BizTwo的lazy="true",则biz是个代理。
5、BizThree
如果增加了一个业务类BizThree,在MyLog.hbm.xml中只需增加一行:
- <meta-value value= "Three" class = "com.test.entity.BizThree" />
<meta-value value="Three" class="com.test.entity.BizThree"/>
6、限制
在<any>元素中需要指定id-type,这可能是<any>对所关联类的唯一限制了:所关联的类的主键类型必须相同。
三、再谈继承映射策略问题
上面提到了:如果为了让Log能够关联业务类,就要求业务类都要继承同一个超类,是不大合适的。不过,不合适的理由在于这个超类需要在数据库有相
应的表。不能说,业务类不能继承一个超类。实际上,很多应用中的业务类都有超类,而且根据情况实现一些接口。此时的继承映射策略是Hibernate
Reference中的第三种:每个具体类一个表(table per concrete
class)。上面MyLog中的logEntity的类型可以是更有意义的超类,如Entity,当然也可以是接口,不必是Object。这样,即使超
类在数据库中没有对应的表,照样可以实现关联。
四、彩
票
Hibernate
Reference中提到<any>元素的地方不是很多,但提到时,总不忘记说“应该很少用到”,“应该在非常特殊的情况下使用它”。可能从
全世界的角度看,使用<any>是低概率事件,但是如果遇到了,就是100%的概率了。因此,当你应用<any>的时候,别忘了
购买彩票。因为,与中奖同样的低概率事件——使用<any>——你已经碰到了,你的运气就来了,赶快买彩票吧,准能中奖!
五、感谢
感谢这个论坛!
感谢Hibernate
相关资料的译作者,尤其是Hibernate
Reference!
如果我所写的有不对的地方,请指出来。感谢!
发表评论
-
PL/SQL 中文乱码解决方案(转载)
2010-07-23 14:24 28051. 使用的是服务器上的,不是本机的Oracle,按下面做就可 ... -
jdbcTemplate分页
2010-05-06 16:49 1841public Page getNameByEndate() ... -
Trees in SQL
2010-02-27 10:54 1191http://intelligent-enterprise.i ... -
hibernate 排序结果
2009-12-18 09:43 2136PO实现hashCode()方法了没有?实现这个方法能够按方法 ... -
如何使用hibernate的event/eventlistener
2009-05-19 14:28 2690http://blog.csdn.net/guosydrago ... -
JPA + Hibernate 3 CRUD操作历史审计日志的解决方案(附源码)
2009-05-19 09:35 3499http://jeffreyhsu.iteye.com/blo ...
相关推荐
14. 性能提升:本部分可能包括如何通过合理的配置、查询优化、缓存使用等手段提升Hibernate应用的性能。 15. 工具箱指南:Hibernate提供了许多工具类和实用方法来简化开发,这部分会介绍这些工具的使用方法。 16. ...
《Hibernate中文参考手册》是Java开发领域中关于Hibernate框架的重要学习资源,主要涵盖了Hibernate的中文API及详尽的参考信息。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它极大地简化了Java应用程序对...
**标题与描述解析** 标题"Hibernate 中文api 等学习资料"暗示了这是一组针对...通过阅读和学习这些资料,开发者可以全面掌握Hibernate框架,并将其应用于实际项目中,提升Java应用的数据访问层开发效率和质量。
当删除对象时, Hibernate必须使用每一个字段的值来确定一条记录(在组合元素表中,没有单独的关键字段), 如果有为null的字段,这样做就不可能了。你必须作出一个选择,要么在组合元素中使用不能为空的属性,要么...
【Hibernate配置文件中映射元素详解】 在对象关系映射(ORM)框架Hibernate中,对象与数据库表之间的关联是通过一个XML配置文件来定义的。这个XML文件包含了映射元素,用于描述Java类如何转化为数据库中的表。映射...
通过对Hibernate配置文件中的各种元素进行深入了解,可以帮助开发者更好地掌握Hibernate的工作原理和配置技巧,从而更加高效地开发基于Hibernate的应用程序。希望本文能帮助您深入理解Hibernate配置文件元素的含义及...
**Hibernate中文API最新参考文档** Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化...通过深入学习和实践,开发者可以熟练地运用Hibernate解决实际项目中的数据持久化问题。
Hibernate Web应用的开发一般经过以下几个步骤: (1)创建数据库。 (2)将Hibernate所需的JAR包复制到WEB-INF/lib下。 (3)创建Hibernate的配置文件。 (4)利用Hibernate的第三方工具或Eclipse的有关插件从...
《Hibernate中文开发手册》是Java开发者的重要参考资料,它详尽地介绍了如何在Java应用程序中使用Hibernate框架进行对象关系映射(ORM)。Hibernate作为一款流行的开源ORM解决方案,极大地简化了数据库操作,使得...
接下来,书中会涉及如何在Tomcat环境下部署和运行Hibernate应用。Tomcat是一款轻量级的Web服务器和应用服务器,是许多小型到中型项目的首选。书中会指导读者配置Tomcat服务器,使其能够承载使用Hibernate的应用,并...
《Hibernate参考指南中文版》与《Hibernate中文手册》是学习Java领域中ORM(对象关系映射)框架Hibernate的重要参考资料。...通过深入学习和实践,开发者能够熟练地运用Hibernate提升Java应用的数据处理能力。
本文将深入解析List与Set在Hibernate中的映射机制,同时也会简要提及Map的配置方式,以便读者能够全面理解这些集合类型在Hibernate中的运用。 ### Hibernate中的List与Set映射 在Hibernate中,List和Set都是用来...
《Hibernate开发指南》则是一本实践性很强的书籍,它不仅包含了理论知识,还提供了大量的示例代码,帮助读者将所学应用到实际项目中。该书会详细讲解如何在实际开发环境中设置和使用Hibernate,如整合Spring框架、...
Hibernate是一款开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程方式来操作数据库...在实际开发中,结合API文档和指南,可以更好地理解和运用Hibernate的各种功能,从而提升项目的可扩展性和可维护性。
最后,文档可能会包含一些高级主题,比如缓存机制、性能优化、事件监听器以及拦截器等,这些都是提升Hibernate应用效率和扩展性的关键点。 总的来说,《Hibernate 中文参考文档》全面覆盖了Hibernate框架的基础到...
11. **性能优化**:文档还涵盖了如何优化Hibernate应用,如延迟加载、批处理更新、选择合适的检索策略等。 总的来说,《Hibernate 4.1.1中文文档》是学习和掌握Hibernate的重要资源,它包含了大量的示例代码和解释...
13. **性能优化**:提供一些最佳实践和技巧,如批处理、延迟加载、预加载等,以提高Hibernate应用的性能。 14. **其他高级特性**:如CGLIB和JPA支持、JMX监控、动态模型等。 通过《Hibernate3 CHM格式中文》,...
手册会以实例驱动的方式,帮助读者从零开始学习Hibernate,逐步掌握其核心概念和应用技巧,最终能够熟练地运用Hibernate框架进行数据持久化操作。 由于文档内容的OCR扫描可能造成部分内容识别错误或缺失,我们在...