Hibernate ORM:过滤实体上的惰性集合的模式
我把这个问题作为语言和框架不可知论来发帖,因为我认为它可能是ORM框架的通用问题 我想知道是否有人能告诉我以下用例是否有设计模式: 用例 该系统是使用ORM框架运行的模型-视图-控制器web应用程序 游戏中有两个实体Hibernate ORM:过滤实体上的惰性集合的模式,hibernate,orm,doctrine-orm,Hibernate,Orm,Doctrine Orm,我把这个问题作为语言和框架不可知论来发帖,因为我认为它可能是ORM框架的通用问题 我想知道是否有人能告诉我以下用例是否有设计模式: 用例 该系统是使用ORM框架运行的模型-视图-控制器web应用程序 游戏中有两个实体Poll和Vote 一个Poll与Vote具有One-to-many关系,并且投票位于延迟加载的集合中 系统中的每个用户只能对一次投票进行投票 为了用户体验,视图最好通过仅显示当前用户尚未投票的投票的控件来进行调整,因此投票有一个方法(伪代码): 这样,当控制器向视图传递轮询时,它可
Poll
和Vote
一个Poll
与Vote
具有One-to-many
关系,并且投票位于延迟加载的集合中
系统中的每个用户只能对一次投票进行投票
为了用户体验,视图最好通过仅显示当前用户尚未投票的投票的控件来进行调整,因此投票
有一个方法(伪代码):
这样,当控制器
向视图
传递轮询
时,它可以通过执行if Poll.hasVoteFor(user)
来呈现正确的控件
问题
上述方法的问题在于,由于集合是延迟加载的,因此对其进行迭代可能会占用大量内存&db
使用SQL/DQL/SQL,您显然可以使用数据库直接查询用户投票的Poll
实体,但是任何此类查询都应该发生在我假设视图
不应该访问的存储库中
解决方案?
所以我想知道是否有一种设计模式可以解决这个问题
控制器
是否应具有类似于hasVoteFor(轮询,用户)
的方法?如果视图呈现多个轮询,则会出现问题。(当视图
迭代轮询
时,对于每个轮询具有多个条件的查询将比执行多个选择更快。)
控制器
是否应使用存储库查询用户预先投票的所有轮询
,并将其与轮询
(或轮询
数组)一起传递到视图
。这种方式打破了Poll
拥有hasVoteFor
方法的简洁抽象——ORM不应该让你只考虑你的对象吗?;)
- 我忽略了实践中常用的其他解决方案
ORM只是一种帮助您处理数据库的工具。但数据库仍然是有效查询要显示的数据的最佳工具。使用ORM而不了解和关心数据库以及生成的查询是一种灾难
您的第二个解决方案比第一个好,但它仍然没有它可能的逻辑和效率
控制器可以执行一个查询,返回包含每个轮询数据的PollWithVoteFlag实例列表,而不是查询要显示的一个或多个轮询,然后查询用户已投票的轮询,并将这两个集合传递给视图,还有一个标志,指示用户是否对投票进行了投票。谢谢你的回答,听起来不错-关于ORM应该如何运行,我知道我遗漏了一些东西,因为我可以看到,如果只关心我的对象而不是使用某种查询语言,会对性能产生什么影响。使用带标记的辅助对象听起来也不错,可以将其保持在一起,并防止视图必须比较两个数据集合来确定发生了什么。
public boolean hasVoteFor(user) {
for each vote
if vote.user == user
return true
return false
}