【问题标题】:Good way to handle large collection in a domain model - with JPA/Hibernate ORM?在域模型中处理大型集合的好方法 - 使用 JPA/Hibernate ORM?
【发布时间】:2011-03-10 18:44:53
【问题描述】:

我的域类中有一些 OneToMany 子集合,它们可能会随着时间的推移而增长,以容纳数百或(很可能)数千个实例。然而,很多时候父母真正需要的只是“第一个”孩子或“最后一个”孩子或“最大”的孩子。让父实例遍历从数据库加载的大量对象集合似乎效率低下。

另一方面,我不想因为持久性问题而污染我的域模型,并开始不得不在域类中使用我的 DAO 来执行查询。

我可能会将这些查找放在我的服务方法中,但我更喜欢将此登录名放在我所属的域中——试图避免“贫血域”反模式。

有没有办法在不直接调用 DAO 的情况下从大型集合中提取“特定”对象?我忽略了一些 JPA ORM 映射功能?

编辑: 应用程序是分层设计的,域模型层位于底部——它不依赖于其他任何东西。旁边是实现 DAO 并依赖于领域层的持久层。在它们之上是一个服务层,我试图通过将业务逻辑下推到领域层来保持它尽可能薄。

【问题讨论】:

    标签: java jpa service mapping dns


    【解决方案1】:

    这里有很多选择

    1. Use lazy-loadingbatch fetching
    2. 使用 HQL 或 Criteria 查询,甚至下拉到原生 SQL 来限制结果的数量(换句话说,不是在集合中导航,而是执行查询以返回您想要的 N 个项目)
    3. 如果caching 是一个选项,您可能至少在某些时候可以避免访问数据库。

    【讨论】:

    • 1.我已经在使用延迟加载,尽管我无法进行成像,因为我必须始终遍历所有对象。 2.我可以很容易地写出我想要的查询并坚持一个DAO。然后我的问题是如何以及何时调用它,除非我从我的域层创建对我的持久层的循环依赖。
    • 不确定我是否了解你的架构,所以我不能很好地评论 - 今天哪个层与持久层接口?
    【解决方案2】:

    有没有办法在不直接调用 DAO 的情况下从大型集合中提取“特定”对象?

    我不知道有一个标准的 JPA 功能允许这样做,我想我会在这里使用自定义查询(“JPA 不能很好地处理大型集合”是随处可见的)。

    以防万一,不妨看看一些专有功能,例如:

    我不确定@Where 注释是否会有帮助(除非您为常见用例创建一个特殊实体和一个“胖”实体)。但是,过滤器在这里可能真的很有趣。我从来没有用过它们。

    【讨论】:

    • Hibernate 过滤器正是医生所要求的,但我仍在努力使应用程序在 JPA 提供商之间保持 100% 可移植性。不知道我能坚持多久。任何方式都可以在不添加休眠内容作为编译时依赖的情况下执行此操作(现在它是 100% 的运行时依赖)。
    • @HDave:是的,我可以理解(因此是第一个建议)。但我认为值得一提的是过滤器。
    猜你喜欢
    • 2011-02-15
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多