或者我没有正确理解你的意思,或者你还没有搞清楚状况。如果我确实正确理解了你的原来的需求的话,我还是要告诉你,这既不是事务管理的问题,也不是同步的问题,是一个状态管理的颗粒度的问题。Hibernate的状态管理细化到PO这一级,并没有细化到PO的单个属性(表字段)这一级。所以你不用白费力气了,这个问题看来属于那Hibernate不准备处理的5%。
PO的version只能跟踪整个PO的状态,一旦某个属性值改变,那么整个PO的状态就被标记,update的时候所有的字段一起更新。我原想设置映射文件的update属性应该可以解决属性更新的问题,但试过以后才知道不行。
你说的为什么update的时候所有的属性都一起update,而不是只更新改变字段,其实这是一个比较值得探讨的问题。
如果想要做到只更新改变了的字段,必须做到两点:
1、对PO的每个属性设置version进行状态跟踪
2、update语句是动态生成的,在实际向数据库更新的时候,依次检查每个属性的version,决定哪些属性需要更新,动态构造update语句。
单单要做到上述第一点,就势必要给PO的操作带来沉重的负担,每次属性的存取都要判断version,严重影响PO的性能。会带来整个Hibernate性能的降低。而要做到第二点,临时构造update语句时间消耗很客观,也会极大降低update的速度。
Hibernate的PO状态管理是当任何属性值改变的时候,version就被标记,表明PO被更新了。实现很简单而有效,效率非常高。而update语句insert,delete和某几个select语句是在Hibernate初始化过程中就构造好了,不需要用的时候临时构造。
综合评价得与失,对PO属性进行状态管理固然可以稍微降低数据库负担,但是会极大影响Hibernate的运行效率,终究得不偿失。
BTW,如果一个表有40个字段的话,那么这个表肯定会有多种复杂的关系,在这种情况下,你应该针对每种不同的关系映射不同的PO,也就是说,这张表会映射好几个不同的class,每个class代表不同的构成关系,每个class都只用到了这张表的某几个字段而已。class越细,可扩展性越好。