【问题标题】:Hibernate: Adding versioning to a non versioned DBHibernate:将版本控制添加到非版本控制数据库
【发布时间】:2011-01-26 02:32:01
【问题描述】:

我前段时间使用休眠 (JPA) 创建了一个数据库,但是我没有包含任何实体的 @version 字段。 事实证明这个项目变得很重要,现在我需要使用版本控制(带有乐观锁定的版本控制)。

我知道我需要使用 @version 注释向每个实体添加一个新属性(字段)。

问题: 有谁知道如何更新真实数据库(mysql)以包含版本列而不会丢失数据和太多工作?

非常感谢。

【问题讨论】:

    标签: hibernate jpa locking versioning


    【解决方案1】:

    创建一个 SQL 语句,该语句为您想要的所有实体的表和 @Version 属性创建列。然后使用另一个查询将所有行的此列的值设置为 1。

    另一种方法是使用默认值创建列,然后删除默认值。 (适用于 MYSQL)

    ALTER TABLE xyz ADD version integer NOT NULL DEFAULT 1;
    ALTER TABLE xyz CHANGE version version integer NOT NULL;
    

    这种方法的目的是只要不运行第二条语句(删除默认值),旧应用程序就会运行,即使它在创建新对象时没有为version 列设置值。

    【讨论】:

    • 非常感谢。我想过做这样的事情。但是,我不知道为版本字段手动插入值是否会引起一些麻烦。再次非常感谢。
    【解决方案2】:

    在 Oracle DDL 中是 alter table xyz add ( version NUMBER default 1 not null );

    【讨论】:

    • 对其他用户有用。谢谢。