JPA:外键注解

40

我有两个数据库实体:ForumTopic

Topic 有一个 protected long forumId 数据成员,它当然表示了 Topic 所属的论坛。

我的问题是应该使用什么注解来注释这个数据成员?


你不需要在“Topic”中声明“forumId”。 - Bhesh Gurung
为什么你这么说?我认为这很必要,因为我需要知道这个主题属于哪个论坛。 - socksocket
1
@socksocket,我认为是因为你可以使用@JoinColumn注释来注释一个属性“Forum”,并指定其id,详见我的回答。 ;) - Elias Dorneles
3个回答

53

由于论坛有许多主题,而一个主题属于一个且仅属于一个论坛,因此您可能需要使用带有@ManyToOne注释的Forum类型属性:

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

更多信息:

ManyToOneJPA映射


18
但是这种情况下的“问题”是,当你将你的主题序列化为XML或JSON(例如传递给客户端),默认情况下整个论坛对象也会被序列化... 如果你上传一个主题到你的服务器,你需要传递整个主题+论坛对象,而不能只使用论坛ID。在某些情况下,手动插入相关实体的外键似乎更容易。 - splinter123
1
如何解决你的示例/情况中仅限于forumId的问题? - stallion
1
@stallion 如果您配置了延迟初始化,那么如果您只执行 getForum().getId(),则只会获取到id(无需进行连接)。请参见:https://dev59.com/eI7ea4cB1Zd3GeqPBng_#32223785 - Elias Dorneles

6

就像其他人已经回答的那样 -
你应该使用ManyToOneJoinColumn注释。
请注意,由于JPA是关于ORM-对象关系映射的,
你应该像在Java中自然地引用另一个对象一样 - 即通过一个对象而不是通过其标识符(在你的情况下是forumId),
这是JPA和Hibernate之间关系设计考虑之一(此前为JPA)。


1

@ManyToOne 正如注释所示 - 每个论坛有多个主题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接