假设我有这样一个实体
@Entity
Class A{
//fields
@Onetomany
Set<B> b; //
}
现在,我如何限制集合中“B”的数量,当集合中有新条目时,最旧的条目将被删除,例如 removeEldestEntry我们有一个 LinkedHashMap。
我正在使用带有 Hibernate 的 MySQL 5.5 数据库。提前致谢。
编辑
我的目标是在任何时候该表中的条目数都不超过 N。 我拥有的一个解决方案是使用一个 Set 并安排一个作业来删除旧条目。但是我觉得很脏。我正在寻找更清洁的解决方案。
最佳答案
我会使用代码手动执行此规则。主要思想是集合 B 应该被很好地封装,这样客户端只能通过公共(public)方法(即 addB()
)更改其内容。只需确保此方法内的此规则 (addB()
) 即可确保集合 B 内的条目数不能大于一个值。
答:
@Entity
public class A {
public static int MAX_NUM_B = 4;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private Set<B> b= new LinkedHashSet<B>();
public void addB(B b) {
if (this.b.size() == MAX_NUM_B) {
Iterator<B> it = this.b.iterator();
it.next();
it.remove();
}
this.b.add(b);
}
public Set<B> getB() {
return Collections.unmodifiableSet(this.b);
}
}
乙:
@Entity
public class B{
@ManyToOne
private A a;
}
要点:
- A 应该是关系的所有者。
- 在 A 中,不要简单地返回 B,因为客户端可以绕过
addB(B b)
中实现的检查逻辑并自由更改其内容。相反,返回 B 的不可修改 View 。 - 在 @OneToMany 中,将
orphanRemoval
设置为 true 以告知 JPA 在从 B 集合中删除相应实例后删除 B 的数据库记录。
关于java - 限制 JPA 中集合的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14009119/