JPA外键 - id或引用

时间:2012-08-16 14:43:11

标签: java postgresql jpa playframework-2.0 ebean

我有两节课:ForumTopic 我之前告诉我应该有论坛属性(在主题中),类似的东西:

  

@ManyToOne
    @JoinColumn(姓名="论坛")
    受保护的论坛论坛;

而不仅仅是保留论坛的ID 我在postgresql中看到,Forum属性保存为" bigint" (论坛ID) 那么举办论坛参考的重点是什么呢?

2 个答案:

答案 0 :(得分:2)

  

无论如何,持有论坛参考的意义何在?

这样您就可以以更“面向对象”的方式处理forum字段,作为类的真实字段,而不关心数据库对象图的表示。这是使用像JPA / Hibernate这样的ORM的最大胜利之一。

答案 1 :(得分:1)

这正是您使用对象关系映射(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代码中向后导航(从主题到论坛),因此您在Topic类中有一个引用,但这只能在sql中表示为外键。

ps:更准确地说,JPA是一个接口,您使用的实现(例如Hibernate,EclipseLink)是完成工作的ORM解决方案。