我有两个实体,User和UserSetting。这两者之间的明显关系将User作为第一个速率实体,其中包含UserSettings的集合/列表,因此当加载User时,设置也会被加载。例如,用户1 - > *用户设置
麻烦的是,这不是我想要的。目前,用户只有一些设置,但情况并非总是如此,当用户在系统中处于活动状态时,他们通常只需要访问所有设置的一小部分。我想要的是按需加载单个用户设置。显而易见的选择是使UserSetting列表延迟加载,但这不起作用,因为我想在分离状态下使用User。
我当前的“解决方案”是将User包含在UserSetting对象中但感觉不对,因为它使UserSetting * - > 1用户感觉像UserSetting是主导实体。这是最好的解决方案吗?
假设我当前的解决方案是最好的,我可以删除用户仍然正确级联?
答案 0 :(得分:0)
这里有2分
首先,如果您的用户实体与UserSettings有关联,并且该关联可以包含许多不需要的成员,那么正确的做法是默认将其配置为lazyLoaded(通过JPA2映射配置)然后仅在需要时强制对其进行急切获取(即在您提到的那些情况下,您需要在分离的用户实体上需要该关联的值)。看看“加入获取”看看如何做到这一点,应该是这样的:
SELECT u FROM User u JOIN FETCH u.userSettings
如果只有经常需要的那些UserSettings的子集,你可以在User实体中创建两个关联,例如userSettingsMain和userSettingsExtra,默认情况下都是延迟加载,只需加入你需要的那个某个分离的用户实体。或者,作为一个更高级的东西,你可以在用户设置上建立一个Map关联,并为重要的UserSetting提供不同的键,以及额外的键(如i1,i2,... e1,e2等)然后急切地只获取所需的那些键集,但这仅适用于EclipseLink JPA2(至少目前),Hibernate的实现只会在Map关联上引发一个很大的例外(请参阅我的问题:Hibernate JPQL - querying for KEY() in Map association error)