sql >> データベース >  >> RDS >> Oracle

複合主キーが一致しない Hibernate OneToMany

    神様、これは悪夢でした。私はついにそれを理解しましたが、振り返ってみると、それは私が本当にもっと早く考えるべきだったものです.将来、他の誰かが同様の問題を抱えた場合に備えて、私にとってうまくいったことは次のとおりです.

    問題は、Table2 埋め込み ID が Table1 埋め込み ID と同じエンティティに直接マッピングされていたことです。それは私がデータベースで望んでいることですが、Hibernate で望んでいることではありません。代わりに、TableA と TableB の 2 つのフィールドを Table1 自体で表す必要があり、一致するように関連付けのオーバーライドが書き込まれます。 Table2 が Table1 に変更を加えられないように、insertable=false と updatetable=false を含める必要があります。私の場合、一方向の関係だけが必要です。その後、Table1 は @OneToMany アノテーションの MappedBy パラメータを使用して、それ自体に直接マップできます。これにより、Table1 は関係を制御できます。したがって、コードは次のようになります:

    @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. 不動産業者のデータモデル

    2. 列ヘッダーを出力テキストファイルに削除します

    3. SQL ServerとC#のDateTimeからのミリ秒は同じではありません

    4. jqueryを使用して動的phpdivを更新します