为什么Hibernate如此成功!

“为什么Hibernate如此成功!”
http://hibernate.bluemars.net/38.html
这篇文章是Gavin King写的,非常有趣,充分体现了Hibernate的设计理念,我粗略的意译如下:

下面是对Hibernate开发工作的个人想法,正是这些工作使得Hibernate如此迅速的得到广泛的欢迎。

1、飞快的版本发布
保持活跃的开发速度,经常进行版本发布,甚至几天之内就从前一个版本开发到下一个版本。这样是保证软件远离Bug的最好的办法,也可以让用户感到很放心,确信Hibernate的开发十分活跃,另外这样做也有一大好处,就是可以发现哪些功能是用户真正需要的。

2、回归测试
我想现在整个Java社区一定都很重视自动回归测试。如果软件的功能和设计有比较大的修改,那么一个综合性的test suite对于软件可维护性和稳定性来说实在是太重要了。我们应该有这样的意识:如果对软件的一个新功能没有进行回归测试,我们根本就不该去做它。

3、把一个功能做到最好
要么不做,要做,就一定做到最好。那些我们做不到最好的功能,我们根本不去做,扔给其他软件去做吧。

4、避免过度设计
浪费大量的时间和精力进行软件功能的抽象和扩充软件的灵活性,还不如多花点时间来解决你的用户面临的实际问题呢!简单一点! 软件能跑起来就OK,不要尝试去解决你的用户根本不关心的问题。就算你的软件设计的不够优雅也没有关系,反正还是initial阶段嘛!以后再refactor,你应该关注的问题是及时的把有用的功能给做出来。

5、集权
在你需要由民主投票来下决定之前,至少你已经把软件轮廓做好了。软件开发需要由一两个开明的人来领导,这样可以保证软件开发的连贯性而不至于产生太大的分歧,可以保证开发团队集中火力把要实现的功能做到最好。我觉得,OSS软件最大的风险就是意见不统一,摊子铺的太大,结果最后搞的什么都没有做好。

(译者按:非常赞同,凡是成功的OSS软件,都是在某个牛人已经把软件做好了之后,发布出来,然后由大家往里面添加功能的,并且在牛人的领导下不断进步。缺乏牛人的OSS软件都不算很成功,比如Mozilla)

6、文档
没有什么比文档更重要的了。如果你的用户不知道你的软件有这么一个功能,就等于没有这个功能,干脆把它去掉得了,省得给源代码增加复杂度。

7、避免标准化
好的标准可以带来软件的互用性和可移植性,坏的标准能够窒息软件创新!“支持XXX标准”根本就不是真实的用户需求,特别是当这个XXX标准是那些在其位不谋其政“所谓”的专家委员会制订出来的。(译者按:莫非指Sun,IBM等几个big name?) 最好的软件是在不断的尝试,不断的出错,不断的经验积累的过程中产生的。 (原文最后一句不解其意,没有译出来)

8、10分钟之内把Hibernate跑起来
潜在的Hibernate的用户在他们下载了Hibernate,第一次使用的时候根本就不可能花半个小时那么多时间来安装、配置和troubleshooting,他们早就丧失了对Hibernate的兴趣了。我们的口号就是新用户(假设有足够的JDBC知识)5分钟之内把Hibernate的Demo跑起来,而他们能够在1个小时之内写出“Hello World”式的最简单的Hibernate程序并且正常运行。

9、开发人员的责任感
用户总是不可避免的碰到问题,开发团队有责任有义务提供帮助。用户让我们知道了文档的漏洞,用户让我们知道了测试用例的小bug。此外,没有用户来用我们的Hibernate,我们还开发它做什么,不是浪费时间吗!

有个关于bug的笑话:用户根本不介意发现新功能的bug(译者按:Windows的用户好像都是如此),只要你能迅速的改掉bug。“责任感”意味着bug修复应该在1周之内。从收到bug报告到bug修复代码提交到CVS上要做到平均在24小时左右,这才是一个理想的目标。

10、易用的、可更新的wiki网页
(译者按:wiki是Hibernate网站用的一个web发布框架)

支持!

“10分钟之内把Hibernate跑起来”: 哇, 我怎么没觉得这么容易。

我感觉其实Hibernate最牛的地方是“do one thing well”,专注于解决实际问题,不考虑jdo等其他接口和太多标准的问题。而且开发者一定有非常丰富的经验,对数据库、持久层应用甚至整个实际项目的框架把握的特别好,所以hibernate才“实用”、“高效”!

