我必须使用hibernate管理2个DB(mssql)之间的数据传输。
当我使用session.get()
从一个数据库加载对象时,它已经有一个私钥。然后我需要使用anotherSession.replicate(Object o)
将其持久保存到其他数据库。
我的问题是,给定的PK不会被持久化,而是被另一个PK取代。
PS:srcTable和destTable都有PK生成身份,它需要保持这种状态。
答案 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
:
}
现在,如果您创建一个扩展您的实体的子类,那么整个 过程变得非常容易。
现有实体
@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));