带有SQLServer时间戳的JPA乐观锁
我正在尝试在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时间戳
是一个递增的数字,不保留日期或时间)
作为一个自动递增的数字,在我的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只保留实体的一个版本,所以不需要对版本列进行“筛选”。 也许这会有帮助