当前位置: 首页 > 知识库问答 >
问题:

使用Eclipselink/JPA更改实体类型?

狄阳秋
2023-03-14

我知道类似的问题,但它们是在Hibernate的范围内被问到和回答的。我也有同样的问题,但我正在使用Eclipselink,想知道对于Hibernate,是否有更好的或替代的解决方案。

简单地回顾一下这个问题:

我有两个相互继承的类:

@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);

在这种情况下,我希望cdtype=parent一起保存,并丢失childProperty的值。

然而,上面所描述的并不奏效,但我写下来是为了说明我的意思。

有办法用Eclipselink做到这一点吗?

共有1个答案

皇甫飞飙
2023-03-14

如果你想把一个对象从一种类型“改变”到另一种类型,没有简单的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();

对所有事务使用同一个事务“可能”可以使用flush而不是commit/begin,但这并不能保证,因为管理辅助缓存变得很棘手。还请注意,与子级的所有关系都需要更新,以指向“新”父实例,否则缓存将损坏。

但我并不确定这一点,因为在本例中,子实例已经是父实例了。通过这种方法,除了数据库中的任意标志之外,什么都得不到。如果您想让它在运行中改变,那么使用Java子类可能不是应用程序的正确方法。

相反,我建议使用一个通用的Person,该字段可以设置为保持孩子/家长状态。但既然孩子可以同时做父母。。

 类似资料:
  • 我尝试记录JPA实体的任何更改。因此,每个实体都继承自一个抽象实体类,该类具有日志条目对象列表。 AbstractEntity类: LogEntry类: 我的方法是创建一个新的LogEntry对象,并在实体更新或持久化之前将其添加到实体的LogEntry列表中。 我尝试了以下解决方案: 几乎所有这些试验都使我能够更改受影响实体的属性(如名称或validTo)。但没有任何解决方案提供创建新LogEn

  • 问题内容: 在我的特定情况下,我正在使用区分列策略。这意味着我的JPA实现(hibernate)创建带有特殊 DTYPE 列的 users 表。此列包含实体的类名称。例如,我的 用户 表可以具有 TrialUser* 和 PayingUser的 子类。这些类名称将在 DTYPE 列中,以便EntityManager从数据库加载实体时,它知道要实例化的类的类型。 *** __ 我尝试了两种转换实体类

  • 问题内容: 我正在使用weblogic和oracle对Web应用程序进行编程。数据源是通过JNDI配置的,具有受限制的数据库用户,该用户可以DML到表中,但不能DDL。您可能会猜到,该用户不是这些表的所有者,但已授予该用户访问权限。 假设他是GUEST_USER 该应用程序正在使用JPA + EclipseLink,并且已经定义了许多实体。我不想在每个实体类中都写入要更改架构的属性。我已经尝试过使

  • 问题内容: 我有Spring MVC + JPA应用程序。 我的应用程序中有几个实体在不断变化。我希望能够审核此更改。我发现有一个注释可以跟踪对某些字段或整个实体的更改。我想知道是否有任何方法可以配置此跟踪选项- 我希望能够跟踪更改的内容以及更改的人。还可以对SQL 1个表中的多个实体进行更改吗?还可以跟踪- 实体字段的变化吗? 谢谢 问题答案: 是的,您可以跟踪所做的更改,更新的用户和时间戳。

  • 我有两个实体具有@OneTomany(Entity1)&@ManyToOne(Entity2)双向关系。在@OneTomany关系中,我有@Cascading{Cascade.All}。但是当我在事务或方法中将具有@ManyToOne关系的实体的初始为false的boolean属性更改为true,然后又变回false时,它会导致数据库触发更新查询,将实体的boolean设置为false,这似乎是错

  • 主要内容:JPA实体更新示例JPA允许我们通过更新实体来更改数据库中的记录。 JPA实体更新示例 在这里,我们将演示如何根据主键更新学生的年龄。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码如下 - 在包下