始终没有理解Hibernate精髓,请指教!

想来Hibernate的精髓是他作的对象之间的映射吧。但我在使用中并没有理解这些映射带来的好处,

举个例子:一个组织Org下包含多个用户User。我做了从Org到User的Set映射,还有User到Org的一到多的映射。

现在要创建一个用户,在界面上有一个select控件是显示所有组织的,其value值是org的Id。当用户选择了一个

组织注册时,createUser函数中先要通过org的Id找到Org对象,然后调用user.setOrg(Org org)函数。


但是, 如果我不作映射的话,不需要通过org的Id找到Org对象,只需要调用user.setOrgId(String)函数

把user对象的OrgId设置就可以了。如果需要查找User所属的Org,只需要得到orgId再通过Org的find方法。

我知道我这样理解肯定有偏差,但确实没有发现映射的好处。(或许跟我用mysql不用外键也有关?)请大家指点迷津,举一些实例,让我早日看到阳光:)


很简单:
如果setOrg(),就是OOP
如果setOrgId(),就不是OOP
OO的目的不是为了让程序少几行代码,而是为了使设计更贴近需求,O/R mapping就是为了保证对象设计的纯粹性和与数据库实现的无关性,对象关系独立与外键的设置,程序员在编码时只需要考虑对象间的关系,不需要了解到底是通过那个外键来实现了这个关系

你说的有道理,thks:)

但不知道这种情况你如何处理:

例如:构造一个论坛系统,Board代表一个版块,Board下有成百上千个主题Thread,Thread下包含N个Message。

那么Board类中需要加入所有Thread的Set或List么,Thread类中又是否包括所有的Message的集合?

如果在一个类中加入过多的集合映射,O/R mapping效率是否降低了?当然Hibernate可以设置lazy=true,

但是这个属性设置之后,GUI客户端又依赖于Hibernate包了。

总之我想问下:大家用Hibernate时常用集合映射吗?

集合映射用CMP的CMR不错。

xPetstore虽然介绍使用Hibernate,但是它的category和产品product关系就是使用CMP的CMR来完成的。

请问我可不可以把hibernate理解成为jdo的一个增强子集?
尽管它们使用的ql语法不同

> 请问我可不可以把hibernate理解成为jdo的一个增强子集?
> 尽管它们使用的ql语法不同

hibernate是O/R Mapping的一个实现,JDO有jdo的标准(尽管目前不统一),两者解决的问题差不多,但hibernate不是jdo的子集。和hibernate相比的产品有Toplink,castor等,而JDO目前也有很多产品。


另外,robbin怎么不来啊?想听听你的高见!

我觉得muziq说的很对,我认为你不是没有理解Hibernate的精髓,而是没有理解OOP的精髓。一个OOP大型系统的设计,是自顶向下的,先有对象模型,最后才映射到数据模型。你上面那个按照操作OrgId写的代码,其实不是进行对象的操作,而是进行数据库表的操作。当然,这种思维方法上的差别也不是一两句话可以说清楚的。

Hibernate擅长复杂的集合映射关系,一般情况下,使用Lazy Initialization是必然的选择,虽然Hibernate的Lazy Initialization不像CMP那样可以跨RMI(实际上CMP是被封装在SLSB之后的,也失去了跨RMI的能力),但是仔细的分析需求,跨RMI的Lazy Initialization也不是必须的,如果是用Hibernate来写DAO层,也很容易做到按照需求来决定是否Lazy Initialization,而客户端也不需要Hibernate包的支持。


robbin说的对。作系统的时候自己也感觉到这个问题,很多设计都是从数据库开始,有悖于OO的思想。请robbin推荐一些能够改变思维方法提高OOP认识的书籍资料。

如果可能,robbin能否正面回答我上面说的论坛系统的建模,加上一条:Message下又有子Message的集合(帖子按回复关系呈树型结构)

对这个小系统进行分析建模,再给出hibernate映射文件。先谢过了。

楼上说的有理,理解HIBERNATE的精髓,就是先要理解OOD

这里有一个类似的例子:
http://www.javaresearch.org/article/showarticle.jsp?column=108&thread=5779
用JDO写的,不过原理是一样的。

先有抽象

再有实现

其实OO这东西,真的是要自己体会它的好处,理论往往只能浮于浮浅

在抽象的时候,那个User的对象里是不应该有orgID这个属性的,因为那是User - Org之间的关系,而不是User和某一个数之间的关系

至于实现的时候,如果映射,可以说有无穷的方法,只不过你选择的主键ID间的映射

另外,对于这个树状结构的集合,你可以看看设计模式中关于composite的设计,或许你会得到启示

谢谢楼上的!

OO的思想确实很重要,需要培养。但我还是有些东东搞不明白,在实践中,客户端调用的

接口往往是用id或者对象的某个属性作为参数。例如我前面说的帐户注
册时,帐户在

web界面选择select控件中一个“组织”,传递给jsp服务器的值其实是orgId,同样,

在多层分布式系统中,由于网络传输的问题,GUI、Web程序不能把系统中的“Model对象”

down到本地再进行操作,所以实际操作中多用到对象的id或属性作代表,客户端直接调用

的接口也多用id而不是对象作为参数。当然从服务器端设计的角度看,用对象作参数,严格建模、

设计对象间的关系对系统有很大好处。但客户端的接口还是需要id/属性,不能全部OO化。

说了半天都不知道自己想表达什么了,呼呼.....


OO是设计层面的东西,其主要作用实在设计是对需求中的世界做抽象

而实现则是对OO思想的体现,可以不拘一格,需看具体情况而定

像JAVA,并不是纯面向对象的语言,对于客户端这一块,它很难用纯面向对象的方法实现,所以会使得你有这样的疑惑

其实,如果你有心研究OO的话,可以看看SMALLTALK的资料,那是一个纯OO的语言,一切都是对象,那个语言所抽象出来的世界是非常符合现实情况的,而不会像JAVA那样,还需要有一些面向过程的东西来补充

> 像JAVA,并不是纯面向对象的语言,对于客户端这一块,它很难用纯面向对象的方法实现,所以会使得你有这样的疑惑

不是吧?这里的客户端是指Web吧?HTML+JavaScript当然不是纯面向对象,跟Java也不沾边啊!

Java是100%的面向对象!

100%的面向对象?

primitive type,static...