Saya mengalami masalah berikut ketika mencoba memperbarui entitas saya:
"A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance".
Saya memiliki entitas induk dan entitas Set<...>
entitas anak. Ketika saya mencoba untuk memperbaruinya, saya mendapatkan semua referensi untuk diset ke koleksi ini dan mengaturnya.
Kode berikut mewakili pemetaan saya:
@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
return this.children;
}
Saya sudah mencoba untuk membersihkan Set <..> saja, sesuai dengan ini: Cara "mungkin" menyelesaikan masalah tetapi tidak berhasil.
Jika Anda punya ide, beri tahu saya.
Terima kasih!
java
hibernate
hibernate-mapping
axcdnt
sumber
sumber
something.manyother.remove(other)
jikamanyother
aList<T>
. Buat banyak yang bisa berubah, sukaArrayList<T>
dan gunakanorphanDelete = true
Jawaban:
Periksa semua tempat di mana Anda menetapkan sesuatu untuk sonEntities. Tautan yang Anda referensikan secara jelas menunjukkan pembuatan HashSet baru tetapi Anda dapat memiliki kesalahan ini setiap kali Anda menetapkan ulang set. Sebagai contoh:
Biasanya Anda hanya ingin "baru" set sekali dalam konstruktor. Setiap kali Anda ingin menambah atau menghapus sesuatu ke dalam daftar, Anda harus mengubah isi daftar alih-alih menetapkan daftar baru.
Untuk menambah anak:
Untuk menghapus anak-anak:
sumber
Metode:
berfungsi jika
parentEntity
terlepas dan lagi jika kita memperbaruinya.Tetapi jika entitas tidak terlepas dari per konteks, (yaitu menemukan dan memperbarui operasi dalam transaksi yang sama) metode di bawah ini berfungsi.
sumber
Ketika saya membaca di berbagai tempat yang hibernate tidak suka Anda tetapkan ke koleksi, saya berasumsi bahwa hal paling aman untuk dilakukan adalah dengan membuatnya menjadi final seperti ini:
Namun, ini tidak berhasil, dan Anda mendapatkan kesalahan "tidak lagi direferensikan" yang ditakuti, yang sebenarnya cukup menyesatkan dalam kasus ini.
Ternyata hibernate memanggil metode setRoles Anda DAN ia ingin kelas koleksi khusus diinstal di sini, dan tidak akan menerima kelas koleksi Anda. Ini membuat saya bingung untuk waktu yang lama, meskipun membaca semua peringatan tentang tidak menetapkan koleksi Anda dalam metode yang Anda tentukan.
Jadi saya berubah menjadi ini:
Sehingga pada panggilan pertama, hibernate menginstal kelas khusus, dan pada panggilan selanjutnya Anda dapat menggunakan metode ini sendiri tanpa merusak semuanya. Jika Anda ingin menggunakan kelas Anda sebagai kacang, Anda mungkin memerlukan setter yang berfungsi, dan ini setidaknya berfungsi.
sumber
List<String> list = new ArrayList<>();
. Mengubahnya untukList<String> list = null;
memperbaiki masalah :)Sebenarnya, masalah saya adalah tentang sama dan kode hash entitas saya. Kode lama dapat menyebabkan banyak masalah, jangan pernah lupa untuk memeriksanya. Yang saya lakukan hanyalah terus menghapus strategi anak yatim dan memperbaiki persamaan dan kode hash.
sumber
Saya memiliki kesalahan yang sama. Masalahnya bagi saya adalah, bahwa setelah menyimpan entitas koleksi yang dipetakan masih nol dan ketika mencoba untuk memperbarui entitas pengecualian dilemparkan. Apa yang membantu saya: Menyimpan entitas, lalu menyegarkan (koleksi tidak lagi nol) dan kemudian melakukan pembaruan. Mungkin menginisialisasi koleksi dengan ArrayList baru () atau sesuatu mungkin membantu juga.
sumber
MEMILIKI JENIS HUBUNGAN:
Jangan mencoba instantiate koleksi ketika dideklarasikan
hasMany
, cukup tambahkan dan hapus objek.GUNAKAN JENIS HUBUNGAN:
Tetapi koleksi bisa menjadi nol hanya ketika dinyatakan sebagai properti (gunakan relasi) dan tidak diinisialisasi dalam deklarasi.
sumber
Saya menggunakan pendekatan @ user2709454 dengan sedikit peningkatan.
sumber
Saya memiliki masalah ini ketika mencoba menggunakan
TreeSet
. Saya menginisialisasioneToMany
denganTreeSet
yang bekerjaTapi, ini akan membawa kesalahan yang dijelaskan di
question
atas. Jadi sepertinya ituhibernate
didukungSortedSet
dan kalau kita ubah saja baris di atas menjadiitu bekerja seperti sihir :) info lebih lanjut tentang
hibernate SortedSet
bisa ada di sinisumber
Satu-satunya saat saya mendapatkan kesalahan ini adalah ketika saya mencoba meneruskan NULL ke setter untuk koleksi. Untuk mencegah ini, setter saya terlihat seperti ini:
sumber
Saya mengalami ini ketika memperbarui entitas dengan permintaan posting JSON. Kesalahan terjadi ketika saya memperbarui entitas tanpa data tentang anak-anak, bahkan ketika tidak ada. Menambahkan
ke tubuh permintaan memecahkan masalah.
sumber
Salah satu penyebab lainnya mungkin menggunakan lombok.
@Builder
- Menyebabkan menyimpanCollections.emptyList()
bahkan jika Anda mengatakan.myCollection(new ArrayList());
@Singular
- Mengabaikan default level kelas dan meninggalkan bidangnull
bahkan jika bidang kelas dinyatakan sebagaimyCollection = new ArrayList()
2 sen saya, hanya menghabiskan 2 jam dengan hal yang sama :)
sumber
Saya mendapatkan
A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance
ketika saya sedang mengaturparent.setChildren(new ArrayList<>())
. Ketika saya berubah menjadiparent.getChildren().clear()
, itu memecahkan masalah.Periksa detail lebih lanjut: HibernateException - Koleksi dengan cascade = "all-delete-yatim" tidak lagi dirujuk oleh instance entitas yang memiliki .
sumber
Saya menggunakan Spring Boot dan memiliki masalah ini dengan koleksi, meskipun tidak secara langsung menimpanya, karena saya mendeklarasikan bidang tambahan untuk koleksi yang sama dengan serializer kustom dan deserializer untuk memberikan representasi yang lebih ramah-ramah dari frontend. data:
Tampaknya bahwa meskipun saya tidak Timpa koleksi sendiri , deserialization melakukannya di bawah tenda, memicu masalah ini semua sama. Solusinya adalah mengubah setter yang terkait dengan deserializer sehingga akan menghapus daftar dan menambahkan semuanya, daripada menimpanya:
sumber
Saya memiliki masalah yang sama, tetapi ketika set adalah nol. Hanya di Set koleksi di daftar pekerjaan temukan. Anda dapat mencoba anotasi hibernasi @LazyCollection (LazyCollectionOption.FALSE) yang ditanamkan pada anotasi JPA fetch = FetchType.EAGER.
Solusi saya: Ini adalah konfigurasi saya dan berfungsi dengan baik
sumber
Saya mengalami kesalahan yang sama ketika saya menambahkan objek anak ke daftar Objek Anak yang ada.
Apa yang memecahkan masalah saya berubah menjadi:
Sekarang anak itu dihidupkan kembali dengan detail lain dan itu bekerja dengan baik.
sumber
Menambahkan jawaban bodoh saya. Kami menggunakan Spring Data Rest. Ini adalah hubungan standar kami yang cantik. Pola itu digunakan di tempat lain.
Dengan hubungan yang kami ciptakan, selalu dimaksudkan agar anak-anak ditambahkan melalui repo mereka sendiri. Saya belum menambahkan repo. Tes integrasi yang kami lakukan sedang menjalani siklus hidup lengkap entitas melalui panggilan REST sehingga transaksi akan ditutup di antara permintaan. Tidak ada repo untuk anak berarti json memiliki anak-anak sebagai bagian dari struktur utama daripada di
_embedded
. Pembaruan ke orang tua kemudian akan menyebabkan masalah.sumber
Solusi berikut berhasil untuk saya
sumber
Alih-alih menugaskan koleksi baru
Ganti semua elemen dengan
sumber
hati-hati dengan
Metode ini juga memecah hibernate.
sumber
Mungkin disebabkan oleh
hibernate-enhance-maven-plugin
. Ketika saya mengaktifkanenableLazyInitialization
properti, pengecualian ini mulai terjadi pada koleksi malas saya. Saya menggunakan hibernate 5.2.17.Final.Perhatikan dua masalah hibernasi ini:
sumber
Milik saya benar-benar berbeda dengan Spring Boot! Bagi saya itu bukan karena pengaturan properti koleksi.
Dalam pengujian saya, saya mencoba membuat entitas dan mendapatkan kesalahan ini untuk koleksi lain yang tidak digunakan!
Setelah mencoba begitu banyak, saya baru saja menambahkan
@Transactional
metode pengujian dan menyelesaikannya. Tapi jangan alasan.sumber
Ini berbeda dengan jawaban sebelumnya, saya memiliki kesalahan yang persis sama: "Koleksi dengan cascade =" all-delete-yatim piatu "tidak lagi dirujuk ...." ketika fungsi setter saya terlihat seperti ini:
Dan kemudian menghilang ketika saya mengubahnya ke versi sederhana:
(versi hibernasi - mencoba keduanya 5.4.10 dan 4.3.11. Menghabiskan beberapa hari mencoba segala macam solusi sebelum kembali ke tugas sederhana dalam setter. Bingung sekarang mengapa ini terjadi.)
sumber