实体关系设计与JPA2

时间:2011-09-23 10:03:08

标签: persistence jpa-2.0

我有两个实体,User和UserSetting。这两者之间的明显关系将User作为第一个速率实体,其中包含UserSettings的集合/列表,因此当加载User时,设置也会被加载。例如,用户1 - > *用户设置

麻烦的是,这不是我想要的。目前,用户只有一些设置,但情况并非总是如此,当用户在系统中处于活动状态时,他们通常只需要访问所有设置的一小部分。我想要的是按需加载单个用户设置。显而易见的选择是使UserSetting列表延迟加载,但这不起作用,因为我想在分离状态下使用User。

我当前的“解决方案”是将User包含在UserSetting对象中但感觉不对,因为它使UserSetting * - > 1用户感觉像UserSetting是主导实体。这是最好的解决方案吗?

假设我当前的解决方案是最好的,我可以删除用户仍然正确级联?

1 个答案:

答案 0 :(得分:0)

这里有2分

  1. 首先,如果您的用户实体与UserSettings有关联,并且该关联可以包含许多不需要的成员,那么正确的做法是默认将其配置为lazyLoaded(通过JPA2映射配置)然后仅在需要时强制对其进行急切获取(即在您提到的那些情况下,您需要在分离的用户实体上需要该关联的值)。看看“加入获取”看看如何做到这一点,应该是这样的:

    SELECT u FROM User u JOIN FETCH u.userSettings

  2. 如果只有经常需要的那些UserSettings的子集,你可以在User实体中创建两个关联,例如userSettingsMain和userSettingsExtra,默认情况下都是延迟加载,只需加入你需要的那个某个分离的用户实体。或者,作为一个更高级的东西,你可以在用户设置上建立一个Map关联,并为重要的UserSetting提供不同的键,以及额外的键(如i1,i2,... e1,e2等)然后急切地只获取所需的那些键集,但这仅适用于EclipseLink JPA2(至少目前),Hibernate的实现只会在Map关联上引发一个很大的例外(请参阅我的问题:Hibernate JPQL - querying for KEY() in Map association error