我知道类似的问题,但它们是在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);
在这种情况下,我希望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();
对所有事务使用同一个事务“可能”可以使用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 的代码如下 - 在包下