【发布时间】:2011-02-03 23:40:51
【问题描述】:
假设我们有 Group -> Member (ManyToMany)
对于给定的一组成员 - 找出是否为这些成员创建了组的最实用方法是什么? (没有额外或缺席的成员)
这感觉不对,因为 Group 似乎是由它的状态定义的,但是系统要求我们只为特定的成员组合(包括订单!)拥有一个 Group
编辑:
我正在寻找一种使用 JPA 来完成此任务的方法 - 所以 Set.retainAll 似乎并不适用。
我的意思是,这将是完美的:
List<Member> members;
... // members gets assigned
TypedQuery<Group> query = entityManager.createQuery("select g from Group g where g.members = ?", Group.class)
query.setParameter(1, members);
Group group = query.getSingleResult();
当然不是这样的。考虑最糟糕的实现
List<Group> groups = entityManager.createQuery("select g from Group g", Group.class).getResultList();
for (Group g: groups) {
if (g.getMembers().equals(members)) {
return g;
}
}
这两者之间的某个地方必须是我缺少的东西。
【问题讨论】:
-
到目前为止我想出的一个技巧是存储一个哈希,然后完全验证成员集合(以防止哈希冲突)。
-
您是在寻找一种查找机制,还是希望阻止应用程序在多线程环境中创建具有相同成员的两个组?
-
只是查找机制就可以了——这是处理一堆必须分组的项目列表的问题,但是如果我们处理一个已经被分组的项目列表,我们必须更新该组而不是创建一个新组。
-
如果我让成员知道他们的组,那么我想我可以让每个成员,选择组,然后递归地将每个 List
相交到下一个,如果没有组是常见的,创建它,否则,验证组中的成员数与被测试的成员数相同(以防止更大的组匹配应被视为不同组的成员子集)。我将不得不针对 hash-hack 进行测试,看看哪个效果更好。
标签: java hibernate jpa domain-driven-design