我想知道什么是在数据库中存储一棵大对象树的最佳方法。
到目前为止,我有以下几点:
@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的方法。不过,我会为这些方法选择更有意义的名称。