2013-03-13 111 views
0

我想了解一個現有的應用程序使用休眠,我有一些知識。在這個應用程序中,已經創建了一個數據庫模式,並且類已經從數據庫模式中自動生成。瞭解/設置休眠配置

讓我們在DB 2代表的例子:

PERSON(id, firstname, surname) 
    OBJECT(id, owner_id, description) 

在表OBJECTowner_id將是一個外鍵PERSON.id

生成的類看起來大致這樣:

class Person { 
    // ok for the following 
    int id; // with getters and setters 
    String firstname; // with getters and setters 
    String surname; // with getters and setters 

    // dunno why the following ? 
    Set objects = new HashSet(0); 
    Set getObjects() { return this.objects; } 
    void setObjects(Set objects) this.objects = objects; } 
} 

class Object { 

    int id; // with getters and setters 
    Person owner; // with getters and setters 
    String description; // with getters and setters 
} 

首先,我不知道爲什麼會出現在集生成的Person類擁有的對象的引用。第二,如果通過HQL查詢得到ObjectList<Object>,則此ObjectPerson成員是否完全加載?我應該如何設置hibernate以確保它是?

我在問,因爲在我的應用程序中,我將hibernate會話作爲單獨的可執行文件運行,另一個與hibernate應用程序通信的遞歸應用程序,並要求它發送一些持久對象。我可以得到一個Object,但如果這個對象上我做object.getPerson().getFirstname(),我碰上一個org.hibernate.LazyInitializationException: could not initialize proxy - no Session

+0

'Set'用於雙向參考。一個'Object'通過所有者引用知道它的所有者,一個'Person'通過'Set'知道它的所有'Object's。 – 2013-03-13 13:42:02

回答

0

你得到LazyInitializationException異常,因爲在你的客戶端應用程序,在你的「對象」你的「人」字段中的值對象沒有初始化(它們沒有賦值)。您正試圖訪問Hibernate實體的未初始化字段,而不打開Hibernate Session,因此Hibernate無法獲取該值。如你所說,你必須確保你得到'對象'實例及其所有字段初始化。根據你的Hibernate實體的映射方式,有幾種可能性(你可以給我們提供映射以便能夠以更具體的方式回答你)。舉例來說,你可以

  1. 標記爲渴望的關係,所以當你的對象你還有的人(要做到這一點的方法取決於映射聲明的方式)
  2. 使用在查詢Object時顯式連接。像這樣的事情在HQL(我不知道,如果你使用的HQL要麼)

    選擇o從對象O,其中o.id =連接抓取o.owner:ID

與此同時,如果你提供給我們更多的細節,我們可以給出更準確的解決方案