Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Hibernate ORM:过滤实体上的惰性集合的模式_Hibernate_Orm_Doctrine Orm - Fatal编程技术网

Hibernate ORM:过滤实体上的惰性集合的模式

Hibernate ORM:过滤实体上的惰性集合的模式,hibernate,orm,doctrine-orm,Hibernate,Orm,Doctrine Orm,我把这个问题作为语言和框架不可知论来发帖,因为我认为它可能是ORM框架的通用问题 我想知道是否有人能告诉我以下用例是否有设计模式: 用例 该系统是使用ORM框架运行的模型-视图-控制器web应用程序 游戏中有两个实体Poll和Vote 一个Poll与Vote具有One-to-many关系,并且投票位于延迟加载的集合中 系统中的每个用户只能对一次投票进行投票 为了用户体验,视图最好通过仅显示当前用户尚未投票的投票的控件来进行调整,因此投票有一个方法(伪代码): 这样,当控制器向视图传递轮询时,它可

我把这个问题作为语言和框架不可知论来发帖,因为我认为它可能是ORM框架的通用问题

我想知道是否有人能告诉我以下用例是否有设计模式:

用例

该系统是使用ORM框架运行的模型-视图-控制器web应用程序

游戏中有两个实体
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
}