OneToOne双向双向关联

时间:2016-09-29 08:01:18

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

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

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;    
}

3 个答案:

答案 0 :(得分:3)

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

但是由于这些关联只是被命名并且没有角色,所以你可以在愿望中创建角色。这应该来自上下文。

答案 1 :(得分:0)

对于两个一对一的双向关联,具有JPA注释的相互引用属性的实体类代码看起来非常好。这只是你的类图看起来不太好,因为你没有使用引用属性的名称(例如mainLeader)作为相应的关联结束,并且你不使用关联结束所有权点用于指示关联结束将被实现为另一方的类中的相应属性。

您可以在开放存取手册使用Java,JPA和JSF 构建后端Web应用程序的Chapter 15中找到以下双向关联示例。

Two bidirectional associations

Publisher类中,我们添加了publishedBooks属性,我们使用@OneToMany类中与@ManyToOne对应的Book注释,表示反向关系:

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

mappedBy :: @OneToMany属性的Publisher注释的publishedBooks参数指定在{{1}中实现@ManyToOne关系的属性class:

Book

在Author类中,我们添加@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; ... } :: mappedBy的{​​{1}}注释的@ManyToMany属性指定了在Author中实现authoredBooks关系的属性name @ManyToMany课程:

Book

我们还使用@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; ... } 注释来指定mny-to-many关系的连接表名称以及连接表的相应列名称(例如,表格为@JoinTable和列名为books_authorsBOOK_ISBN)。

答案 2 :(得分:-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;    
        }