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

时间:2013-04-30 11:53:09

标签: java jpa entity

在某些实体之间具有m:n的真实世界关系,例如用户< --->组 现在我想建模这种关系并根据它存储其他信息,例如一个领域“质量”。

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

id | user_ref | group_ref | quality
----------------------------------
1      1           1         0.5
2      1           2         1.3
...    ...         ...        ...

相应的实体有两个相关实体(私有成员)用户和组,用 @ManyToOne 注释注释。 另一方面,我的用户和我的组都有一组相关的user_group-entities,都是私有成员,并使用 @OneToMany -annotation进行声明。

我有三个问题:

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

    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()
    

    非常感谢!

1 个答案:

答案 0 :(得分:1)

  1. 是的,这是做这件事的好方法。
  2. 可能有一个由两个ManyToOne关联组成的复合主键,但是在映射和应用程序的其余部分中处理它时要复杂得多,而且效率也会降低。您有一个实体,因此只需对所有其他实体执行操作并使用自动生成的单列主键。此实体曾经是多对多关联的连接表这一事实无关紧要。
  3. 是的,这似乎没问题,但addUser()addGroup()方法应命名为setUser()setGroup():给定的{{只有一个用户和一个组{ 1}}。我还会为实体本身使用另一个名称。例如“会员”之类的东西。