【问题标题】:JPA persistence: store id or store entityJPA 持久性:商店 id 或商店实体
【发布时间】:2014-04-05 12:44:57
【问题描述】:

我正在构建一个 Java EE Restful 服务,用于在 SQL 数据库中进行操作。 在我的 SQL 数据库中,我有一个表 PRODUCT,其中包含产品的所有信息,包括所有者。所有者存储为另一个表 USER 的外键。 我要问的问题是我是否应该将所有者 ID 或所有者对象存储在与 PRODUCT 表对应的 Java 类中。

所以我应该使用

class Product {
    String name;
    Integer owner_id;
}

class Product {
    String name;
    User owner;
}

?

(我删除了所有注释等以保持问题清晰)

【问题讨论】:

    标签: java sql hibernate jpa


    【解决方案1】:

    要利用 ORM(例如 Hibernate),您需要存储引用。然后,在查询 Product 时,Hibernate 会填充 User

    如果您不存储引用而只是存储外键,并且如果您需要来自ProductUser 信息,则必须执行附加查询才能加载User

    【讨论】:

    • 感谢您的回答!当我存储引用而不是密钥时,我遇到的另一个问题是,当我获取 PRODUCT 对象时,所有者的 JSON 表示嵌入到 PRODUCT 的 JSON 表示中,而我只想要所有者的 id .有没有干净的方法来解决这个问题?
    • 是的,如果您使用 Jackson 进行 JSON 转换,则只能嵌入所有者的 id。我在这里回答了stackoverflow.com/questions/19118059/…
    • 我尝试了您在该线程中提供的建议,但是,我的杰克逊注释似乎被忽略了。我在构建路径中添加了 jackson core、databind 和 annotations 库。这似乎不起作用,我找不到有关如何让它们工作的文档。到目前为止,我只使用了 jaxb 注释。你能给我一些建议吗?
    【解决方案2】:

    您可以使用 id 或 User 对象,具体取决于您将如何使用 Product 实例。 标准模型方法是存储对象,然后您将能够从产品中获取所有者:

    productInst.getOwner();

    通过存储 id,您将自己限制为只能获取 id:

    Integet ownerId = productInst.getOwnerId();
    // and you will need more code to get the user instance:
    userDao.getById(ownerId);
    

    在简单的情况下,当我确定我只需要 id 时,我会通过只放置 id 来简化对象。但在大多数情况下,映射对象以检索相关实体会更智能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2020-08-08
      相关资源
      最近更新 更多