我正在尝试使用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查询获得Object
或List<Object>
,那么此Person
的{{1}}成员是否已满载?我应该如何设置休眠以确保它是什么?
我问,因为在我的应用程序中,我将hibernate会话作为单独的可执行文件运行,另一个被驱逐的应用程序与hibernate应用程序通信并要求它发送一些持久对象。我可以获得Object
,但如果在此对象上我生成Object
,我会遇到object.getPerson().getFirstname()
答案 0 :(得分:0)
您正在获取LazyInitializationException,因为在您的客户端应用程序中,“Object”对象中“Person”字段的值未初始化(它们没有指定的值)。您正在尝试访问Hibernate实体的未初始化字段而不打开Hibernate会话,因此Hibernate无法获得该值。
正如您所说,您必须确保收到所有字段已初始化的“对象”实例。根据您的Hibernate实体的映射方式,有几种可能性(最好为您提供映射,以便能够以更具体的方式回答您)。例如,你可以
查询Object时使用显式连接。在HQL中有这样的东西(我不知道你是否也在使用HQL)
从Object o join fetch o.owner中选择o,其中o.id =:id
如果您向我们提供更多详细信息,我们可以提供更准确的解决方案