我使用 Hibernate 3.6 Final、Guice-persist 和 JPA2。
太好了,我已经配置好了一切,我的 bean 有一个 @Version private Long version;
, 带有 getter 和 setter。
我已经在所有字段中实现了 equals 和 hashcode。
我的 dao 保存方法是:
@Transactional
public void save(Product p){ em.persist(p); }
但是,如果我这样做:
Product p = new Product("name"); //id=null, version=null
dao.save(p); //works, id!=null, version=0
Product p2 = new Produto(10, 0, "other name"); //id, version, name
dao.save(p2); //works, but the version isnt updated, so my version still 0
然后,如果我更改名称并再次尝试保存,则会收到“StaleObjectstateException 行已被更新或删除...”...
我想知道我该怎么做才能让实体管理器在保存对象时更新版本……以及为什么坚持不这样做。
提前致谢。
最佳答案
(忽略代码说的是新产品而不是新产品)
对于 p2,您在对象实例化时设置 id 和版本,然后将其持久化。
持久化后,对象 p2 的状态与上次已知的持久化状态保持不变 -> 无需更新版本。
(
执行类似 p2.setName("yet another name") 的操作,然后执行 p2.getVersion() ... 以查看效果。
p otho 没有任何版本,也没有由“你”通过代码或通过 PresistenceContext 直接设置。一旦你持久化了 p,它就会在一个持久化上下文中得到管理,因此得到一个版本号——在这种情况下它得到了版本 0(新创建的)。
关于hibernate - JPA2 + Hibernate + Guice-persist : Version Behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339940/