2006年9月21日星期四

XP中的人生哲学

我过去对极限编程一直不是很热忱,抱有很多的偏见。首先就这个名称从字面上而言,极限?好像是噱头,或是旁门左道的东西。
其实里面很多都是朴素的道理。
比如:增量开发。“对于一个婴儿来说,他的力量就是成长的力量。”,“真正的光明决不是永没有黑暗的时间,只是永不被黑暗所掩蔽罢了。真正的英雄决不是永没有卑下的情操,只是永不被卑下的情操所屈服罢了。所以在你要战胜外来的敌人之前,先得战胜你内在的敌人;你不必害怕沉沦堕落,只消你能不断的自拔与更新。”
比如:测试驱动。告诉我们的道理是做事前要先确定好目标,有的放矢。或者“没有反省的生活是没有意义的。”

2006年9月9日星期六

Hibernate乐观离线锁(Appfuse Practise)


一个在Hibernate中的实践操作描述的很好的文档在这里。原理上的描述在Addison Wesley : Patterns of Enterprise Application Architecture Chapter 16里面有详尽的描写,这本Martin Fowler撰写的书称乐观锁定为Optimistic Offline Lock,Hibernate的实现基本上跟这本书里面的一样。里面有副时序图,画的相当的明白。(copy from the book. copyleft.)

另外一本书Hibernate in Action将乐观锁划分为Application Transacation,而悲观锁则划分为Database Transaction(Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象!见:Hibernate的reference document)。
Appfuse实践
Appfuse可以generate一个model的CRUD所有jsf页面,这可以作为实践上的起步。然后,version字段应该在页面上不能修改,而是作为一个hidden的字段,这样在显示record详细信息界面上就需要有两个hidden字段:
<h:inputHidden value="#{personForm.person.id}" id="id"/>
<h:inputHidden value="#{personForm.person.version}" id="version"/>
Patterns of Enterprise Application Architecture里面的做法是将version作为session变量,都是可以的。只要这个值是读取对象时取出来的就可以。
这样做后,如果两个不同的用户同时修改一条记录时,hibernate就会报错Row was updated or deleted by another transaction。