2013-02-23 57 views
0

我在我的「假面」這關係實體我有FetchType.LAZY和休眠對象仍然加載

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "persona") 
private Empleado empleado; 

在我的「Empleado」實體我有這個關係

@OneToMany(cascade = CascadeType.ALL, mappedBy = "empleado", fetch = FetchType.EAGER) 
private Set<Trabajo> trabajos = new HashSet<Trabajo>(); 

而我在我的「Trabajo」實體這個關係

@BatchSize(size = 100) 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "trabajo", fetch = FetchType.LAZY) 
private Set<Atencion> atenciones = new HashSet<Atencion>(); 

而且通過googlecode上

@Override 
public Persona acceder(String login, String password) { 
    Search s = new Search(); 
    s.addFilterEqual("usuario", login); 
    s.addFilterEqual("clave", password); 
    return searchUnique(s); 
} 

提供。當我得到它加載誰擁有渴望的fecth對象結果對象這種登錄方式,一切都OK了,除了在「特拉瓦霍」實體「Atenciones「set獲取加載或者它有LAZY獲取。我怎樣才能解決這個問題?

在我的Trabajo實體中,我有其他@OneToMany關係有LAZY fetch,但仍然有加載對象,我不知道爲什麼。

當我使用推土機mapperService時,它映射所有整個樹對象,我可以看到所有不應該出現的對象。

+0

您如何診斷急切加載的天線? – 2013-02-23 23:34:20

+0

@JBNizet我說,因爲當推土機映射器完成後,我可以看到所有巨大的樹木對象。我看不到你的答案,所以我認爲你得到它之前,我回答:) – dimondi21 2013-02-25 02:05:01

回答

0

關於懶加載here有一個很好的解釋。你所看到的可能是代理對象。檢查sql開啓以驗證數據是否真的從db加載。如果沒有與'Atencion'相關的表的查詢,請不要擔心。

您的推土機映射可能會訪問'atenciones'元素正在導致從db中加載記錄。如果您不希望發生這種情況,應該有辦法從映射中排除某些字段。

+0

是的,你是對的,解決方案是在這裏http://dozer.sourceforge。net/documentation/exclude.html – dimondi21 2013-02-25 02:21:04

2

延遲加載並不意味着數據將不會被加載。這意味着只有當您(或者Dozer,在這種情況下)要求其數據時纔會加載數據。

假設你有一個實體管理器,一個OneToMany與一個實體工人。假設該關聯是延遲加載的。這裏將會發生什麼:

Manager manager = session.get(Manager.class, 1L); 
// the above line loads the manager data from the database, using a SQL query 

List<Worker> workers = manager.getWorkers(); 
// the workers variable references a Hibernate-specific list which is lazy-loaded. 
// It doesn't contain any data until a method is called on it 

int size = workers.size(); 
// calling any method of the list will cause a SQL query to be executed. This 
// SQL query will load the workers of the manager from the database, and fill the list 
// finally, the size of the list will be returned. 

這很懶,因爲它只在你確實需要的時候加載。

因此,如果您不想在使用推土機進行地圖繪製時將經理與經理交還,請確保推土機不會試圖找工人。有兩個簡單的解決方案,以做到這一點:

  • 不要用推土機(這很爛,恕我直言)
  • Manager實體映射到ManagerDTO類不包含工人名單。
+0

¿您推薦使用哪一個以及爲什麼dozer會使用:(有沒有一種方法可以配置dozer以便不通過worker列表?如果我手動映射列表,它會變成地獄我:D – dimondi21 2013-02-25 02:05:26

+0

我無法抹掉我的經理名單,我用它來做其他事情,所以我認爲我有時候會手動繪製它。我非常感謝你的回覆 – dimondi21 2013-02-25 02:20:07

+0

我發現推土機很糟糕,因爲它會讓東西這對於手動操作來說是微不足道的,但需要不必要的setter方法,破壞封裝和優秀的設計才能實現這一點。如果您在一個類中重命名屬性而無需在另一個類中重命名屬性,它就會靜靜地中斷。 – 2013-02-25 08:03:29