|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是一些大型开发或者是保密型比较高的项目都会用java,原因有2点,一:java是开源的,不怕别人留后门,偷我工具,.net网页编程就不一样了,保持微软的一向风格,源代码不公开俺是很老土的,因为项目必要,如今才入手下手进修Hibernate。实在Hibernate刚出来的时分,只是也许懂得了一下,晓得这是一个O/RMapping的框架。可是详细怎样用,可以做到甚么模样,没有一个详细的熟悉。如今重新学起,依照《Hibernate参考手册》供应的例子StepbyStep做。做到Person和Event联系关系的时分,手册上给出的代码以下:
Sessions=HibernateUtil.getSessionFactory().getCurrentSession();
s.beginTransaction();
Personp=(Person)s.load(Person.class,personId);
Evente=(Event)s.load(Event.class,eventId);
p.getEvents().add(e);
s.getTransaction().commit();
很复杂,很幽美的代码哦,看起来很OO。这个代码完成的需求也很复杂,就是将一个Person和一个Event联系关系起来。
可是当我看到输入的SQL语句时就停住了:
Hibernate:
select
person0_.idasid1_0_,
person0_.ageasage1_0_,
person0_.firstnameasfirstname1_0_,
person0_.lastnameaslastname1_0_
from
T_PERSONperson0_
where
person0_.id=?
Hibernate:
select
events0_.PERSON_IDasPERSON1_1_,
events0_.EVENT_IDasEVENT2_1_,
event1_.idasid0_0_,
event1_.FIRE_DATEasFIRE2_0_0_,
event1_.titleastitle0_0_
from
T_PERSON_EVENTevents0_
leftouterjoin
T_EVENTevent1_
onevents0_.EVENT_ID=event1_.id
where
events0_.PERSON_ID=?
Hibernate:
insert
into
T_PERSON_EVENT
(PERSON_ID,EVENT_ID)
values
(?,?)
临时先不评价Hibernate天生的SQL语句的效力怎样,就这个功效需求而言,映照到数据库上的操纵就是在T_PERSON_EVENT表中拔出一行。可是Hibernate却实行了3个SQL语句!假如只是在写一段Demo的代码,如许无所谓,可是假如是真的在有大批数据的临盆体系上运转的话,我信任后面两个SELECT语句的损耗会比最初一个INSERT语句多很多。请不要对我说:能够在硬件上优化,能够在数据库举行优化。这个不是统一个成绩。做为程序而言,应当是力图正确,该做的一样都不克不及少,不用要的就相对不要做。实在不管是本来的布局化编程仍是如今的OO编程,一个函数大概一个办法,都应当是做且仅作一件事,越接近底层逻辑的中央越应当如许。特别是在中国特征的体系中,典范的特性就是数据量年夜+营业庞大。在西南某省挪动公司的BOSS体系,有几个次要的服务天天的挪用量在3000万(每一个服务,他们的服务器上有也许20个如许的服务)以上,在月尾和月初的时分可以到达5000万乃至更高,可是服务的实行工夫坚持在0.02s-0.05s之间,这个固然和数据库计划和优化有关,可是我没法设想假如在一件复杂的事变以外做一些不用要的事变会有如何的了局。在北方的某挪动公司,用户量已到达3000万,他们的体系引导头脑就是:用最复杂的手艺往做最庞大的事变。
Hibernate的反对者会说,O/RMapping的框架下降了程序员的门坎,不必往熟习SQL。岂非HQL就比SQL真的复杂良多么?再说了,SQL是必需的基础功,就仿佛可以纯熟利用操纵体系是每一个程序员的基础功一样。由于如今成熟的支流数据库都是干系型的,这是基本。这也是为何O/RMapping的框架运转起来老是很奇异一样,由于从根上是干系型的,要想转化成OO,一定就有一些很别扭的工具。以下面的例子看,假如纯真看代码,都可以分明是要给Person和Event创建映照,不必要别的的工具,由于personId和eventId都已有了。可是Hibernate不睬解,他也没有举措了解。
有伴侣说,利用Hibernate可以便于团队合作。实在团队合作也好,体系的可扩大性、可保护性也好,和你用不必Hibernate完整不相干。关头是看你的计划,可否明晰的条理化、模块化;办理上可否和谐使用资本等别的要素。
我对照推许WebLogicWorkshop8.1内里的Control/DatabaseControl/CustomerControl的计划思绪(八卦一下,WebLogicWorkshop的计划者之一来自MS,本来计划VisualBasic的,以是在Workshop内里有良多VBer熟习的工具),间接在办法的下面用Annotation的体例编写SQL语句,撑持定名参数。在编译以后成为无形态的SessionBean。自界说Control(能够以为是营业逻辑层)卖力事件把持,很好用。
喜闻iBATIS也是这类思绪的(本人写SQL语句),看来要学学iBATIS哦。
手艺没有相对的好与坏之分,只要合适与不合适之分。我以为Hibernate并非很合适年夜型、大批数据的、庞大数据干系的使用。假如我是客户,我必要的是一个正确满意需求,高效、不乱、易于扩大的体系,我不会体贴你用的是甚么手艺(免费的东东另当别论,呵呵)。
以上是一个Hibernate初学者的意见,接待人人不惜见教。
在google这个话题的时分,看到了别的的一篇帖子,和我的设法有点靠近,原文在:http://www.ckuyun.com/jivejdon/thread/31879.html
作者drinkjava,内容抄写以下:
注:Hibernate的庞大性是人尽皆知,想问一下Hibernate的退步用法,在JAVA***上发过这个贴子叨教,http://www.java***.com/topic/82107
,惋惜谁人坛子妙手太多,成绩还没看清就入手下手挥年夜棒了,只好放这里了,特地把它的一些回贴也贴在这里,看同好们指导一二:
我用Hibernate也有半年了,感到Hibernate的映照干系太庞大了,与懒性加载,反转把持等分离在一同,要想把持好,实十分人之所能。团体感到,假如不必Hibernate的联系关系,就把它看成干系数据库来操纵,利用和了解上城市便利很多,比方一个定单和产物的设置文件写成如许:
<hibernate-mapping>
<classname="db.Order"table="orders"catalog="sample">
<idname="id"type="java.lang.String">
<columnname="ID"length="32"/>
<generatorclass="uuid.hex"/>
</id>
<propertyname="orderTitle"type="java.lang.String">
<columnname="ORDER_TITLE"length="30"/>
</property>
</class>
</hibernate-mapping>
<hibernate-mapping>
<classname="db.Product"table="products"catalog="sample">
<idname="id"type="java.lang.String">
<columnname="ID"length="32"/>
<generatorclass="uuid.hex"/>
</id>
<propertyname="productTitle"type="java.lang.String">
<columnname="PRODUCT_TITLE"length="30"/>
</property>
<propertyname="orderId"type="java.lang.String">
<columnname="ORDER_ID"length="32"/>
</property>
</class>
</hibernate-mapping>
操纵时:
Ordero=newOrder();
o.setOrderTitle("order1");
dao.saveOne(o);
Productp=newProduct();
p.setProductTitle("product1");
p.setOrderId(o.getId());
dao.saveOne(p);
(HQL查询则模仿一般SQL中的写法,此处略)
如许一来,地道是用干系数据库的头脑来利用Hibernate,一个类对应一个数据库表,表之间的束缚交给数据库的键来把持,如许一来,即失掉了Hibernate的长处:不必手工写SQL,对象级别缓存,数据库可移植性,也不用吃力地进修和了解它了,地道是一个薄薄的JDBC的包装;弱点就是不克不及在HQL中写出"...object1.object2.object3..."式的对象援用,并且联系关系表的加载要自已来保护,但我以为相对了解它庞大的设置来讲,这点就义仍是值得的,Hibernate的初级特征固然没法用上了,但比拟于间接用JDBC或用ibatis写SQL总要好很多,只需会干系数据库,就可以当即上手,在老手多、工期短的项目中,可节俭良多培训工夫,并且关于厥后保护者的请求也年夜年夜下降,叨教我的这类设法是不是可行?
以下为JAVA***上的回覆
援用
java言语不是静态言语,简化不了这些操纵。activeRecord给有我们非份之想,仿佛马丁年夜叔就在实验做类时的orm框架。另有jruby给了我们可行的时机
drinkjava回覆:答非所问,切题太远。
--------------------------------------
援用
不映照成类怎样使用OO头脑啊,hibernate能够对一个对象举行操纵,jdbc不可啊,次要是能够使用OO头脑
drinkjava回覆:你基本就没看分明这个贴子的概念,我的意义是完整不必OO头脑,只是将Hibernate看成一个比jdbc随手点的工具罢了,我用干系数据库很多多少年了,也开辟过上百个表的使用,不必OO不也还是做挺好?JDBC不可,可也没人说禁绝用JDBC吧?
--------------------------------------
援用
请再好好了解一下ORMapping的寄义。
别的不克不及充实发扬联系关系干系的上风,是不是是由于没有遵守“对象模子”->“干系模子”->“Hibernate映照划定规矩”的开辟按次?
drinkjava回覆:同上,不是我没了解,而是原本就没盘算接纳“对象模子”->“干系模子”,而是间接一个表对应一个类,走的是"干系模子"的门路。
--------------------------------------
援用
不必干系暗射,你用Hibernate干甚么。
drinkjava回覆:
咱笨,用欠好联系关系映照,怕堕落,以是爽性不必它,可干系模子咱仍是很精晓的,一切的干系就交给数据库往束缚它好了。至于为何还要用Hibernate,是比拟JDBC和ibatis来讲的:不必写良多SQL,有缓存,跨数据库,撑持分页,Spring撑持,总之优点一言难尽啊...
--------------------------------------
援用
功能上往了,面向对象特征没有了
drinkjava回覆:
不知你是为了OO而开辟,仍是为了开辟而OO?
--------------------------------------
援用
我第一次用Hibernate的时分就是这么用的
然后触及到多表毗连时一切弄成视图
drinkjava回覆:
不会这么可怕吧?Hibernate很无能的,你google一下“hibernate多表查询”就晓得了。
--------------------------------------
援用
我就如许用了快2年了,
十分的烦琐,门坎十分的低,效力也十分不错
级联查询统计前往object[]
drinkjava回覆:
可见笨人不但我一个啊,这个竟然用了2年。Hibernate的这类用法的确很另类,与它出生的初志可说是南辕北辙,但现实上,这类体例程序跑起来相对没成绩,成绩是这类用法可否被团队承受,让我用起来内心有个底,这才是我发贴扣问的缘故原由。光一团体私底下用,固然没人会来讲三道四,成绩是能不克不及引进到团队开辟中,作为一种替换JDBC的浅易计划,而不是被团队中的妙手看成异已一棒子打逝世,由于一般一提到Hibernate人人就会遐想到ORM,这的确是一个很简单堕入的头脑惯性,现实上,后面几个回贴都是如许,也不想一想贴子要表达的是甚么,就入手下手辩驳了。
FeedBack:
#re:Hibernate,想说爱你不简单2008-05-0517:12年夜牙呵呵~说得好~撑持一下。我们之前一个BOSS项目,本来计划利用Hibernate,可是由于功能成绩,到了中前期,除利用单表保护,其他全体被JDBC替换。然后在另外一个绝对小型的项目中盘算接纳,开辟了两个月,由于功能成绩,被通盘弃用。从头走间接SQL的老路。
团体以为,Hibernate只能在中小型体系中、或关于数据处置量请求较少的体系对照合用。
#re:Hibernate,想说爱你不简单2008-05-0517:40BeanSoftHibernate的一对一,一对多,多对多一向都是审慎用为好,特别是年夜表时分的效力很低。切实其实,iBATIS在做SQL为中央的项目时,更符合和高效一些。你说的谁人中央我能猜到,谁人中央妙手良多,我发了个NetbeansStruts2插件的利用视频宣布,即刻有人来讲这插件怎样怎样欠好,仿佛我是作者(遗憾的是我不是插件的作者),我就得把它做成天下一流,要卖力一样。开源的软件嘛,人人都分明就好了,有人给做个插件都不错了,不要弄的本人仿佛很酷爱开源,次要目标就是但愿开源的人就得做一流的插件出来,然后本人收费用,然后本人做不了还老求全谴责他人,乃至求全谴责写文章来推行它的人。国际的情形,人人还不都是拿着他人的工具(开源收费的和盗版的),本人一分不想花,完了还做工具来卖钱。
#re:Hibernate,想说爱你不简单2008-05-0518:16jejweiBATIS仍是不错的。
究竟myspace这个环球前几的网站用的iBATIS.NET.
我想java版本的ib功能仍是有保证的
#re:Hibernate,想说爱你不简单2008-05-0520:2326265Hibernate做过两个项目,不不乱。厥后弃用了,用JDBC本人写了一个相似的。
#re:Hibernate,想说爱你不简单2008-05-0520:30YODA多谢列位给我更多的参考信息
BeanSoft,你晓得我说的是那里?哈哈,那你是否是介入了那边的项目了?
#re:Hibernate,想说爱你不简单2008-05-0521:48jacky-qHibernate,一入手下手费心,然后愈来愈不费心...
#re:Hibernate,想说爱你不简单2008-05-0522:55xiaohuasuper你的文章不错,但你的blog太黑了,看不下往
#re:Hibernate,想说爱你不简单2008-05-0523:02YODA呵呵,那我改一个,感谢你的提示
#re:Hibernate,想说爱你不简单2008-05-0523:46BeanSoft呵呵往注册了下为了下工具没介入甚么项目看来今后仍是少注册点帐号要否则徒增贫苦呵呵
#re:Hibernate,想说爱你不简单2008-05-0523:51iday把申明文档看完再说吧。。。。
#re:Hibernate,想说爱你不简单2008-05-0523:54sunlin批准我基础是如许想的
#re:Hibernate,想说爱你不简单2008-05-0611:20hammer一片口诛啊!我也来添一口,我做日本和西欧外包项目,历来没传闻过谁人用Hibernate的。之前公司里手艺司理也专门做过测试,Hibernate的功能在年夜型使用里的确比JDBC低很多多少。一样平常的做法是把sql放在一个xml或专门的class里,人人都来这里取着用。即便利检察,又能够在出了成绩间接把sql粘到数据库客户端上运转看效果。对程序员来讲,能间接看到sql是最宁神的。
#re:Hibernate,想说爱你不简单2008-05-0623:40tianya我以为Hibernate很棒啊,进步效力是必要一些技能的。一入手下手我也是像你们所说的那样利用复杂的hibernate特征,厥后在项目中不休探究,针对必要进步功能的中央侧重举行优化,都可以很好的办理功能成绩。
举个例子吧,我一个同事用SQL完成一个庞大的毗连几个表的查询,数据量年夜的时分,必要消费数非常钟的工夫。我利用Hibernate,再利用各类处置技能(比方视图、分页、多线程、HSQL的优化、hbm.xml特别处置)优化,完成的查询几近能在半分钟以内显现了局。
#re:Hibernate,想说爱你不简单2008-05-0700:52YODATo:tianya
起首感谢你的回复。不是说Hibernate就是欠好,存在就是公道,Hibernate有他合用的中央。关于Hibernate的了解和把握我一定没有你这么深,我想表达的意义是,Hibernate大概没法正确了解程序关于数据操纵的需求,以是做了一些无勤奋(要办理这个成绩,估量还真是得参考drinkjava兄的Hibernate“退步”用法),以是我有点不喜好它。说到优化,我也信任你说的实践情形,可是抛开数据库的优化不说,纯真的SQL优化要比HQL和Hibernate的优化大概加倍了然和复杂呢。就像下面Hammer说的,对程序员来讲,能间接看到sql是最宁神的。我就是为了宁神...呵呵来自:Hibernate,想说爱你不简单
微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包...... |
|