jpa - 用于乐观锁定的 JPA 版本字段的最佳类型

标签 jpa optimistic-locking

我怀疑哪个是用 @Version 注释的字段的最佳类型,用于在 JPA 中进行乐观锁定。

API javadoc ( http://docs.oracle.com/javaee/7/api/javax/persistence/Version.html ) 说:

“版本属性支持以下类型:int、Integer、short、Short、long、Long、java.sql.Timestamp。”

在其他页面( http://en.wikibooks.org/wiki/Java_Persistence/Locking#Optimistic_Locking )说:

"JPA 支持使用在每次更新时更新的乐观锁定版本字段。该字段可以是数字或时间戳值。建议使用数字值,因为数字值比时间戳。”

“如果表已经有最后更新的时间戳列,则经常使用时间戳锁定,这也是自动更新最后更新的列的便捷方法。时间戳版本值可能比数字版本更有用,因为它包含相关信息上次更新对象的时间。”

我的问题是:

  • 如果您要拥有 lastUpdated 字段,那么时间戳类型更好还是拥有数字版本字段和其他字段中的时间戳更好?
  • 在数字类型(int、Integer、short、Short、long、Long)之间选择哪个最好(考虑每种类型的长度)?我的意思是,我认为最好的是 Long,但它每行都需要大量空间。
  • 当版本字段到达数字类型的最后一个数字(例如 Short 字段中的 32,767)时会发生什么?它会在下一个增量中再次从 1 开始吗?
  • 最佳答案

    首先,知道锁定用于管理并发事务。

    1.分离你的顾虑。如果 lastupdated 字段是特定于业务模型的,它应该与您的版本控制字段分开 - 这是用于 - 版本控制。

    2.Primitives 和 objects 通常映射到您的数据库作为相同的类型。除了默认情况下 Boolean 可以为 null 并且 boolean 为“不可为 null”这一事实。但是,明确地强制执行可空性。在这种情况下,您希望使用原语,因为版本字段不能为空。

    整数或长整数比时间戳更好。 Hibernate recommends numeric versionig 并且它们不占用那么多空间。

  • 如果你使用long,你可能活不下去了。

  • 使用这个,你应该没问题。
    private long version;
    
    @Version
    public long getVersion() {
        return version;
    }
    
    public void setVersion(long version) {
        this.version = version;
    }
    

    关于jpa - 用于乐观锁定的 JPA 版本字段的最佳类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23722835/

    相关文章:

    Hibernate:我是否应该将 'version' 字段包含到 hashcode() 和 equals() 方法中

    java - 来自 ConstraintViolationException 的特定信息

    java.io.EOFException : No content to map to Object due to end of input while retrieving data

    hibernate - 默认情况下在乐观 hibernate 中

    optimistic-locking - 乐观锁乐观并发控制

    rest - 应该在 API 中返回自然键还是代理键?

    redis - ServiceStack 的 Redis 客户端中的乐观锁定

    java - 为什么我们扩展 JpaRepository 接口(interface)而不实现它

    java - JPA/Spring Roo : is there a destructor event called when an entity is removed from the persistent store?

    java - Spring数据使用jpa在SQL Server中存储utf-8字符串更方便的方法