【问题标题】:JPA Lazyness design AdviceJPA 懒惰设计建议
【发布时间】:2012-06-15 16:22:42
【问题描述】:

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

@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);

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

谢谢!!

【问题讨论】:

    标签: java hibernate jakarta-ee jpa ejb


    【解决方案1】:

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

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

    【讨论】:

    • 好的,非常感谢!不过,最后一个问题是,对于 Element1 未完全获取的情况,是否最好使用一种 DTO ?或者我可以坚持原来的 Element1 类吗?最常见的是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多