我想知道什么是在数据库中存储一棵大对象树的最佳方法。
到目前为止,我有以下几点:

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


提取类型设置为LAZY,因为并非总是需要Element2,而Element2确实是非常大的(其他元素的集合的集合)。

问题是,当我从Servlet检索到Element2类型的元素(会话已关闭)时,(当然)我得到了一个惰性异常。第一个解决方案是急于在查询中获取元素集合,但是我怎么知道什么时候去做呢?我是否必须创建to方法:

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


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

class Element2 {
     @ManyToOne
     Element1 owner;

     .....
}


然后有两种方法:

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


做这种事情的最好方法是什么?

谢谢 !!

最佳答案

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

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

09-12 16:48