2013-03-13 75 views
0

我想了解一个现有的应用程序使用休眠,我有一些知识。在这个应用程序中,已经创建了一个数据库模式,并且类已经从数据库模式中自动生成。了解/设置休眠配置

让我们在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查询得到ObjectList<Object>,则此ObjectPerson成员是否完全加载?我应该如何设置hibernate以确保它是?

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

+0

'Set'用于双向参考。一个'Object'通过所有者引用知道它的所有者,一个'Person'通过'Set'知道它的所有'Object's。 – 2013-03-13 13:42:02

回答

0

你得到LazyInitializationException异常,因为在你的客户端应用程序,在你的“对象”你的“人”字段中的值对象没有初始化(它们没有赋值)。您正试图访问Hibernate实体的未初始化字段,而不打开Hibernate Session,因此Hibernate无法获取该值。如你所说,你必须确保你得到'对象'实例及其所有字段初始化。根据你的Hibernate实体的映射方式,有几种可能性(你可以给我们提供映射以便能够以更具体的方式回答你)。举例来说,你可以

  1. 标记为渴望的关系,所以当你的对象你还有的人(要做到这一点的方法取决于映射声明的方式)
  2. 使用在查询Object时显式连接。像这样的事情在HQL(我不知道,如果你使用的HQL要么)

    选择o从对象O,其中o.id =连接抓取o.owner:ID

与此同时,如果你提供给我们更多的细节,我们可以给出更准确的解决方案