簡體   English   中英

了解/設置休眠配置

[英]Understanding/Setting up hibernate configuration

我正在嘗試使用休眠技術來了解現有的應用程序,而我對此有一些了解。 在此應用程序中,已創建數據庫模式,並且已從數據庫模式自動生成類。

讓我們以數據庫中的兩個表為例:

   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成員是否已完全加載? 我應該如何設置休眠以確保其休眠?

我之所以問是因為,在我的應用程序中,我將休眠會話作為單獨的可執行文件運行,而另一個驅逐出境的應用程序與休眠應用程序進行通信,並要求它發送一些持久對象。 我可以獲取一個Object但是如果在此對象上創建object.getPerson().getFirstname() ,則會遇到org.hibernate.LazyInitializationException: could not initialize proxy - no Session

之所以得到LazyInitializationException,是因為在客戶端應用程序中,“對象”對象中“人”字段的值未初始化(它們沒有分配值)。 您試圖在未打開Hibernate會話的情況下訪問Hibernate實體的未初始化字段,因此Hibernate無法獲得該值。

如您所說,您必須確保收到的“對象”實例的所有字段均已初始化。 根據您的Hibernate實體的映射方式,有幾種可能性(為您提供映射方式,以便能夠以更具體的方式回答您是一個好主意)。 例如,您可以

  1. 將關系標記為渴望,這樣當您獲得Object時也會獲得Person(完成此方法取決於聲明映射的方式)
  2. 查詢對象時,請使用顯式聯接。 HQL中類似這樣的東西(我也不知道您是否也在使用HQL)

    從對象o中選擇o加入o.owner,其中o.id =:id

同樣,如果您向我們提供更多詳細信息,我們可以提供更准確的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM