2013-05-02 79 views
2

在我的班級之一,說的位置,我有這樣的事情:條件/複合JoinColumn在JPA /休眠

private List<Magician> magicians; 

... 

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL) 
@JoinColumn(name="location_id") 
public List<Magician> getMagicians() { 
    return magicians; 
} 

public void setMagicians(List<Magician> magicians) { 
    this.magicians = magicians; 
} 

其中魔術師變量

private Integer id; 
private Integer location_id; 
private Boolean active; 

現在我想修改getter註釋,以便只獲得主動爲真的魔術師。

我該如何做到這一點?

感謝您的關注。

+0

好的,感謝JB和Kevin的回答。我的問題的動機是,有些情況下我可能想要限制應用程序訪問的數據集,而不在代碼中引入任何新的方法。所以我會通過將數據庫查詢設置爲true來快速準備數據。 – 2013-05-02 09:31:34

回答

2

首先,魔術師不應該有一個location_id字段。它應該有一個位置類型的字段。這將使兩個實體之間的雙向關聯:

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "location") 
public List<Magician> getMagicians() { 
    return magicians; 
} 

... 

@ManyToOne 
@JoinColumn(name = "location_id") 
public Location getLocation() { 
    return this.location; 
} 

然後,回答你的問題,國家和實體的關聯不是用來實現speciic用例或查詢。您習慣對數據庫包含的內容進行建模。爲了獲得給定位置的主動魔術師,你只需要使用一個查詢:

select m from Magician m where m.active = true and m.location = :location 
+0

感謝您的回覆。至於單向與雙向的觀點,我同意axtavt的評論(http://stackoverflow.com/a/5361587/1966869),「導航訪問並不總是好的,尤其是對於」一對多「和」多對多的關係「......我認爲除非需要雙向使用,否則我不認爲應該使用雙向,特別是在像我這樣的」一對多「無處不在的應用中。認爲這是一個非常相關的問題,你可能有任何進一步的評論是值得歡迎的,將不勝感激。 – 2013-05-02 09:45:59

+0

如果它是一對多,那麼可能有一個很好的理由將它建模爲一個單向的ManyToOne關聯。你將它建模爲一個單向的OneToMany,並且你的魔術師中擁有該位置的ID(這使得你的映射不正確,因爲這個列被映射了兩次),所以爲什麼不用一個懶惰加載的位置? – 2013-05-02 12:13:45

+0

因爲位置是一個大對象,我通常不需要(或者我已經擁有)我和魔術師一起工作,而我通常只需要location_id。所以我只保留了location_id id。至於你的觀察,它被映射了兩次,據我瞭解,如果關係是雙向的,它將被映射兩次,即如果我遵循了你的建議(我很欣賞,所以如果我錯了,請糾正我)。 – 2013-05-02 14:02:57

1

在實體層面,我不會進行這項工作,而不是我會使用EntityManager創建一個查詢執行它。正如JB提到你需要將位置添加爲一個複合對象而不是整數。

//在方法

List<Magician> magicians = 
    em.createQuery("select m from Location l join Magician m where m.active = true and 
    l.[specify id here] = :locationId", Magician.class).setParameter("locationId", 
    1).getResultList();