You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hibernate中映射SQL Server的row_version(timestamp类型)列?

正确映射SQL Server的timestamp(rowversion)列到Hibernate

嘿,这个坑我之前踩过!SQL Server里的timestamp类型其实是rowversion的别名,本质是个8字节的二进制值,完全不是我们平时说的日期时间戳,所以你直接映射成Timestamp或者普通binary肯定会出问题。下面给你说两种靠谱的映射方式:

方法一:结合@Version做乐观锁(推荐)

因为SQL Server的rowversion本来就是用来实现乐观锁的,正好匹配Hibernate的乐观锁机制,这也是最常用的方式:

在实体类里把字段类型定义为byte[],然后加上@Version和@Column注解:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;

@Entity
public class YourEntity {
    @Id
    private Long id;
    
    // 你的其他业务字段...
    
    @Version
    @Column(name = "row_version", columnDefinition = "timestamp")
    private byte[] rowVersion;
    
    // 别忘了生成getter和setter,不过这个字段你不用手动赋值!
}

关键说明:

  • @Version:告诉Hibernate这是乐观锁的版本控制列,Hibernate会自动在更新时检查这个值,避免并发冲突。
  • columnDefinition = "timestamp":明确指定数据库列的类型,让Hibernate生成正确的DDL(或者适配已有表结构)。
  • 不要手动修改rowVersion的值:SQL Server会自动维护这个列的更新,每次行数据变更时都会自动生成新的二进制值,Hibernate会自动处理这个过程。

方法二:用Hibernate特定类型映射

如果不需要用它做乐观锁,只是单纯映射这个列,可以用Hibernate的RowVersionType来指定类型:

import org.hibernate.annotations.Type;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class YourEntity {
    @Id
    private Long id;
    
    // 其他字段...
    
    @Column(name = "row_version", columnDefinition = "timestamp")
    @Type(type = "org.hibernate.type.RowVersionType")
    private byte[] rowVersion;
    
    // getter和setter
}

这种方式同样能正确映射,不过如果是为了并发控制,还是第一种方法更贴合场景。

额外注意事项

  • 如果你用XML映射文件,配置方式如下:
<class name="com.yourpackage.YourEntity" table="your_table">
    <id name="id" column="id"/>
    <!-- 其他属性映射 -->
    <version name="rowVersion" column="row_version">
        <column-definition>timestamp</column-definition>
    </version>
</class>
  • 不要尝试把这个列映射成java.sql.Timestamp或者String,因为SQL Server的timestamp本质是二进制,和日期时间毫无关系,强行映射只会导致类型转换错误。

内容的提问来源于stack exchange,提问作者user5442782

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:09:40