Java 一元双向关联
我是UML图的新手,我想编写下面的一个图,其中有一个OneToOne双向关联,带有JPA注释 背景:有个人和团队。每个团队由人组成,每个人只能属于一个团队。团队始终有一个人担任主要领导,也可以选择另一个领导 基于此,我编写了下面的代码,但我不确定它是否正确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
@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认为您所做的更改不起作用是正确的。