0

我正在尝试使用我有一些知识的hibernate来理解现有的应用程序。在这个应用程序中,已经创建了一个数据库模式,并且已经从 DB 模式自动生成了类。

让我们以 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 查询得到一个Object或一个,这个成员是否已满载?我应该如何设置休眠以确保它是?List<Object>PersonObject

我之所以问是因为在我的应用程序中,我将休眠会话作为单独的可执行文件运行,而另一个被驱逐的应用程序与休眠应用程序通信并要求它发送一些持久对象。我可以得到一个,Object但是如果我在这个对象上制作object.getPerson().getFirstname(),我会遇到一个org.hibernate.LazyInitializationException: could not initialize proxy - no Session

4

1 回答 1

0

您收到 LazyInitializationException 是因为在您的客户端应用程序中,您的“对象”对象中的“人员”字段的值未初始化(它们没有分配值)。您正在尝试访问 Hibernate 实体的未初始化字段而没有打开 Hibernate 会话,因此 Hibernate 无法获得该值。

正如您所说,您必须确保收到所有字段都已初始化的“对象”实例。根据您的 Hibernate 实体的映射方式,有几种可能性(最好向我们提供映射以便能够以更具体的方式回答您)。例如,你可以

  1. 将关系标记为渴望,这样当您获得对象时,您也会获得人(执行此操作的方式取决于声明映射的方式)
  2. 查询对象时使用显式连接。HQL 中的类似内容(我不知道您是否也在使用 HQL)

    select o from Object o join fetch o.owner where o.id = :id

同样,如果您向我们提供更多详细信息,我们可以提供更准确的解决方案

于 2013-03-13T14:43:29.107 回答