@OrderColumn anotasi di Hibernate 3.5

Saya mencoba menggunakan anotasi @OrderColumn dengan Hibernate 3.5

@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@OrderColumn(name = "pos")
private List<Children> childrenCollection;

Saat mengambil data, semuanya berfungsi dengan baik. Tapi saya tidak bisa menyusun ulang elemen dalam Daftar dan menyimpan pesanan baru ke database.


person Piotr Gwiazda    schedule 02.06.2010    source sumber
comment
Bisakah Anda menunjukkan bagaimana Anda menyusun ulang daftar Anda dan menyimpannya kembali ke database ???   -  person Arthur Ronald    schedule 02.06.2010
comment
Saya sudah mencoba membuat ArrayList baru dan parent.setChildrenCollection(newList) Saya sudah mencoba Collections.sort pada daftar yang diambil. Saya juga mencoba menghapus item nol dari koleksi. Tidak terjadi apa-apa. Perubahan lain pada induk disimpan ke database, tetapi tidak terjadi apa-apa dengan daftarnya.   -  person Piotr Gwiazda    schedule 07.06.2010
comment
bukankah Hibernate 3.5 untuk JPA 1.0, dan @OrderColumn adalah JPA 2.0?!   -  person Neil Stockton    schedule 12.11.2015


Jawaban (3)


Kombinasi @OneToMany(mappedBy="...") dan @OrderColumn tidak didukung oleh Hibernate. Masalah JIRA ini melacak permintaan untuk menampilkan pesan kesalahan yang lebih jelas ketika kombinasi yang tidak valid ini digunakan: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5390

Saya pikir ini tidak didukung terutama karena ini adalah pola relasional yang aneh. Anotasi di atas menunjukkan bahwa sisi "satu" dari hubungan menentukan bagaimana hubungan tersebut akan dimasukkan ke database, tetapi urutan/posisi hanya tersedia di sisi "banyak" dengan memeriksa Daftar. Lebih masuk akal bagi pihak "banyak" untuk memiliki hubungan tersebut, karena pihak tersebut mengetahui baik tentang keanggotaan maupun urutan elemen-elemennya.

Dokumen Anotasi Hibernasi menjelaskan situasi ini secara mendetail:

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection-extratype-indexbidir

Solusinya adalah dengan menghapus atribut "mappedBy", yang akan menyebabkan pengaitan menggunakan strategi tabel gabungan default, bukan kolom pada tabel target. Anda dapat menentukan nama tabel gabungan menggunakan anotasi @JoinTable.

Dampak bersih dari perubahan ini adalah bahwa sisi "banyak" dari hubungan tersebut kini menentukan bagaimana hubungan tersebut dipertahankan. Kode Java Anda perlu memastikan bahwa Daftar diperbarui dengan benar, karena Hibernate sekarang akan mengabaikan sisi "satu" saat membilas entitas.

Jika Anda masih ingin sisi "satu" dapat diakses di Java, petakan dengan

@ManyToOne
@JoinColumn(name="...", insertable=false, updatable=false, nullable=false)
person Peter Centgraf    schedule 13.08.2010
comment
Lucu sekali, contoh resmi untuk kolom indeks eksplisit menggunakan kombinasi @OneToMany(mappedBy="...") + @OrderColumn (lihat contoh 7.8 di docs.jboss.org/hibernate/core/3.6/reference/en-US/html/) - person Chris Lercher; 15.02.2011
comment
Setelah jawaban ini disepakati bahwa situasinya tetap harus didukung. Gail Badner: Saya setuju bahwa @OneToMany (mappedBy=...) harus didukung. - person Arjan Tijms; 09.01.2012
comment
Apakah ada penyedia JPA lain (seperti Eclipselink) yang mendukung @OneToMany (mappedBy="...")? - person deamon; 09.01.2012
comment
Dugaan naif saya adalah bahwa setiap penyedia mendukung hal ini, karena ini merupakan pemetaan yang cukup standar. Seperti biasa, Hibernate adalah yang paling aneh. Ini pada dasarnya adalah IE6 di bawah penyedia JPA :( - person Mike Braun; 09.01.2012
comment
comment
Saya tidak tahu mengapa ini merupakan pola relasional yang aneh. Tidak. Tanyakan saja pada orang-orang JPA. - person Kawu; 04.05.2012
comment
Tautan bug hibernasi buruk, seharusnya hibernate.atlassian.net/browse/HHH-5390 . Saya tidak dapat mengedit postingan. Antrean edit yang disarankan sudah penuh. - person cdalxndr; 22.07.2020
comment
Apakah jawaban ini masih benar di tahun 2021? - person Mathew Alden; 01.03.2021

Lakukan sesuatu seperti ini:

@Entity
class Parent {

    @OneToMany
    @OrderColumn(name = "pos")
    List<Child> children;
}

@Entity
class Child {

    @ManyToOne
    Parent parent;
    @Column(name = "pos")
    Integer index;

    @PrePersist
    @PreUpdate
    private void prepareIndex() {
        if (parent != null) {
            index = parent.children.indexOf(this);
        }
    }
}
person Daniel De León    schedule 18.09.2012
comment
Menurut saya di prepIndex() harus diubah menjadi index = parent.children.indexOf(this); if (indeks == -1) indeks = induk.anak.ukuran(); - person cn123h; 20.02.2015

Anda harus mencoba menentukan OrderColumn pada pemilik asosiasi. Atau dalam pemetaan Anda, Anda menempatkan pemilik pada anak, pemilik harus menjadi orang tua (pada asosiasi dua arah, pemilik adalah orang yang tidak memiliki kata kunci mappedBy, di sini Anda meletakkan kata kunci ini di kelas induk, lalu Anda berarti kelas orang tua bukan pemilik)

Di kelas anak-anak Anda, Anda harus memiliki kata kunci mappedBy di parentCollection. Tapi tidak di ChildrenCollection.
Dan di kelas induk Anda, Anda harus memiliki anotasi @JoinTable, seperti ini :

@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@OrderColumn(name = "pos")
@JoinTable( name = "<NAME_OF_YOUR_TABLE>", joinColumns = @JoinColumn( <JOIN_COLUMNS_...> )
private List<Children> childrenCollection;
person Nico    schedule 08.09.2011