【问题标题】:OneToOne Double Bidirectional AssociationOneToOne 双向双向关联
【发布时间】:2016-09-29 08:01:17
【问题描述】:

我是 UML 图的新手,想编写以下代码,其中有一个 OneToOne 双向关联,带有 JPA 注释。

上下文:有个人和团队。每个团队由人组成,每个人只能属于一个团队。团队总是有一个人作为主要领导者,并且可以选择有第二个领导者。

基于这个page,我写了下面的代码,但不确定是否正确。

@Entity
public class Person extends BaseEntity {

...

    @NotNull
    @OneToOne(mappedBy="mainLeader", cascade = CascadeType.ALL, orphanRemoval = true)
    private Team mainTeam;

    @NotNull
    @OneToOne(mappedBy="secondLeader", cascade = CascadeType.ALL, orphanRemoval = true)
    private Team secondTeam;    
}

@Entity
public class Team extends BaseEntity {

...

    @NotNull
    @OneToOne
    private Person mainLeader;

    @OneToOne
    private Person secondLeader;    
}

【问题讨论】:

  • 感觉您在寻找双向关系,但问题不是很清楚。您是否试图将 mainTeam 和 secondTeam 映射到一个领导者?简而言之,您希望做什么?
  • @mujibishola 我想用 JPA 注释编写这种双重关联。就是这样。
  • 这不是双重关联。 Person 只需要知道一个Team。您没有显示它将如何与 mainsecond Team 关联。
  • @ChiefTwoPencils 我已经根据一个示例编写了我的代码,以映射我在 Internet 上找到的 OneToOne 双向关联。拜托,你能重写正确的解决方案或给我看一个示例代码吗?
  • 我觉得不错(虽然我不知道 jpa)。

标签: java jpa uml one-to-one model-associations


【解决方案1】:

关联名称建议使用的角色。 Main Leader 可能对应于角色 mainLeader。所以我会在Team 中创建一个属性。

但是由于关联只是命名并且没有角色,因此您可以随意创建角色。这应该来自上下文。

【讨论】:

    【解决方案2】:

    您的实体类代码具有两个一对一双向关联的 JPA 注释的相互引用属性,看起来相当不错。只是你的类图看起来不太好,因为你没有使用引用属性的名称(如mainLeader)对应的关联端,也没有使用关联端所有权点 表示关联端将作为对端类中的对应属性实现。

    您可以在开放访问书籍使用 Java、JPA 和 JSF 构建后端 Web 应用程序Chapter 15 中找到以下双向关联示例。

    Publisher类中,我们添加publishedBooks属性,我们使用@OneToMany对应于Book类中的@ManyToOne注解,表示反比关系:

    @Entity
    public class Publisher { 
      ...
      @OneToMany( fetch=FetchType.EAGER, mappedBy="publisher")
      private Set<Book> publishedBooks;
      ...
    }
    

    Publisher::publishedBooks 属性的@OneToMany 注释的mappedBy 参数指定了在Book 类中实现@ManyToOne 关系的属性:

    @Entity
    public class Book { 
      ...
      @ManyToOne( fetch=FetchType.EAGER)
      @JoinColumn( name="PUBLISHER_NAME")
      private Publisher publisher;
      ...
    }
    

    在 Author 类中,我们添加 authoredBooks 属性和对应于 @ManyToMany@ManyToMany 注释,来自代表反向关系的 Book 类:

    @Entity
    public class Author {
      ...
      @ManyToMany( fetch=FetchType.EAGER, mappedBy="authors")
      private Set<Book> authoredBooks;
      ...
    }
    

    @ManyToMany 注释的@ManyToMany 属性Author::authoredBooks 指定了属性name,它实现了@ManyToMany 类中的@ManyToMany 关系:

    @Entity...
    public class Book {
      ...
      @ManyToMany( fetch=FetchType.EAGER)
      @JoinTable( name="books_authors", 
        joinColumns = { @JoinColumn( name="BOOK_ISBN") }, 
        inverseJoinColumns = { @JoinColumn( name="AUTHOR_PERSONID") })
      private Set<Author> authors;
      ...
    }
    

    我们还使用@JoinTable注解来指定mny-to-many关系的连接表名和连接表对应的列名(例如,表为books_authors,列命名为@987654353 @ 和 AUTHOR_PERSONID)。

    【讨论】:

      【解决方案3】:

      我认为这个解决方案可能更适合描述模型。

         @Entity
          public class Person extends BaseEntity {
      
                  ...
      
                  @NotNull
                  @OneToOne
                  private Team team;          
              }
      
              @Entity
              public class Team extends BaseEntity {
      
                  ...
      
                  @NotNull
                  @OneToOne(mappedBy="team", cascade = CascadeType.ALL, orphanRemoval = true)
                  private Person mainLeader;
      
                  @OneToOne(mappedBy="team", cascade = CascadeType.ALL, orphanRemoval = true)
                  private Person secondLeader;    
              }
      

      【讨论】:

      • 你的代码不是“更合适”,而是把它搞砸了! (1) 不能将两个不同的引用属性(mainLeader 和 secondLeader)链接到同一个反向属性。 (2) 您的Person::team 属性代表团队成员协会,而Team::mainLeader(和secondLeader)属性代表领导协会。
      • @gwag 我不知道它是否正确。我正在尝试并等待适合 uml 图的解决方案。
      • 但是您在问题中提供的代码确实适合您的类图。如果您的类图以正确的方式完成(例如在 Team 端有强制而不是可选的关联),则只有一些问题。
      • 我删除了我的答案;抱歉,如果它增加了混乱。我正在深入研究您的规格,而不是回答您的问题。我今天回来添加了一个 sn-p 示例,但我认为这样做的更改可能超出了需要或允许的范围,而没有看到规范和 uml。 gwag 是正确的,您所做的更改将不起作用。
      猜你喜欢
      • 2012-09-28
      • 2021-10-20
      • 1970-01-01
      • 2012-03-14
      • 2017-09-18
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多