TSS上面Ganesh同志的文章内容是非常有益的,讨论了session的这两个api的区别。get是每次都会从数据库取数据以保证数据的可靠。而load则会返回一个proxy,相当于一个存根,访问的时候从当前session或者hibernate二级缓存中查找,如果找不到则从数据库中Lazy Load一下。从Hibernate的复杂性上来说,这个概念应该算比较容易理解的,而且这种存在也是非常合理的。顺便里面还补充了一下JPA里面也有类似的getReference方法,行为类似load。看完文章你会开始注意这个细节。
可是,这个细节的下面却引起了n多人的讨论,讨论的核心就是Hibernate是不是有太多细节了?
很多人说这样不是OO的,很多人说Hibernate的细节造成它复杂,有人说Hibernate影响了他们的工作效率,等等,反正反对者站出来很多。我想这是可喜的。
说明在Java的Killer-APP组合Spring+Hibernate后面还是有很多持怀疑态度的人的,我们随时都需要提问题的大脑!
所以,我们也思考一下吧:
1、你一定要尽量的不断地熟悉你所使用的技术,可以是Hibernate也可以是JDBC,时刻保持对相关知识的饥渴。这样减少因为你的无知造成的失误。
2、思考别人的批评,或者说ORM不好,或者说这种那种ORM不好,你都要听着,然后思考,然后坚持你思考的结果,直到下一次思考。这个过程最好保持一定的技术偏执,因为没有性格的程序员不是好程序员。
3、放眼各种技术,了解相似技术,这样你不会在城头更换大王旗的时候失业:D。现在我们可以回头看看JDBC Dataset和JPA,向上向下都要看齐嘛。了解了相似技术更有助于你的思考。
4、知道你在讨论什么,知道背景。你需要知道Hibernate主要在Java or JavaEE中使用,当然有Hibernate.net,但是它不怎么火。还有,Hibernate的基础还是SQL和DBMS,你需要仔细了解这两种东西。
5、悟道。
Ganesh的原文:
Hibernate - Difference between session's get() and load()
http://gmarwaha.blogspot.com/2007/01/hibernate-difference-between-sessions.html
TSS上的讨论:
Difference between Hibernate's get() and load()?
http://www.theserverside.com/news/thread.tss?thread_id=43887
我以前翻译的Hibernate的session的javadoc,当时好像从字面上没有什么大的区别,配合这个帖子,要重新想一想:D
http://www.blogjava.net/iamtin/archive/2006/03/06/33910.html
BTW:因为做手术在家休养,所以才有时间发发牢骚:D