`
drinkjava
  • 浏览: 21638 次
  • 性别: Icon_minigender_1
  • 来自: 0
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

为什么用Hibernate时一定要做关联映射?

阅读更多
  我用Hibernate也有半年了,感觉Hibernate的映射关系太复杂了,与懒性加载,反转控制等结合在一起,要想控制好,实非常人之所能。个人感觉,如果不用Hibernate的关联,就把它当作关系数据库来操作,使用和理解上都会方便不少,例如一个订单和产品的配置文件写成这样:
<hibernate-mapping>
<class name="db.Order" table="orders" catalog="sample">
<id name="id" type="java.lang.String">
<column name="ID" length="32" />
<generator class="uuid.hex" />
</id>
<property name="orderTitle" type="java.lang.String">
<column name="ORDER_TITLE" length="30" />
</property>
</class>
</hibernate-mapping>

<hibernate-mapping>
<class name="db.Product" table="products" catalog="sample">
<id name="id" type="java.lang.String">
<column name="ID" length="32" />
<generator class="uuid.hex" />
</id>
<property name="productTitle" type="java.lang.String">
<column name="PRODUCT_TITLE" length="30" />
</property>
<property name="orderId" type="java.lang.String">
<column name="ORDER_ID" length="32" />
</property>
</class>
</hibernate-mapping>
操作时:
Order o=new Order();
o.setOrderTitle("order1");
dao.saveOne(o);
Product p=new Product();
p.setProductTitle("product1");
p.setOrderId(o.getId());
dao.saveOne(p);
                  (HQL查询则仿照普通SQL中的写法,此处略)
这样一来,纯粹是用关系数据库的思想来使用Hibernate,一个类对应一个数据库表,表之间的约束交给数据库的键来控制, 这样一来,即得到了Hibernate的优点:不用手工写SQL,对象级别缓存,数据库可移植性,也不必费力地学习和理解它了,纯粹是一个薄薄的JDBC的包装; 缺点就是不能在HQL中写出"...object1.object2.object3..." 式的对象引用,而且关联表的加载要自已来维护,但我认为相对于理解它复杂的配置来说,这点牺牲还是值得的, Hibernate的高级特性当然没法用上了,但相比于直接用JDBC或用ibatis写SQL总要好得多,只要会关系数据库,就能立即上手,在新手多、工期短的项目中,可节省很多培训时间,而且对于后来维护者的要求也大大降低,请问我的这种想法是否可行?
分享到:
评论
27 楼 MR3CHEN 2012-06-14  
如果不写这个级联配置,在外连接应该怎么写HQL呢!?
例如左连接,

请个sample好吗!谢谢!
26 楼 心动音符 2012-01-06  
你见解的很对,其实现在外面很多公司也都是这么用的。hibernate的级联控制太过神话了。其实意义不大。而且现在很少有不会数据库的程序员。
  支持一记
25 楼 HenryYu 2008-05-08  
我支持你的观点,O/R映射框架都被神话了,在很多人心中动不得。其实,它解决实际问题的面还是相当窄的。在我的beetle j2ee框架中也实现一套jdbc持久层框架,它是基于微软原来的ado思想实现的,也支持常见o/r映射框架的对象自动装配等功能,我的设计主要从高效、简单、解决实际问题角度出发的,有兴趣可以参考
http://www.beetlesoft.net
24 楼 ardenliu 2008-05-07  
深有同感啊

http://www.iteye.com/topic/190554
23 楼 tianzhijie11 2007-07-30  
我现在也开始用hibernate做一个项目也,感觉到关联的麻烦和问题,其实我的用户表和用户的附加信息表有外键关联,但我的用户表和很多表都有关联,那其他的表查询的时候由于关联都会把用户的信息查出来,这样不是很影响性能 吗?而且查询出来是多于的,我原来一直是在使用ibatis的,觉得它很好,可以用修改SQL语句来提高性能,而且我不必在关联上多费脑筋,现在这个hibernate的关联,我真的是一头雾水,看了前面的发言,还是不能十分明白
22 楼 run_xiao 2007-07-14  
我觉得要视项目团队成员的水准和经验来看:

如果大多都不熟悉Hibernate的这些透明持久的特性,而且又缺乏OOD的经验,用Hibernate简单封装一下用起来也挺方便的
21 楼 drinkjava 2007-07-14  
lionheartkim 写道
我觉得你的帖子并没有什么意义,因为你的应用中只使用了Hibernate功能的一个子集,但是你觉得很好就ok了。但是你怎么知道Hibernate的功能充分运用的情况下效率不比你高呢?

  子集,对,是子集,但可惜的是这个子集的用法与Hiberante的正常用法可说是水火不相容,一个项目中是不可能同时用到两种用法的。这种用法强调的是简化配置(无手调自动生成),快速上手,完全基于传统的ER建模概念,如果不是用了一个Hibernate的名字的话,从理念上可以说完全和Hibernate一点关系没有,只不过目前还没有人把它从Hibernate中剥离开来而已。 不能因为用到Hibernate,就一定要向它的正统用法靠,实际上它们完全是不同的理念,不能相容的东西。
  至于Hibernate的功能、效率当然没什么好讲的,可那需要时间和经验去换取(学的不到家就随便乱用,结果会后患无穷),这种短平快且比较安全的用法,应该有它的适用人群,尤其是初学者。就好象用了ibatis,没有人会强迫你转到Hibernate,道理是一样的。
20 楼 lionheartkim 2007-07-12  
我觉得你的帖子并没有什么意义,因为你的应用中只使用了Hibernate功能的一个子集,但是你觉得很好就ok了。但是你怎么知道Hibernate的功能充分运用的情况下效率不比你高呢?
19 楼 drinkjava 2007-07-12  
再一个好处:PO转VO简单了,一个调用搞定! 那种一个属性套一个子属性,子属性下再套子属性的恶梦再不复存在了,可以放心地甩开OpenSessionInView了。
	public static List createListVO(List list) {
		try {
			List outputList = new ArrayList();
			for (Iterator i = list.iterator(); i.hasNext();) {
				Object obj = i.next();

				if (obj.getClass().isArray()) {
					Object[] o = (Object[]) obj;
					Object[] newo = new Object[o.length];
					for (int j = 0; j < o.length; j++) {
						newo[j] = (Class.forName(o[j].getClass().getName().replaceFirst(".po.", ".vo.") + "VO")).newInstance();
						BeanUtils.copyProperties(newo[j], o[j]);
					}
					outputList.add(newo);
				} else {
					Object newo = (Class.forName(obj.getClass().getName().replaceFirst(".po.", ".vo.") + "VO")).newInstance();
					BeanUtils.copyProperties(newo, obj);
					outputList.add(newo);
				}
			}
			return outputList;
		} catch (Exception ex) {
			log.error("ClassNotFoundException: ", ex);
			return null;
		}
	}
18 楼 yangzhihuan 2007-07-08  
我就觉得只要能解决问题,怎么用都没有关系,Hibernate的初衷是为了方便程序员,只要这样做是有效率(对于你的团队或者你自己是有效率的),那为什么不能这样用呢?我们的最终目标是什么?是解决问题!
17 楼 drinkjava 2007-06-01  
又想到一点,开发遗留数据库又想用Hibernate,只能用这种方法。
16 楼 过儿oO 2007-05-28  
drinkjava 写道
谢谢你的回复,不是的,在收件箱里有个消息是:
引用
标题:您的帖子被JavaEye会员集体投票评为新手贴
正文:
您的帖子:为什么Hibernate一定要做关联映射? 被JavaEye用户民主投票评为新手贴,减积分10分。

至于扣分什么的倒没什么,大不了过两天再上,入乡随俗吗。


是的,我的信箱里和你那个说的一模一样的,扣分到是没啥,关键一整封了,说不了话,我现在分是发啥也不涨我也没说啥
15 楼 drinkjava 2007-05-28  
谢谢你的回复,不是的,在收件箱里有个消息是:
引用
标题:您的帖子被JavaEye会员集体投票评为新手贴
正文:
您的帖子:为什么Hibernate一定要做关联映射? 被JavaEye用户民主投票评为新手贴,减积分10分。

至于扣分什么的倒没什么,大不了过两天再上,入乡随俗吗。
14 楼 过儿oO 2007-05-28  
drinkjava 写道
  没有其它人回答吗?本来是发在Hibernate栏的,后来25个投票评为新手贴,转到这里来了,可见至少有25个高级会员认为这是个简单问题,真希望这些资深人士在投票的时候给个简单的回答,老实说,我才不关心什么新手贴精华贴之类的,只不过想要一个答案而已。
  另:原来的标题不妥,改了一下,加了一个“用”字,因为这个贴子讨论的是Hibernate的另类用法,而不是正常使用Hibernate的用法。


它那个好象是自动的,好象是你帖子不够还是啥的,不是投票的,我的帖子也是被打为新手贴,然后一共就一个人回了,还是说的一些玩笑没有回答问题,后来我自己顶了一个,现在那个加上我发的一共3帖。不知道怎么回事,我现在不敢上上面去发,一发就扣10分封一天,受不了。
13 楼 drinkjava 2007-05-28  
  没有其它人回答吗?本来是发在Hibernate栏的,后来25个投票评为新手贴,转到这里来了,可见至少有25个高级会员认为这是个简单问题,真希望这些资深人士在投票的时候给个简单的回答,老实说,我才不关心什么新手贴精华贴之类的,只不过想要一个答案而已。
  另:原来的标题不妥,改了一下,加了一个“用”字,因为这个贴子讨论的是Hibernate的另类用法,而不是正常使用Hibernate的用法。
12 楼 drinkjava 2007-05-26  
过儿oO 写道

。。那我啥也不想说了,你用jdbc和hibernate有什么关系了还?你不用配映射类也,直接配置一个JdbcTemplate属性就行了。还有这和你做数据库多少年有啥关系。

不用Hibernate就一下将人推到jdbc,这是一种走极端的做法,就好象误了飞机就叫人去骑驴车,而不是想一想有没有其它的办法。
顺便题一下,今天花了一天时间,编好了一个工具,按上文思路,从MySql数据库直接生成所有hbm.xml、PO、VO类,因为不考虑映射,键也只用业务单主键或uuid.dex,从此无需手工微调xml,真正一键搞定了!
11 楼 drinkjava 2007-05-25  
过儿oO 写道

。。那我啥也不想说了,你用jdbc和hibernate有什么关系了还?你不用配映射类也,直接配置一个JdbcTemplate属性就行了。还有这和你做数据库多少年有啥关系。

怎么没关系呢?JDBC是用E-R的概念来操作数据库,贴子中的这种用法也是用E-R的概念来操作数据库,只不过工具毕竟换成了Hibernate,而不是其它的东东;不用JdbcTemplate是因为它没有缓存,要手写SQL,不能用对象名+点号的方式来访问属性,不能跨数据库。说做数据库多少年是想说明不用OO只用ER也能很好地开发数据库。
10 楼 过儿oO 2007-05-25  
drinkjava 写道

引用
不映射成类怎么利用oo思想啊,hibernate可以对一个对象进行操作,jdbc不行啊,主要是可以利用oo思想


你根本就没看明白这个贴子的观点,我的意思是完全不用OO思想,只是将hibernate当作一个比jdbc顺手点的工具而已,我用关系数据库好多年了,也开发过上百个表的应用,不用OO不也照样做挺好?JDBC不行,可也没人说不准用JDBC吧?


。。那我啥也不想说了,你用jdbc和hibernate有什么关系了还?你不用配映射类也,直接配置一个JdbcTemplate属性就行了。还有这和你做数据库多少年有啥关系。

9 楼 drinkjava 2007-05-25  
又找到一个这样用的例子,请看以下链接"Hibernate的性能"一文中的 dhj1的发言
http://hi.baidu.com/leow/blog/item/aeeacbfc7600c6fdfd037fa2.html
8 楼 drinkjava 2007-05-24  
引用
java语言不是动态语言,简化不了这些操作。activeRecord给有我们非份之想,好像马丁大叔就在尝试做类时的orm框架。还有jruby给了我们可行的机会

答非所问,离题太远。

引用
不映射成类怎么利用oo思想啊,hibernate可以对一个对象进行操作,jdbc不行啊,主要是可以利用oo思想

你根本就没看明白这个贴子的观点,我的意思是完全不用OO思想,只是将hibernate当作一个比jdbc顺手点的工具而已,我用关系数据库好多年了,也开发过上百个表的应用,不用OO不也照样做挺好?JDBC不行,可也没人说不准用JDBC吧?


引用
请再好好理解一下ORMapping的含义。
另外不能充分发挥关联关系的优势,是否是因为没有遵循“对象模型” -> “关系模型” -> “Hibernate映射规则”的开发顺序?

同上,不是我没理解,而是本来就没打算采用“对象模型” -> “关系模型”,而是直接一个表对应一个类,走的是"关系模型"的路子。


引用
不用关系影射,你用hibernate干什么。

咱笨,用不好关联映射,怕出错,所以干脆不用它,可关系模型咱还是很精通的,所有的关系就交给数据库去约束它好了。至于为什么还要用Hibernate,是相比JDBC和ibatis来说的:不用写很多SQL,有缓存,跨数据库,支持分页,Spring支持,总之好处一言难尽啊...

引用
性能上去了,面向对象特性没有了

不知你是为了OO而开发,还是为了开发而OO?

引用
我第一次用hibernate的时候就是这么用的
然后涉及到多表连接时统统搞成视图

不会这么恐怖吧?Hibernate很能干的,你google一下“hibernate多表查询”就知道了。


引用
我就这样用了快2年了,
非常的简便,门槛非常的低,效率也非常不错
级联查询统计返回object[]

可见笨人不只我一个啊,这个居然用了2年。Hibernate的这种用法确实很另类,与它诞生的初衷可说是背道而驰,但事实上,这种方式程序跑起来绝对没问题,问题是这种用法能否被团队接受,让我用起来心里有个底,这才是我发贴询问的原因。光一个人私底下用,当然没人会来说三道四,问题是能不能引入到团队开发中,作为一种替代JDBC的简易方案,而不是被团队中的高手当作异已一棒子打死,因为通常一提到Hibernate大家就会联想到ORM,这确实是一个很容易陷入的思维惯性,事实上,前面几个回贴都是这样,也不想想贴子要表达的是什么,就开始反驳了。

相关推荐

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    Hibernate一对一主键关联映射(双向关联)

    在Java的持久化框架Hibernate中,一对一...总之,Hibernate的一对一主键关联映射,特别是双向关联,为Java开发提供了方便的数据持久化手段。通过正确理解和运用这些映射机制,可以更高效地管理和操作数据库中的对象。

    Hibernate一对一主键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射方式之一,尤其在处理两个实体之间存在唯一对应关系时非常有用。本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个...

    hibernate一对多关联映射(单向关联)

    这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...

    Hibernate关联映射总结

    ### Hibernate关联映射总结 #### 一、基础知识 在探讨Hibernate中的关联映射之前,我们需要先理解几个基本概念,这将有助于我们更好地理解和应用这些关联映射。 - **主键**(Primary Key):主键是用来唯一标识一...

    hibernate一对一主键关联映射(单项关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系数据库模型。本篇将深入探讨在Hibernate中实现一对一主键关联映射的单项关联方式。这种关联意味着两个实体类共享相同的主键,即一个...

    hibernate一对一主键关联映射(双项关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系映射方式,用于表示两个实体之间一对一的对应关系。本篇主要探讨的是基于主键(Primary Key)的双向关联映射,这在实际项目中非常常见...

    Hibernate集合映射与关联关系

    在IT行业中,数据库管理和对象关系映射(ORM)框架是至关重要的部分,特别是对于Java开发者而言,Hibernate是一个广泛使用的ORM工具。本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合...

    Hibernate关联映射

    在 Hibernate 映射中,需要使用 `one-to-one` 元素,并设置 `constrained="true"`,表明该类的主键由关联类生成。 3. Hibernate 一对一连接表单向关联: 这种关联方式是通过额外的连接表来实现一对一关系的。连接...

    Hibernate3.x关联映射示例

    Hibernate 3.x 版本是其成熟且广泛使用的版本,提供了丰富的功能和优化,包括对象的持久化、查询语言HQL以及关联映射。本示例将深入探讨 Hibernate 3.x 中的关联映射,以帮助开发者更好地理解和应用这一关键技术。 ...

    hibernate 单向多对多关联映射练习

    本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...

    hibernate关联映射的作用和常用属性解释

    ### Hibernate关联映射的作用与常用属性详解 #### 关联映射概述 在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射...

    hibernate 双向多对多关联映射练习

    在Java的持久化框架Hibernate中,双向多对多关联映射是一种常见的数据关系模型,它允许两个实体类之间存在多个实例互相引用的情况。本练习旨在帮助开发者深入理解并熟练运用这种映射方式。通过以下详细讲解,我们将...

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

    Hibernate一对多单向关联映射

    本篇主要探讨的是如何在Hibernate中实现一对多的单向关联映射。 一、概念理解 一对多关联意味着一个实体(如部门)可以有多个关联实体(如员工),而反过来,每个员工只属于一个部门。单向关联则表示只有部门知道其...

Global site tag (gtag.js) - Google Analytics