【问题标题】:Entity relationships design with JPA2使用 JPA2 进行实体关系设计
【发布时间】:2011-09-23 10:03:07
【问题描述】:

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

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

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

假设我当前的解决方案是我能得到的最好的解决方案,删除用户是否仍能正确级联?

【问题讨论】:

    标签: persistence jpa-2.0


    【解决方案1】:

    这里有两点

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

      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 关于此)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-18
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      相关资源
      最近更新 更多