Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有SQLServer时间戳的JPA乐观锁_Jpa_Timestamp_Locking_Optimistic - Fatal编程技术网

带有SQLServer时间戳的JPA乐观锁

带有SQLServer时间戳的JPA乐观锁,jpa,timestamp,locking,optimistic,Jpa,Timestamp,Locking,Optimistic,我正在尝试在SQLServer上设置JPA乐观锁。为此,我使用了时间戳列(SQLServer时间戳是一个递增的数字,不保留日期或时间) 作为一个自动递增的数字,在我的Java实体上,我需要将insertable/Updateable设置为false,否则会出现异常: com.microsoft.sqlserver.jdbc.SQLServerException:无法更新时间戳列 以下是我的Java实体映射: @Version @Column(name = "TSROWVERSION", inse

我正在尝试在SQLServer上设置JPA乐观锁。为此,我使用了
时间戳
列(SQLServer
时间戳
是一个递增的数字,不保留日期或时间)

作为一个自动递增的数字,在我的Java实体上,我需要将insertable/Updateable设置为
false
,否则会出现异常:

com.microsoft.sqlserver.jdbc.SQLServerException:无法更新时间戳列

以下是我的Java实体映射:

@Version
@Column(name = "TSROWVERSION", insertable = false, updatable = false)
private byte[] version;
当我更新记录时,将执行此SQL:

(1) *SELECT ... FROM cmd_e_entities WHERE uidentity=?*

(2) *UPDATE cmd_e_entities SET... WHERE uidentity=?*
但我希望得到的是:

(3) *UPDATE cmd_e_entities SET... WHERE uidentity=? AND tsrowversion=?*
Hibernate首先执行
SELECT
检查记录是否已更改(1),然后更新(2)。如果记录已更改,则会引发异常:

org.hibernate.StaleObjectStateException:行被另一个事务更新或删除

因此,它工作得很好,但我希望
更新
会考虑到版本(3)。实际上,如果将sql类型从
TIMESTAMP
更改为
NUMBER
,并删除insertable/updateble,它将按预期工作


如果<代码>更新<代码>不考虑版本(<代码>…和TSRoValue=?<代码>)如何保证乐观锁?如何获得预期的行为?

Hibernate检查内存中实体的版本是否与持久化实体的版本相同。实体的id不会改变,而且Hibernate只保留实体的一个版本,所以不需要对版本列进行“筛选”。
这可能有助于Hibernate检查内存中实体的版本是否与持久化实体的版本相同。实体的id不会改变,而且Hibernate只保留实体的一个版本,所以不需要对版本列进行“筛选”。 也许这会有帮助