了解/设置hibernate配置

时间:2013-03-13 13:37:13

标签: java hibernate

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

让我们以DB中的2个表为例:

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

在表格OBJECT中,owner_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>,那么此Person的{​​{1}}成员是否已满载?我应该如何设置休眠以确保它是什么?

我问,因为在我的应用程序中,我将hibernate会话作为单独的可执行文件运行,另一个被驱逐的应用程序与hibernate应用程序通信并要求它发送一些持久对象。我可以获得Object,但如果在此对象上我生成Object,我会遇到object.getPerson().getFirstname()

1 个答案:

答案 0 :(得分:0)

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

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

  1. 将关系标记为渴望,因此当您获得Object时,您也会获得Person(执行此操作的方式取决于声明映射的方式)
  2. 查询Object时使用显式连接。在HQL中有这样的东西(我不知道你是否也在使用HQL)

    从Object o join fetch o.owner中选择o,其中o.id =:id

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