Saya akan menggunakan kode untuk menegakkan aturan ini secara manual. Ide utamanya adalah bahwa koleksi B harus dienkapsulasi dengan baik sehingga klien hanya dapat mengubah kontennya dengan metode publik (yaitu addB()
) . Cukup pastikan aturan ini di dalam metode ini (addB()
) untuk memastikan bahwa jumlah entri di dalam koleksi B tidak boleh lebih dari satu nilai.
J:
@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);
}
}
B:
@Entity
public class B{
@ManyToOne
private A a;
}
Poin utama:
- A harus menjadi pemilik hubungan.
- Dalam A , jangan hanya mengembalikan B karena klien dapat melewati logika pemeriksaan yang diterapkan di
addB(B b)
dan ubah kontennya secara bebas. Sebagai gantinya, kembalikan tampilan B yang tidak dapat dimodifikasi. - Di @OneToMany , setel
orphanRemoval
to true untuk memberi tahu JPA untuk menghapus catatan DB B setelah instance yang sesuai dihapus dari koleksi B.