JPA懒惰设计建议

时间:2012-06-12 18:24:42

标签: java hibernate java-ee jpa ejb

我想知道在数据库中存储大型对象树的最佳方法是什么。 到目前为止我还有以下内容:

@Entity
class Element1 {
    @OneToMany(fetch=FetchType.LAZY)
    Collection<Element2> elements;
    ....
}

获取类型设置为LAZY因为并不总是需要Element2,并且可能非常巨大(其他元素集合的集合集合)。

问题是当我从servlet中检索Element2类型的元素时(会话关闭),我得到(当然)一个惰性异常。第一个解决方案是在查询中急切地获取元素集合,但我怎么知道何时这样做?我必须创建方法:

Element1 get(Integer Id);
Element1 getEager(Integer Id);

我想知道我是否可以从Element1中删除字段元素并“反转”映射:

class Element2 {
     @ManyToOne
     Element1 owner;

     .....
}

然后有两种方法:

Element1 get(Integer Id);
Collection<Element2> getElements(Element1 owner);

做这些事情的最佳方式是什么?

谢谢!!

1 个答案:

答案 0 :(得分:1)

你可以做你在问题中描述的所有事情,但第二种选择不是我会做的。如果你需要从element1导航到它的element2列表,那么拥有OneToMany关联就是一个很明显的事情。请注意,关联可以是双向的:您可以选择从父级导航到子级,同时从子级导航到父级。

我会选择你的第一个解决方案:一个只返回element1的方法,另一个返回element1及其子元素的方法。不过,我会为这些方法选择更有意义的名称。