2016-09-29 170 views
3

我是UML图中的新手,并希望使用JPA注释对以下OneUOne双向双向关联进行编码。OneToOne双向双向关联

Double OneToOne association

语境:有个人和团队。每个团队由人组成,每个人只能属于一个团队。团队总是有一个人担任主要领导者,并可以选择第二个领导者。

基于这个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;  
} 
+0

感觉就像你在寻找双向关系,但问题不是很清楚。你试图将mainTeam和secondTeam映射到一个领导?你打算以简单的方式做什么? –

+0

@mujibishola我想用JPA注释编码这个双重关联。就这些。 – julian

+0

这不是一个双重关联。 '人'只需要知道一个'团队'。你不会说明它是如何与'main'和'second'' Team'关联的。 – ChiefTwoPencils

回答

3

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

但是由于这些关联只是被命名并且没有角色,所以您可以根据需要创建角色。这应该从上下文中得出。

0

您的实体类代码与两个一对一双向关联的JPA注释的相互引用属性看起来相当不错。只有您的班级图表看起来不太好,因为您没有使用参考属性的名称(例如mainLeader)作为相应的关联结束,并且不使用关联最终所有权点来指示关联结束将作为另一侧的类中的对应属性来实现。

您可以在开放接入书大厦后端Web应用程序与Java,JPA和JSFChapter 15为双向关联下面的例子。

Two bidirectional associations

Publisher类,我们添加publishedBooks属性,我们使用来自Book类对应于@ManyToOne@OneToMany注释,代表逆关系:

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

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

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

在作者类中,我们添加authoredBooks属性对应于@ManyToMany@ManyToMany注释从Book类表示反向关系:

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

@ManyToMany标注为mappedBy财产Author :: authoredBooks指定了属性name,该属性实现了Book类中的@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一对多的关系,并为连接表中相应的列名(例如,表是books_authors,列被命名为BOOK_ISBNAUTHOR_PERSONID连接表的名称)。

-1

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

@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;  
     } 
+0

你的代码不是“更合适”,而是把它搞乱! (1)不能将两个不同的引用属性(mainLeader和secondLeader)链接到相同的反转属性。 (2)你的'Person' ::'team'属性表示一个团队成员关系,而'Team' ::'mainLeader'(和'secondLeader')属性表示领导关联。 –

+0

@gwag我不知道它是否正确。我正在尝试并等待适合uml图的解决方案。 – julian

+0

但是你在你的问题中提供的代码确实符合你的类图。如果你的类图是以正确的方式完成的话,那么只有一些问题(比如强制性的,而不是可选的关联在'Team'端)。 –