【问题标题】:JPA @Version: how to use it?JPA @Version:如何使用它?
【发布时间】:2010-12-22 18:11:42
【问题描述】:
@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 都会增加版本值吗?

【问题讨论】:

    标签: java hibernate spring jpa dao


    【解决方案1】:

    我会说:

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

    【讨论】:

    • @KLE 以防两个用户同时调用 hibernatetemplate.saveorupdate ,调用 hibernatetemplate.saveorupdate 时不需要额外检查?任何异常抛出?
    • @cometta 重点不是保存与否,而是数据从何而来。在一个事务中,如果你从数据库中读取一个实体,它的版本信息是最新的。当你保存它时,它会自动得到照顾。如果有一天您碰巧从其他来源(例如表单的帖子)获取数据并重新创建实体,那么您必须自己处理版本。
    • 这里有一个很好的解释:en.wikibooks.org/wiki/Java_Persistence/Locking
    • 集成测试——它们并没有真正测试你的代码——真的吗?那么 arquillian 会做什么呢?
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2015-05-31
    • 2015-10-28
    相关资源
    最近更新 更多