我的项目中的数据库存在以下问题,我不知道是什么导致它:
有以下类层次结构:
A类 - 具有B类的嵌入实例 B类 - 有2个嵌入类C的实例(我重命名了其中一个的字段)。 C类 - 只有简单的字段。
我知道当你使用持久性管理器从数据库中获取一个对象时,可以懒惰地获取某些字段,因此我必须使用getter访问它们。我已经这样做了,它适用于所有其他情况。但是,在这种情况下,当我获取类A时,类B被正确获取但类C - 它在B类中的两个实例 - 都是空的,即使我在持久性管理器仍处于打开状态时尝试访问它们,它们仍保持为空。此外,如果我向B添加简单字段,它们似乎也变成了空值。这让我相信那些实例根本就没有保存。
这里有什么问题?我真的迷路了。
答案 0 :(得分:0)
你可能存储了空值吗?大多数ORM工具无法区分嵌入对象为null和嵌入对象为非null且仅将null值作为字段。例如,hibernate会将嵌入对象解释为null。你可以存储一个虚拟字段,例如解决这个问题,或者你的持久性提供程序有一些注释可以覆盖默认行为
答案 1 :(得分:0)
在@Embedded的情况下,所有数据都存储在同一级别,因此列名是按字段派生的,例如,如果你的B类有一个prop b,它将在A中命名为A_B_b(想想company_manager_firstName,如果你的经理是经理1或经理2,那就无所谓了
由于您有两个相同类的嵌入式实例,因此持久性管理器无法找出两个C实例之间的差异。如果你在A中使用B的两个实例,问题也是一样的。
解决方案是在其中一个C实例上使用@AttributeOverrides注释,这将告诉JPA如何区分Cs。
- 希望这有帮助。