覆盖identitycolumn hibernate mssql

时间:2016-05-03 07:42:37

标签: java sql-server hibernate

我必须使用hibernate管理2个DB(mssql)之间的数据传输。 当我使用session.get()从一个数据库加载对象时,它已经有一个私钥。然后我需要使用anotherSession.replicate(Object o)将其持久保存到其他数据库。 我的问题是,给定的PK不会被持久化,而是被另一个PK取代。

PS:srcTable和destTable都有PK生成身份,它需要保持这种状态。

2 个答案:

答案 0 :(得分:0)

如果您使用生成" identity"映射实体ID,Hibernate将在您尝试保留它时立即生成新ID。您必须将生成切换到"已分配"保留旧ID。

答案 1 :(得分:0)

如果你有类似的东西

@Entity
public class Project {
    @Id @GeneratedValue long id; // still set automatically

}

您必须从 id 字段中删除 @GeneratedValue 注释。否则jpa将在插入之前生成id的值。

@Entity
public class Project {
    @Id long id; // must be initialized by the application
     :
}

解决您的问题

  1. 创建一个包含所有映射定义的实体。
  2. 在没有@Generated值注释的新类中创建ID字段。
  3. 将旧实体克隆到这个新实体。
  4. 坚持这个新实体。
  5.   

    现在,如果您创建一个扩展您的实体的子类,那么整个   过程变得非常容易。

    此解决方案的示例代码

    现有实体

    @Entity
    @Table(name="EJB_PROJECT")
    public class OldEntity implements Serializable {
    
        @Id
        @Column(name="PROJECT_ID", primaryKey=true)
        @GeneratedValue
        Integer id;
    }
    

    新实体

    @Entity
    @Inheritance(strategy=SINGLE_TABLE)
    @Table(name="EJB_PROJECT")
    public class NewEntity extends OldEntity {
    
        @Id
        @Column(name="PROJECT_ID", primaryKey=true)
        Integer id;
    
        // Constructor to clone old entity's id
        public NewEnity(OldEntity old) {
            this.id = old.id;
        }
    }
    

    保留代码

    em.persist(new NewEntity(oldEntity));