冗余列 - 与复合 ID 的一对一映射



这是我的模型

@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是没有必要的,但我想让它更清楚。使用此模型,在我的GALLERY表中创建了一个冗余列,该列反映了ID的值。我想摆脱这个专栏。字段cover可能为空。

在对此进行了大量思考之后,我决定最好将此映射移动到外部表。显然,它没有解决我的问题,而且变得更加复杂。

@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但我失败了。你能帮我做这些映射吗?


编辑:这是具有此模型的存储库

忘记连接表和冗余列名。可以在一个实体中使用相同的列名两次,只要只能插入/更新它的一个实例即可。@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;
    ...
}

但是,更干净的方法是更改Picture上的主键,使其不包括galleryId。如果 authorIdordinalNumber 已指定唯一键,只需从联接中删除galleryId即可。

最新更新