Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Hibernate OneToMany dengan Kunci Utama Komposit yang Tidak Cocok

Tuhan, ini adalah mimpi buruk. Saya akhirnya mengetahuinya dan dalam retrospeksi, itu adalah sesuatu yang seharusnya saya pikirkan lebih awal. Inilah yang berhasil bagi saya jika ada orang lain yang memiliki masalah serupa di masa mendatang.

Masalahnya adalah bahwa Id yang disematkan pada Tabel2 dipetakan secara langsung ke entitas yang sama dengan Id yang disematkan pada Tabel1. Itulah yang saya inginkan dengan database, tetapi bukan yang saya inginkan dengan Hibernate. Sebagai gantinya, dua bidang untuk TabelA dan TabelB harus diwakili oleh Tabel1 itu sendiri, dan pengaitan akan diganti yang ditulis agar sesuai. Mereka perlu menyertakan insertable=false dan updatable=false sehingga Table2 tidak dapat membuat perubahan apa pun pada Table1. Dalam kasus saya, saya hanya menginginkan hubungan satu arah. Table1 kemudian dapat menggunakan parameter mappedBy dari anotasi @OneToMany untuk memetakan langsung ke dirinya sendiri. Hal ini memungkinkan Tabel1 untuk mengontrol hubungan. Jadi, kodenya harus:

@Entity
@AssociationOverrides({
        @AssociationOverride(name = "pk.tableA",
                joinColumns = @JoinColumn(name = "FK_TABLE_A", nullable=false)),
        @AssociationOverride(name = "pk.tableB",
                joinColumns = @JoinColumn(name = "FK_TABLE_B", nullable=false)) })
@Table(name="TABLE1")
public class Table1 extends BaseObject implements Serializable
{
    private static final long serialVersionUID = 1L;

    private Table1Id pk = new Table1Id ();

    @EmbeddedId
    public Table1Id getPk() {
        return pk;
    }
    public void setPk(Table1Id pk) {
        this.pk = pk;
    }

    private TableC tableC;
    @ManyToOne
    @JoinColumn(name = "FK_TABLE_C", referencedColumnName = "ID", nullable = true)
    public TableC getTableC() {
        return this.tableC;
    }
    public void setTableC(TableC tableC) {
        this.tableC = tableC;
    }

    private List<Table2> table2s;
    @OneToMany(mappedBy="pk.table1", cascade = {CascadeType.ALL}, orphanRemoval=true, fetch=FetchType.EAGER)
    public List<Table2> getTable2s() {
        return table2s;
    }
    public void setTable2s(List<Table2> table2s) {
        this.table2s= table2s;
    }

    @Override
    public boolean equals(Object o) {
        ...
    }

    @Override
    public int hashCode() {
        ...
    }

    @Override
    public String toString() {
        ...
    }
}

@Entity
@AssociationOverrides({
        @AssociationOverride(name = "pk.table1",
                joinColumns = {
                        @JoinColumn(name = "FK_TABLE_A", nullable=false, insertable=false, updatable=false),
                        @JoinColumn(name = "FK_TABLE_B", nullable=false, insertable=false, updatable=false)
                        }),
        @AssociationOverride(name = "pk.tableD",
                joinColumns = @JoinColumn(name = "FK_TABLE_D", nullable=false)) })
@Table(name="TABLE2")
public class Table2 extends BaseObject implements Serializable
{
    private static final long serialVersionUID = 1L;

    private Table2Id pk = new Table2Id();

    @EmbeddedId
    public Table2Id getPk() {
        return pk;
    }
    public void setPk(Table2Id pk) {
        this.pk = pk;
    }

    private Double value;
    @Column(name = "VALUE", nullable = false, insertable = true, updatable = true, precision = 2)
    @Basic
    public Double getValue() {
        return this.value;
    }
    public void setValue(Double value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object o) {
        ...
    }

    @Override
    public int hashCode() {
        ...
    }

    @Override
    public String toString() {
        ...
    }
}

@Embeddable
public class Table2Id extends BaseObject implements Serializable 
{
    private static final long serialVersionUID = 1L;

    private Table1 table1;
    @ManyToOne
    @JoinColumn(nullable=false)
    public Table1 getTable1() {
        return this.table1;
    }
    public void setTable1(Table1 table1) {
        this.table1 = table1;
    }

    private TableD tableD;
    @ManyToOne
    @JoinColumn(nullable=false)
    public TableD getTableD() {
        return this.tableD;
    }
    public void setTableD(TableD tableD) {
        this.tableD = tableD;
    }

    @Override
    public boolean equals(Object o) {
        ...
    }

    @Override
    public int hashCode() {
        ...
    }

    @Override
    public String toString() {
        ...
    }
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tampilan terwujud dengan Oracle

  2. java.lang.UnsatisfiedLinkError:tidak ada ocijdbc11 di java. perpustakaan.path

  3. Tidak dapat menjalankan kueri pemilihan dinamis besar dalam prosedur tersimpan

  4. Linq to Entities Group By (OUTER BERLAKU) oracle 11.2.0.3.0 tidak mendukung berlaku

  5. Kesalahan Oracle saat memulai operasi startup/shutdown lain dari instance ini sedang berlangsung