【问题标题】:JPA: foreign key annotationJPA:外键注释
【发布时间】:2012-08-08 00:13:03
【问题描述】:

我有两个数据库实体:Forum 和 Topic。

Topic 有protected long forumId 数据成员,这当然表示Topic 的论坛。

我的问题是该数据成员使用什么注释?

【问题讨论】:

  • 你不需要在Topic中声明forumId。
  • 你为什么这么说?我认为有必要,因为我必须知道该主题属于哪个论坛
  • @socksocket 我认为这是因为您可以注释属性Forum,使用@JoinColumn 注释指定id,请参阅我的答案。 ;)

标签: java database-design jpa orm annotations


【解决方案1】:

由于论坛有很多主题,而一个主题属于一个且唯一的论坛,您可能希望使用带有 @ManyToOne 注释的论坛类型属性:

@ManyToOne
@JoinColumn(name = "forumId")
private Forum forum;

查看更多:

ManyToOne 和 JPA mapping

【讨论】:

  • 但这种情况下的“问题”是当您将主题序列化为 XML 或 JSON(例如,将其传递给客户端)时,默认情况下整个论坛对象也将被序列化。 ..同样的事情,如果你上传一个主题到你的服务器,你需要传递整个主题+论坛对象,你不能只使用论坛ID。在某些情况下,手动插入相关实体的外键似乎更容易。
  • 如何仅解决您的示例/案例中的 forumId??
  • @stallion 如果你配置了延迟初始化,如果你只做getForum().getId(),你将只得到id(不需要加入)。见:stackoverflow.com/questions/32220951/…
【解决方案2】:

正如其他人所回答的那样 -
您应该使用 ManyToOne 和 JoinColumn 注释。
请记住,由于 JPA 是关于 ORM - 对象关系映射,
您应该像在 Java 中“自然地”那样引用另一个对象 - 即通过一个对象而不是通过它的标识符(在您的情况下是 forumId),
这是 JPA 和 Hibernate(以前是 JPA)的关系之间的设计考虑之一。

【讨论】:

    【解决方案3】:

    @ManyToOne 正如注释所暗示的那样 - 每个论坛都有很多主题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多