Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一元双向关联_Java_Jpa_Uml_One To One_Model Associations - Fatal编程技术网

Java 一元双向关联

Java 一元双向关联,java,jpa,uml,one-to-one,model-associations,Java,Jpa,Uml,One To One,Model Associations,我是UML图的新手,我想编写下面的一个图,其中有一个OneToOne双向关联,带有JPA注释 背景:有个人和团队。每个团队由人组成,每个人只能属于一个团队。团队始终有一个人担任主要领导,也可以选择另一个领导 基于此,我编写了下面的代码,但我不确定它是否正确 @Entity public class Person extends BaseEntity { ... @NotNull @OneToOne(mappedBy="mainLeader", cascade = Casca

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

背景:有个人和团队。每个团队由人组成,每个人只能属于一个团队。团队始终有一个人担任主要领导,也可以选择另一个领导

基于此,我编写了下面的代码,但我不确定它是否正确

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

关联名称表示要使用的角色<代码>主要负责人可能对应于角色
主要负责人
。所以我只需要在
团队中创建一个属性


但是,由于这些关联只是命名的,没有角色,您可以随意创建角色。这应该从上下文派生。

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

您可以在OpenAccess的《使用Java、JPA和JSF构建后端Web应用》一书中找到以下双向关联示例

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

@Entity
public class Publisher { 
  ...
  @OneToMany( fetch=FetchType.EAGER, mappedBy="publisher")
  private Set<Book> publishedBooks;
  ...
}
@Entity
public class Author {
  ...
  @ManyToMany( fetch=FetchType.EAGER, mappedBy="authors")
  private Set<Book> authoredBooks;
  ...
}
在Author类中,我们添加了
authoredBooks
属性,其中
@manytomy
注释对应于
@manytomy
,该注释来自
书籍
类,表示反向关系:

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

我们还使用
@JoinTable
注释指定mny-to-many关系的联接表名称以及联接表的相应列名(例如,表名为
books\u-authors
,列名为
BOOK\u-ISBN
AUTHOR\u-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;    
        }

感觉你在寻找一种双向关系,但问题并不十分清楚。你是否试图将主要团队和第二团队映射到一个领导者?简单来说,你想做什么?@mujibishola我想用JPA注释来编码这种双重关联。仅此而已,这不是双重关联。
人员
只需要知道一个
团队
。您没有显示它将如何与
main
second
团队关联
@ChiefTwoPencils我已经根据一个示例编写了代码,以映射我在Internet上找到的OneToOne双向关联。请,你能重写正确的解决方案或给我看一个示例代码吗?我觉得不错(虽然我不懂jpa)。你的代码不是“更合适”,而是把一切搞糟了!(1) 不能将两个不同的参照特性(主引线和第二引线)链接到同一个反向特性。(2) 您的
Person
::
team
属性表示团队成员关联,而
team
mainLeader
(和
secondLeader
)属性表示领导关联。@gwag我不知道它是否正确。我正在尝试并等待一个符合uml图的解决方案,但是您在问题中提供的代码确实符合您的类图。只有一些问题,如果你的类图是以正确的方式完成的(比如在
团队
端使用强制而不是可选的关联);抱歉,如果它增加了混乱。我在深入研究你的规格,而不是回答你的问题。我今天回来添加了一个代码片段示例,但我认为在没有看到规范和uml的情况下,所做的更改可能超出了需要或允许的范围。gwag认为您所做的更改不起作用是正确的。