一对一双向关联

3

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

Double OneToOne association

背景:有个人和团队。每个团队由若干人组成,每个人只能属于一个团队。每个团队都有一个主领导者,可选地还可以有第二个领导者。

根据这个页面,我写了下面的代码,但不确定是否正确。

@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映射到一个领导者吗?简单来说,你想做什么? - mujib ishola
这不是双重关联。Person 只需要知道一个 Team。你没有展示它如何与 mainsecond Team 相关联。 - ChiefTwoPencils
@ChiefTwoPencils,我根据在互联网上找到的一个OneToOne双向关联映射示例编写了我的代码。请问您能否重写正确的解决方案或者给我展示一个示例代码? - julianfperez
@ChiefTwoPencils 我已经添加了一个链接和上下文解释。 - julianfperez
你的类图似乎有缺陷。它声明每个人总是与两个团队相关联(团队一侧的多重性为“1”)。这看起来不正确。 - Geert Bellekens
显示剩余3条评论
3个回答

3

协会名称暗示了要使用的角色。 Main Leader 可能对应于角色 mainLeader。因此,我只需在 Team 中创建一个属性。

但由于关联只是命名,并没有角色,因此您可以根据需要创建角色。这应该从上下文中推导出来。


0
你的使用JPA注解互相引用属性的实体类代码看起来不错。只是你的类图并不十分好,因为你没有在相应的关联端使用引用属性的名称(例如mainLeader),而且你也没有使用关联端拥有点来指示一个关联端将作为另一侧类中的对应属性实现。
你可以在免费获取的书《使用Java、JPA和JSF构建后端Web应用程序》的第15章中找到双向关联的以下示例。

Two bidirectional associations

Publisher 类中,我们添加了 publishedBooks 属性,并使用 @OneToMany 注释对应于 Book 类中的 @ManyToOne,表示反向关系:
@Entity
public class Publisher { 
  ...
  @OneToMany( fetch=FetchType.EAGER, mappedBy="publisher")
  private Set<Book> publishedBooks;
  ...
}

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

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

在作者类中,我们使用@ManyToMany注释添加了authoredBooks属性,对应于表示反向关系的Book类中的@ManyToMany
@Entity
public class Author {
  ...
  @ManyToMany( fetch=FetchType.EAGER, mappedBy="authors")
  private Set<Book> authoredBooks;
  ...
}

@ManyToMany注解的mappedBy属性用于Author::authoredBooks,指定了在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注释来指定多对多关系的连接表名称以及连接表的相应列名(例如,表名为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;    
        }

你的代码不是“更合适”,而是把一切都搞砸了!(1) 你不能将两个不同的引用属性(mainLeader和secondLeader)链接到同一个反向属性上。(2) 你的 Person::team 属性表示团队成员关联,而 Team::mainLeader(和 secondLeader)属性表示领导关联。 - Gerd Wagner
@gwag 我不确定它是否正确。我正在尝试并等待与 UML 图表相符的解决方案。 - julianfperez
但是你在问题中提供的代码与你的类图并不匹配。只有一些问题需要解决,例如是否以正确的方式完成了类图(例如在“团队”方面具有强制性而不是可选的关联端点)。 - Gerd Wagner
我删除了我的回答,如果它增加了混淆,我很抱歉。我比回答你的问题所需的更深入地研究了你的规格说明。我今天回来添加了一个片段示例,但我认为做出这些更改可能超出了所需或允许的范围,除非完全看到规格说明和UML。gwag是正确的,你所做的更改不会起作用。 - ChiefTwoPencils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接