【问题标题】:JPA attribute OverrideJPA 属性覆盖
【发布时间】:2023-03-12 01:16:01
【问题描述】:

我们可以覆盖属性以停止子类中的版本控制,因为它在我正在使用 eclipse 链接的超级中使用。

Class A {
@Version 
int a;
}

Class B extends A
{
//a is used as a normal integer not a version.
}

如果不可能,我们可以将版本字段 a 覆盖为 B 中的瞬态并将其从 B 表中删除。

【问题讨论】:

  • 所以您不希望 JPA 对 B 使用锁定,还是您不希望 JPA 控制字段值?另外,由于您提到 B 有自己的表,看起来您正在为每个班级使用表 - 为什么您不只是将 B 设为自己的单独实体?
  • 实际上我有一个主映射超类,其中包含许多在整个系统中使用的策略和字段。 B 类必须从 A 继承所有没有版本的东西,我不想创建另一个不包含版本的超级实体并由 A 继承。

标签: java jpa eclipselink


【解决方案1】:

版本似乎被认为是实体的基础,就像 ID 一样,因此没有办法被子类覆盖。您可以做的是通过使用@OptimisticLocking 注释将其标记为在“a”属性上使用字段锁定并指定 selectedColumns: http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_optimisticlocking.htm 这将允许您控制使用的值。在 A 中,您可以定义一个增加值的 preupdate 方法,而在 B 中,您可以覆盖增加它的逻辑。当另一个事务更改值“a”值时,这仍然允许发生乐观锁异常,但它使其成为应用程序控制的步骤。

【讨论】:

  • ok ,所以没有办法停止版本。但是有没有办法让子实体中的版本字段瞬态(B)
  • 使字段瞬态与停止版本控制相同。您可以尝试通过 orm.xml 映射 B 实体并将其标记为元数据完整。如果可行,则需要映射 A+B 中的每个属性。我不知道元数据完整如何与 MappedSuperclass 一起工作
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多