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

Ali*_*iuk 10 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字段或者更好地拥有数字版本字段和其他字段中的时间戳,那么更好的是Timestamp类型吗?

  • 在数值类型(int,Integer,short,Short,long,Long)之间最好选择(考虑每种类型的长度)?我的意思是,我认为最好的是Long,但每行需要很多空间.

  • 当版本字段到达数字类型的最后一个数字时会发生什么(例如,短字段中的32,767)?它会在下一次增量中从1开始吗?

小智 7

只需使用Long或Integer。但是不要与int或long一起使用。与此处的其他评论相反,当实体从未持久化时,期望为空值。具有int或long可能会使Hibernate认为该实体已经被保留并且处于分离状态,因为未设置时版本值将为0。刚刚完成了FK违规的调试,其中“ int”是原因,所以节省您的时间,只需使用Long或Integer。


law*_*wal 5

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

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

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

整数或长整数比时间戳更好。Hibernate 建议使用数字 versionig,它们不会占用太多空间。

  1. 如果你用了很长时间,你可能活不下去了。

使用这个,你应该没问题。

private long version;

@Version
public long getVersion() {
    return version;
}

public void setVersion(long version) {
    this.version = version;
}
Run Code Online (Sandbox Code Playgroud)