Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在域模型中处理大型集合的好方法-使用JPA/Hibernate ORM?_Java_Jpa_Service_Mapping_Dns - Fatal编程技术网

Java 在域模型中处理大型集合的好方法-使用JPA/Hibernate ORM?

Java 在域模型中处理大型集合的好方法-使用JPA/Hibernate ORM?,java,jpa,service,mapping,dns,Java,Jpa,Service,Mapping,Dns,我的域类中有一些OneToMany子集合,它们可能会随着时间的推移而增长,以容纳数百个或很可能数千个实例。然而,通常情况下,父母真正需要的只是第一个孩子、最后一个孩子或最大的孩子。让父实例循环通过从数据库加载的大量对象集合似乎效率低下 另一方面,我不想用持久性问题污染我的域模型,并且开始不得不在域类中使用我的DAO来执行查询 我可能会在我的服务方法中添加这些查找,但我真的更喜欢将此登录名放在它所属的域中—尝试避免贫乏的域反模式 有没有一种方法可以在不直接调用DAO的情况下从大型集合中提取特定对象

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

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

我可能会在我的服务方法中添加这些查找,但我真的更喜欢将此登录名放在它所属的域中—尝试避免贫乏的域反模式

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


编辑:应用程序是分层设计的,域模型层位于底部-它不依赖于其他任何东西。其次是持久层,它实现DAOs并依赖于域层。在这两层之上是一个服务层,我正试图通过将业务逻辑向下推到域层来尽可能精简它。

这里有很多选项

或 使用HQL或Criteria查询,甚至下拉到本机SQL来限制结果的数量。换句话说,不要导航集合,而是执行查询以返回所需的N个项 如果是一个选项,您可能至少在某些时候避免访问数据库。 有没有一种方法可以在不直接调用DAO的情况下从大型集合中提取特定对象

我不知道有一个标准的JPA特性允许这样做,我想我会在这里使用自定义查询,JPA不能很好地处理大型集合,这在任何地方都可以找到

以防万一,您可以看看一些专有功能,例如:

@Where和@BatchSize注释参见。 Hibernate的过滤器请参见。
我不确定@Where注释会有多大帮助,除非您为常见用例创建一个特殊的实体和一个胖实体。然而,这里的过滤器可能真的很有趣。我从来没有用过强硬的手段。

1。我已经在使用惰性加载,尽管我无法想象这能给我带来多少好处,因为我必须始终对所有对象进行扫描。2.我可以很容易地编写我想要的查询并将其插入DAO。我的问题是如何以及何时调用它,除非我从我的域层在我的持久层上创建一个循环依赖项。不确定我是否理解你的体系结构,所以我不能很好地评论-今天哪一层与持久层交互?Hibernate过滤器正是医生要求的,但我仍在努力使应用程序在JPA提供商之间保持100%的可移植性。不知道我能坚持多久。如果现在不添加hibernate作为编译时依赖项,那么这是一个100%的运行时依赖项。@HDave:是的,我能理解这一点,因此我提出了第一个建议。但我认为这件事值得一提。