[英]Understanding/Setting up hibernate configuration
我正在尝试使用休眠技术来了解现有的应用程序,而我对此有一些了解。 在此应用程序中,已创建数据库模式,并且已从数据库模式自动生成类。
让我们以数据库中的两个表为例:
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查询获得Object
或List<Object>
,则此Object
的Person
成员是否已完全加载? 我应该如何设置休眠以确保其休眠?
我之所以问是因为,在我的应用程序中,我将休眠会话作为单独的可执行文件运行,而另一个驱逐出境的应用程序与休眠应用程序进行通信,并要求它发送一些持久对象。 我可以获取一个Object
但是如果在此对象上创建object.getPerson().getFirstname()
,则会遇到org.hibernate.LazyInitializationException: could not initialize proxy - no Session
之所以得到LazyInitializationException,是因为在客户端应用程序中,“对象”对象中“人”字段的值未初始化(它们没有分配值)。 您试图在未打开Hibernate会话的情况下访问Hibernate实体的未初始化字段,因此Hibernate无法获得该值。
如您所说,您必须确保收到的“对象”实例的所有字段均已初始化。 根据您的Hibernate实体的映射方式,有几种可能性(为您提供映射方式,以便能够以更具体的方式回答您是一个好主意)。 例如,您可以
查询对象时,请使用显式联接。 HQL中类似这样的东西(我也不知道您是否也在使用HQL)
从对象o中选择o加入o.owner,其中o.id =:id
同样,如果您向我们提供更多详细信息,我们可以提供更准确的解决方案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.