robbin有空结合一个实际的小项目或者一部分,写一个使用Hibernate进行开发的tutorial吧~~~我想大部分hibernate初学者一定期望一个这样的指南。最好能用你的经验谈谈这样的开发流程,比如是从建立数据库表出发,还是先建立持久层对象的UML图,推荐用什么工具能高效的完成,如何减少编码量同时减少出错。如何保证数据库表、mapping文件和持久类甚至UML图之间的一致性,修改其中之一就(半)自动更新其他。问题有点多了,呵呵~~。这些经验文档里都找不到啊,初学者迷糊的就是这些。

你提的这些问题Hibernate文档里面都有的,在它的tools那一部分里面。

Hibernate文档确实不错,使用惯了手工O/R mapping的开发者可能一开始接触Hibernate有点不习惯,要把hibernate认为是个很简单好用的工具就会马上使用。

我推荐的liferay源码(http://www.liferay.com)最新版本使用了hibernate,看看它的UserUtil的一个调用hibernate方法:


public static boolean addGroup(String pk,
com.liferay.portal.model.Group group) throws SystemException {
Session session = null;

try {
session = HibernateUtil.openSession();

UserHBM userHBM = (UserHBM)session.load(UserHBM.class, pk);
GroupHBM groupHBM = (GroupHBM)session.load(GroupHBM.class,
group.getPrimaryKey());
boolean value = userHBM.getGroups().add(groupHBM);
groupHBM.getUsers().add(userHBM);
session.flush();

return value;
}
catch (HibernateException he) {
throw new SystemException(he);
}
finally {
HibernateUtil.closeSession(session);
}
}

可见操作数据库是很简单的。

如果你想使用在企业分布式环境下,参考hibernate网站应用架构图,建议使用Session bean来调用hibernate,应该是个很好的选择。

De facto standards are usually a much better fit to user requirements than a priori ones.

事实上的标准往往更加贴近用户需求。

priori = priority? a priori ones 是指先前提到的 XXX 标准?

xpetstore中的servlet实现方式中也有hibernate的应用,开源的,hibernate文档中也有推荐。

我英文不太好,文档快看完了,不过很多地方不是很明白。
从文档来看想有效率且灵活的运用hibernate似乎不是很容易啊。

<<从文档来看想有效率且灵活的运用hibernate似乎不是很容易啊<<

居然也有人说hibernate的缺点,能不能把相关的URL贴出来,让大家也看看Hibernate有什么缺点。

有没有牛人能将Hibernate翻译到.net中来,http://sourceforge.net/projects/nhibernate这里有个项目,就是企图翻译Hibernate的,现在看来好像失败了

配置成功容易,可以怎么用generate id
我用mysql没有使用sequence,用table的 hilo 就没搞明白
高人们快执教

> 配置成功容易,可以怎么用generate id
> 我用mysql没有使用sequence,用table的 hilo 就没搞明白
> 高人们快执教


Hibernate文档上写的很明白。如果id类型是String型的(推荐这种类型),可以使用uuid.hex或者uuid.string,由Hibernate生成id。如果id是int/long型的,使用数据库类型,比如MySQL的autoincrement属性的字段。hilo就劝你别用了,它是在数据库里面建一个表,字段记录当前id,每次取一个id,加1再更新数据库。这种方式有很多缺点,比如效率低,必须另开一个session处理,不能用在cluster环境等等。

程序中insert的时候不需要你管,Hibernate会自动给id赋值

http://hibernate.bluemars.net/hib_docs/reference/html/or-mapping.htmlor-mapping-s1-4

请问在哪里可以找到有关于hibernate对SQL支持的资料?

mysql 你可以用 native

你可以用Ttogether,首先创建entities relationalship图;在通过Together的菜单:tools-->Generate-->DDL...生成.ddl文件,在.ddl文件中包含的就是建表的sql语句。你把这些语句拷贝到一个.sql文件中,执行这个.sql文件,OK啦!

我用了一阵子hb,觉得最酷的是sql的语法hb基本上都可满足;
像sum这样的函数,jdo现在还没有看到。。(期望2.0?)。
相对应,读取数据库的量增加了不少。。但是因为用了prepareStatement,可能效率要高一点。。
陋见。欢迎指正。