![](/img/trans.png)
[英]Why hibernate perform two queries for eager load a @OneToOne bidirectional association?
[英]OneToOne Double Bidirectional Association
我是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;
}
關聯名稱表示要使用的角色。 Main Leader
可能對應於角色mainLeader
。 所以我只想在Team
創建一個屬性。
但由於這些關聯只是被命名並且沒有角色,所以您可以在願望中創建角色。 這應該來自上下文。
具有JPA注釋的兩個一對一雙向關聯的相互引用屬性的實體類代碼看起來非常好。 它只是你的類圖看起來不太好,因為你不使用引用屬性的名稱(例如mainLeader
)用於相應的關聯結束,並且你不使用關聯結束所有權點來表示關聯end將作為另一側的類中的相應屬性實現。
您可以在開放式訪問書“ 使用Java,JPA和JSF構建后端Web應用程序”的 第15章中找到以下雙向關聯示例。
在Publisher
類,我們添加publishedBooks
財產,我們使用@OneToMany
相應注釋@ManyToOne
從Book
類,代表着反比關系:
@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
相應注釋@ManyToMany
從Book
表示反向關系類:
@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_ISBN
和AUTHOR_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.