首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA:建模m:n关系和连接表值

JPA:建模m:n关系和连接表值
EN

Stack Overflow用户
提问于 2013-04-30 11:53:08
回答 1查看 478关注 0票数 0

在某些实体(例如用户<-->组)之间有一个m:n的现实世界关系,现在我想建立这种关系的模型,并根据它存储附加信息,例如一个字段“质量”。

我听说我必须创建一个新的联接表user_group,如下所示:

代码语言:javascript
复制
id | user_ref | group_ref | quality
----------------------------------
1      1           1         0.5
2      1           2         1.3
...    ...         ...        ...

相应的实体有两个相关实体(私有成员)用户和组,并使用@ManyToOne-annotation.注释。另一方面,我的用户和我的组都有一组相关的user _ group实体,它们都是私有成员,并且使用@OneToMany-annotation.声明。

我有三个问题:

  1. 这是在JPA2.0中建模附加字段问题的正确方法吗?
  2. 我不允许在user_group中同时使用用户和组作为主键,因为它们不是有效的主键类型。是否真的有必要宣布一个新的初选。
  3. 这是与这些连接表/实体一起使用的通用工作流吗?

..。

代码语言:javascript
复制
EntityManager em = ...
...
em.getTransaction().begin();
User u = new User("Pete");
Group g = new Group("Anonymous workaholics")
UserGroup ug = new UserGroup();
ug.addUser(u);
ug.addGroup(g);

em.persist(u); em.persist(g); em.persist(ug);
em.getTransaction().commit();
em.close()

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-30 11:59:32

  1. 是的,这是个好办法。
  2. 可以有一个由两个ManyToOne关联组成的复合主键,但在映射和应用程序的其余部分中,处理这个问题要复杂得多,而且效率也较低。您有一个实体,所以只需像所有其他实体一样使用一个自动生成的单列主键。这个实体曾经是多到多关联的连接表,这是不相关的。
  3. 是的,这似乎不错,但addUser()addGroup()方法应该命名为setUser()setGroup():给定的UserGroup只有一个用户和一个组。我还会为实体本身使用另一个名称。比如“会员”之类的东西。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16299261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档