2016-07-11 7 views
0

これは私のモデル冗長コラム - 複合IDへのマッピングが1対1

@Entity 
public class Picture { 

    @EmbeddedId 
    private PictureId id; 

    ... 
} 

@Embeddable 
public class PictureId implements Serializable { 
    private static final long serialVersionUID = -8285116986358642545L; 

    @Column(nullable = false, name = "GALLERY_ID") private long galleryId; 
    @Column(nullable = false, name = "AUTHOR_ID") private long authorId; 
    @Column(nullable = false, name = "ORDINAL_NUMBER") private int ordinalNumber; 

    ... 
} 

@Entity 
public class Gallery { 

    @Id 
    @GeneratedValue 
    private long id; 
    private String name; 

    @OneToOne 
    @JoinColumns({ 
      @JoinColumn(name = "REDUNDANT_GALLERY_ID", referencedColumnName = "GALLERY_ID"), 
      @JoinColumn(name = "COVER_AUTHOR_ID", referencedColumnName = "AUTHOR_ID"), 
      @JoinColumn(name = "COVER_ORDINAL_NUMBER", referencedColumnName = "ORDINAL_NUMBER") 
    }) 
    private Picture cover; 

    ... 
} 

である私はここ@JoinColumsをspecifingする必要はないと思いますが、私はそれがより明確にしたかったです。このモデルでは、IDの値を反映する私のGALLERYテーブルに冗長列が作成されています。私はこのコラムを取り除きたい。フィールドcoverはnullでもかまいません。

このことについてたくさん考えた後、私はこのマッピングを外部テーブルに移す方がよいと決めました。明らかにそれは私の問題を解決しなかったし、それはさらに複雑になる。

@Entity 
public class Gallery { 

    @OneToOne 
    @JoinTable(name = "GALLERY_COVER", 
     joinColumns = { 
       @JoinColumn(name = "GALLERY_ID", referencedColumnName = "ID") 
     }, 
     inverseJoinColumns = { 
       @JoinColumn(name = "REDUNDANT_GALLERY_ID", referencedColumnName = "GALLERY_ID"), 
       @JoinColumn(name = "AUTHOR_ID", referencedColumnName = "AUTHOR_ID"), 
       @JoinColumn(name = "ORDINAL_NUMBER", referencedColumnName = "ORDINAL_NUMBER") 
    }) 
    private Picture cover; 
} 

私は@AssociationOverride@AttributeOverrideを使用しようとしていたが、私は失敗しました。これらのマッピングで私を助けることができますか?


編集:ここではrepository

+0

「冗長」結合列には読み取り専用のマークを付けることができます: '@JoinColumn(name =" ID "、referencedColumnName =" GALLERY_ID "、insertable = false、updatable = false)' –

+0

残念ながら、それ。これは、 '' 'プロパティの挿入可能なカラムと挿入不可能なカラムを混在させることが許されない' 'というメッセージです。 – Sebastian

+0

' 'Gallery''の主キーを' 'Picture''への外部キーの一部として再利用すると、複合主キーには問題があります。データモデルでは、 'Gallery'の' cover'が同じ 'Gallery'の写真の1つであることを要求する明示的なものは何もありません。 'カバー' 'ピクチャ'がプライマリキーに異なる 'ギャラリー' IDを持つ可能性は全くあります。この場合、「冗長な」「ギャラリー」IDは実際には冗長ではない。 –

答えて

0

が参加し、テーブルと冗長列の名前を忘れて、このモデルです。 1つのインスタンスのみが挿入/更新できるのであれば、同じエンティティで同じ列名を2回使用することはOKです。 @Column@JoinColumnアノテーションを使用すると、デフォルトの挿入可能/更新可能な値を上書きできます。

@Entity 
public class Gallery { 

    @Id 
    @GeneratedValue 
    private long id; 
    private String name; 

    @OneToOne 
    @JoinColumns({ 
      // no new column name here, just specify insertable/updatable 
      @JoinColumn(name = "GALLERY_ID", insertable=false, updatable=false), 
      @JoinColumn(name = "COVER_AUTHOR_ID", referencedColumnName = "AUTHOR_ID", insertable=false, updatable=false), 
      @JoinColumn(name = "COVER_ORDINAL_NUMBER", referencedColumnName = "ORDINAL_NUMBER", insertable=false, updatable=false) 
    }) 
    private Picture cover; 

    ... 
} 

クリーナーアプローチは、しかし、それはgalleryIdが含まれていませんのでPictureの主キーを変更することです。 authorIdordinalNumberがすでに固有のキーを指定している場合は、結合からgalleryIdを削除するだけです。

+0

これはテストしましたか? '' 'org.hibernate.AnnotationExceptionが発生しました:プロパティに挿入可能なカラムと挿入不可能なカラムを混在させることはできません:pl.sdwsk.model.Gallery.cover'''。残念ながら、コンポジットキーから '' galleryId'''を取り除くことはできません。 – Sebastian

+0

これは残念です... 3つの結合列をすべて 'insertable = false、updatable = false'に設定する必要があるようです。これを設定する必要がある場合は、Gallery IDのように '@Column(name =" COVER_AUTHOR_ID "')を別に定義する必要があります。それ以外の場合は、クリーンデータモデルの重要性が強調されます –

+0

私がいつも混乱のように思えるカバーを設定する必要があるという事実);私は今のところ@JointTableでそれを離れる方がよいでしょう。 – Sebastian

関連する問題