使用Eclipselink / JPA更改实体类型



我知道类似的问题,但是在冬眠的范围内被问到并回答。我遇到了同样的问题,但是我正在使用eclipselink,并想知道对冬眠的建议是否更好或其他解决方案。

尽快回顾这个问题:

我有两个彼此继承的类:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="dtype")
@DiscriminatorValue(value="parent")
public class Parent {
  @Id
  private long id;
}

@Entity
@DiscriminatorValue(value="child")
public class Child extends Parent{
   private String childProperty;
}

现在,我想将孩子变成父母,反之亦然,例如

Parent p = new Parent();
em.persist(p);
Child c = (Child) p;
em.merge(c);

我希望P现在的数据库行是dtype = child

另一种方式就是这样:

Child c = new Child();
em.persist(c);
Parent c = (Parent) c;
em.merge(c);

在这种情况下,我希望c可以用dtype = parent保存并失去childProperty的值。

上面描述的内容不起作用,但是我写下来以表明我的意思。

有没有办法使用eclipselink?

如果要将对象从一种类型更改为另一种类型,则使用Java或JPA继承没有简单的解决方案。您必须克隆您的实例,删除旧实例,然后将新的实例持续到jpa/java符合:

Child c = em.find(pk, Child.class);
Parent p = new Parent();
p.setId(c.getId());
p.setOtherFields(c.getOtherFields());
em.getTransaction().begin();
em.remove(c);
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
em.persist(p);
em.getTransaction().commit();

使用相同的交易,所有使用齐平而不是提交/开始的"可能"工作,但是由于管理辅助缓存变得棘手,因此不能保证它。还要注意,需要更新与孩子的所有关系以指向"新"父实例,否则缓存将被损坏。

我不太确定这一点,因为在这种情况下,孩子是父母的实例。除数据库中的任意标志外,这种方法没有任何其他方法。如果您希望它可以随时变化,使用Java子类可能不是应用程序的正确方法。

相反,我建议您使用具有字段的通用人员,您可以设置为保留子女/父母状态。但是由于孩子可以同时成为父母。

相关内容

最新更新