2017-04-06 82 views
0

多個多對一關係,我有3間多對一的關係Hibernate的急切和懶惰加載與實體

@Entity 
@Table(name="MANDATE") 
public class Mandate { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name="ID", nullable=false) 
private Long Id; 

@ManyToOne 
@JoinColumn(name="ID_PERSONNE", nullable=false) 
private Person person; 

@Column(name="TITRE", nullable=false) 
private String titre; 

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="ID_LIGUE", nullable=false) 
private League league; 

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="ID_FEDERATION", nullable=false) 
private Federation federation; 

授權類我一個人類的一對多關係

@OneToMany(mappedBy="person", fetch=FetchType.LAZY) 
private Set<Mandat> mandates; 

這意味着,在我的數據庫中一個人可以在聯盟或聯盟中擁有任務。 如果他在聯盟中有任務,那麼聯邦領域將是空的,反之亦然。

但在我的控制器,當我做:

person.getMandates().size(); 

我總是得到一個大小爲0的元素。

產生的Hibernate查詢是這樣看(我簡化它):

SELECT MANDATE.*, LEAGUE.*, FEDERATION.* 
from MANDATE 
inner join LEAGUE on MANDATE.ID_LEAGUE = LEAGUE.ID 
inner join FEDERATION on MANDATE.ID_FEDERATION = FEDERATION.ID WHERE MANDATE.ID_PERSON = 1; 

這意味着生成的請求是尋找與非空聯賽聯合會場mandat領域,但不曾在我的數據庫中爲true。

我注意到,如果我把一個延遲加載到我的領域我正在嘗試的結果:

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="ID_LIGUE", nullable=false) 
private League league; 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="ID_FEDERATION", nullable=false) 
private Federation federation; 

我在做什麼錯?

+0

你已經告訴Hibernate連接列不能爲空。但是你也說過,「如果他在聯盟中有任務,那麼聯盟領域將是空的,而反過來是真的。」聯接列如何不能爲空,同時聯盟爲空。這是矛盾的。 –

+0

就是這樣,謝謝! – Louisprrn

回答

0

這個人可以擁有聯盟或聯盟的任務,這意味着任何一個人在任何時間點都會失效。因此,加入列上的可空值是真實的。因此,你沒有獲得任務數據。

當您使用延遲加載時,單獨針對特定任務的單獨查詢將被觸發而無需加入聯合表,當您調用person對象上的getMandates()時將返回結果。