如何在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
相关产品推荐
相关产品推荐

