繁体   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