【发布时间】:2010-11-10 06:31:00
【问题描述】:
我使用休眠作为持久层。有 2 个实体存在于同一个表中,通过单表继承策略扩展了一个超类。
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class A {
@Id
@GeneratedValue
protected Long id;
// some common fields for B and C
}
@Entity
public class B extends A {
// B-specific fields
}
@Entity
public class C extends A {
// C-specific fields
}
我有一个 id=4 的 B 实例。如何将此实例的类型更改为 C 并保留其 ID (4)?
B b = em.find(B.class, 4L);
C c = convertToC(b);
c.setId(b.getId());
em.remove(b);
em.persist(c);
上面的代码失败了
org.hibernate.PersistentObjectException: detached entity passed to persist: C
有可能吗?
【问题讨论】:
-
我已将例外添加到问题中
-
只是一种预感,但是您是否尝试过调用 merge() 而不是 persist()?
-
是的,merge 给 c 一个新的 id。
-
这可能是 Entitymanager API 不足的一个例子。它不像原生 Hibernate API 那样富有表现力,而且有时意义不大。
-
有没有办法在原生 Hibernate API 中做到这一点?
标签: java hibernate persistence