繁体   English   中英

OneToOne双向双向关联

[英]OneToOne Double Bidirectional Association

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

Double OneToOne协会

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

基于这个页面 ,我已经编写了下面的代码,但我不确定它是否正确。

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

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

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

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

您可以在开放式访问书“ 使用Java,JPA和JSF构建后端Web应用程序”的 第15章中找到以下双向关联示例。

两个双向关联

Publisher类,我们添加publishedBooks财产,我们使用@OneToMany相应注释@ManyToOneBook类,代表着反比关系:

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

在笔者类中,我们添加authoredBooks属性与@ManyToMany相应注释@ManyToManyBook表示反向关系类:

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

Author :: authoredBooks@ManyToMany批注的mappedBy属性指定了在Book类中实现@ManyToMany关系的属性name

@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注释来指定@JoinTable -to-many关系的连接表名称以及连接表的相应列名称(例如,表是books_authors ,列名为BOOK_ISBNAUTHOR_PERSONID )。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM