我有两个课程:Forum
和Topic
。
我之前告诉过我应该有论坛属性(在主题中),如下所示:
@ManyToOne
@JoinColumn(name = "forum")
受保护的论坛论坛;
而不是只保留论坛的ID。
我看到在 postgresql 中,论坛属性保存为“bigint”(论坛 id),那么持有论坛参考有什么意义呢?
我有两个课程:Forum
和Topic
。
我之前告诉过我应该有论坛属性(在主题中),如下所示:
@ManyToOne
@JoinColumn(name = "forum")
受保护的论坛论坛;
而不是只保留论坛的ID。
我看到在 postgresql 中,论坛属性保存为“bigint”(论坛 id),那么持有论坛参考有什么意义呢?
无论如何,举行论坛参考有什么意义?
这样您就可以forum
以更“面向对象”的方式将字段视为类的真实字段,而不必关心数据库对对象图的表示。这是使用像 JPA/Hibernate 这样的 ORM 的一大胜利。
这正是您使用对象关系映射 (ORM) 解决方案(此处为 JPA)的原因。问题是:您不能真正将引用放入数据库中,但在您的代码中,引用比普通 id 好得多。JPA 为您执行此操作。您可以创建一个主题,将其论坛属性设置为论坛对象,JPA 负责插入数据库(您不必获取论坛的 id 属性,然后使用 sql 语句手动插入) .
考虑一下:
Forum f1 = new Forum();
Topic t1 = new Topic();
t1.forum = f1;
t1.forum.someMethod();
您可以简单地从主题向后导航到论坛,并调用论坛的方法。这个参考比在那里有一个 id 更好:
t1.forumId = f1.id;
//to navigate back without having f1 in your scope:
Forum f2 = entityManager.find(Forum.class, t1.forumId);
f2.someMethod();
在这里,您必须找到与该主题相关的论坛,因为您只有一个 ID。更糟糕。
简单地说:您可以在您的 java 代码中轻松地向后导航(从主题到论坛),因此您的主题类中有一个引用,但这只能在 sql 中表示为外键。
ps:更准确地说JPA是一个接口,您使用的实现(例如Hibernate,EclipseLink)是完成工作的ORM解决方案。