我是UML图的新手,想要编写下面的代码,其中有一个OneToOne双向双向关联,带有JPA注释。
背景:有人和团队。每个团队由人组成,每个人只能属于一个团队。团队总是有一个人担任主要领导者,并且可以选择拥有第二个领导者。
基于此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;
}
答案 0 :(得分:3)
关联名称表示要使用的角色。 Main Leader
可能对应于角色mainLeader
。所以我只想在Team
中创建一个属性。
但是由于这些关联只是被命名并且没有角色,所以你可以在愿望中创建角色。这应该来自上下文。
答案 1 :(得分:0)
对于两个一对一的双向关联,具有JPA注释的相互引用属性的实体类代码看起来非常好。这只是你的类图看起来不太好,因为你没有使用引用属性的名称(例如mainLeader
)作为相应的关联结束,并且你不使用关联结束所有权点用于指示关联结束将被实现为另一方的类中的相应属性。
您可以在开放存取手册使用Java,JPA和JSF 构建后端Web应用程序的Chapter 15中找到以下双向关联示例。
在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_authors
和BOOK_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;
}