robbin
2003-07-25 16:45
试过了,不行。update语句是在Hibernate的Configuration的时候生成的,不能动态改变。Hibernate只能做到对PO的状态管理,还不能细化到单独对PO属性的状态管理。虽然Hibernate不是没有解决办法,比如说自己写一个ClassPersister实现类,但感觉比较麻烦,不如直接用JDBC来的痛快。

robbin
2003-07-25 16:54
其实你遇到的这个问题和事务没有什么关系,是一个PO状态管理的问题。ORM都是以Persistent Object为最小不可分割的可管理单元,所以如果碰到同一个PO的两个属性分别存在不同的状态的时候,ORM就无能为力了,就是用PO的version也没有用,version是针对PO的,不是针对单个属性的。

如果你不嫌麻烦,可以自己写一个ClassPersister实现类,不用全部自己实现,继承EntityPersister,覆盖一下其中update就可以了,主要根据修改了的属性产生update,那些没有改变的属性就不放到update里面。

如果怕麻烦,直接用JDBC得了。

frank
2003-07-25 17:12
我看了hibernate 生成的sql ,其实我觉得,hibernate 为什么不在update的同时,把原来的所有属性都加在where上呢?

比如update sampltable set a=newa where b = beloadedb ,当发现b 不是原先LOAD时的b 就抛出例外。(因为b有没有发生改变 那个类应该可以察觉到)。我注意到HIBERNATE的文档里有个关于VERSION的设置,但是不知道如何用,可能它是解决问题的方法?

frank
2003-07-25 17:18
在我做的项目中经常遇到此类问题!其实这是个同步的问题,最明显的就是订票系统,我觉得version或许是良方,你能给我具体讲讲version的作用么?

frank
2003-07-25 17:28
让我觉得奇怪的是hibernate为什么把没有改变过的属性也update那?难道他本身不是一种双层结构?load后作为原值,改变后的这另外存储,这样就可以对比出那些改变过,那些没有,如果一张表由40个字段,如果我只想更新一个却更新是不是很浪费数据库的资源?

猜你喜欢