2009-12-03 50 views
15
@Entity 
public class Person { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    private int salary; 

    @Version 
    private long version; 

    // ...getters and setters 
} 
  1. 是否需要为version创建setter/getter?
  2. 当用Hibernate持久化这个实体时,我不需要手动设置这个值,对吗?
  3. 为了在Spring的hibernateTemplate.saveOrUpdate中使用乐观并发检查,还需要配置什么?是否支持所有数据库?
  4. 如何对此实体进行单元测试?在我的数据库中,显示版本字段的所有记录的值均为0
  5. 每次都会调用hibernateTemplate.saveOrUpdate是否增加版本值?

回答

12

我会说:

  1. 设置/获取版本是必需的,因为你可能(重建旧数据的新实例时)分配自己的版本有时
  2. 你不需要,如果你从数据库中读取实例。 (当用新代码在你的代码中创建它时,这将是一个不同的故事)。
  3. 我什么都看不到。我从来没有遇到数据库问题。
  4. 单元测试在我看来不会进入数据库,因此涉及数据库的测试称为集成测试。你不应该有太多它们,因为它们很慢,而且它们并不真正测试你的代码,而是更多的是Hibernate/Driver/Database代码......你应该相信它们,或者只测试一次,但不能测试它们为你所有的实体。
    要查看大于0的版本值,请在事务中读取/修改/更新您的实体,版本将增加1。退出交易,重新执行,价值增加...
  5. 每次修改数据库行时,版本都会增加。
+0

@KLE只是为了防止2个用户调用hibernatetemplate.saveorupdate同一时间,当调用hibernatetemplate.saveorupdate时不需要额外的检查吗?任何异常都会抛出? – cometta 2009-12-03 09:51:05

+1

@cometta重点不在于保存与否,而在于数据来自何处。在一个事务中,**如果你从数据库**读取一个实体,它的版本信息是最新的。当您保存它时,它会自动处理。如果您有一天会从其他来源获取数据(例如表单的帖子),然后重新创建该实体,那么您必须亲自关注该版本。 – KLE 2009-12-03 10:01:10

+0

一个很好的解释是在这里:http://en.wikibooks.org/wiki/Java_Persistence/Locking – Zilvinas 2014-01-29 12:44:58