0

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

有以下类层次结构:

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

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

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

4

2 回答 2

0

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

于 2013-04-28T18:32:05.440 回答
0

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

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

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

-希望这可以帮助。

于 2013-04-28T18:35:15.070 回答