Бих използвал кода, за да наложа ръчно това правило. Основната идея е, че колекцията B трябва да бъде добре капсулирана, така че клиентът да може само да променя съдържанието си чрез публичен метод (т.е. 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. - В @OneToMany задайте
orphanRemoval
на истина, за да каже на JPA да премахне DB записите на B, след като съответните му екземпляри бъдат премахнати от колекцията B.