【问题标题】:Persistence Manager not saving all data持久性管理器不保存所有数据
【发布时间】:2013-04-28 17:29:45
【问题描述】:

我的项目中的数据库存在以下问题,我不知道是什么原因造成的:

有以下类层次结构:

A 类 - 有一个 B 类的嵌入实例 B 类 - 有 2 个嵌入式 C 类实例(我重命名了其中一个的字段)。 C 类 - 只有简单的字段。

我知道,当您使用持久性管理器从数据库中获取对象时,某些字段可能会被延迟获取,因此我必须使用 getter 访问它们。我已经这样做了,它适用于所有其他情况。然而,在这种情况下,当我获取 A 类时,B 类被正确获取,但 C 类(他在 B 类中的两个实例)为空,即使我在持久性管理器仍处于打开状态时尝试访问它们,它们仍然为空。此外,如果我向 B 添加简单字段,它们似乎也会变成空值。这让我相信这些实例根本没有被保存。

这里有什么问题?我真的迷路了。

【问题讨论】:

  • 查看显式打印 PUT 语句的日志意味着您不必猜测

标签: java google-app-engine jdo


【解决方案1】:

您是否可能存储了空值?大多数 ORM 工具无法区分嵌入对象为 null 和嵌入对象为非 null 且只有 null 值作为字段。例如休眠会将嵌入的对象解释为空。例如,您可以存储一个虚拟字段来解决此问题,或者您的持久性提供程序可能有一些注释可以让您覆盖默认行为

【讨论】:

  • 不,我确定我没有存储空值。
【解决方案2】:

在@Embedded 的情况下,所有数据都存储在同一级别,因此列名是由字段派生的,例如,如果你的 B 类有一个 prop b,它会像 A_B_b 一样在 A 中命名(想想company_manager_firstName,不管你的经理是Manager1还是Manager2)

由于您有两个相同类的嵌入式实例,持久性管理器无法找出两个 C 实例之间的区别。如果在 A 中也使用两个 B 实例,问题也会一样。

解决方案是在其中一个 C 实例上使用 @AttributeOverrides 注释,这将告诉 JPA 如何区分 C。

-希望这会有所帮助。

【讨论】:

  • 我尝试在B类中添加虚拟字段,似乎它们也变成了0。我已经做了@AttributeOverrides
  • 您能否确认您是否正确地进行了属性覆盖,第二个答案here 可能会有所帮助,您必须为 B 中的 C 属性之一中的每个字段覆盖它。
猜你喜欢
  • 2020-07-01
  • 2016-08-14
  • 1970-01-01
  • 2011-05-30
  • 2011-03-23
  • 2011-07-17
相关资源
最近更新 更多