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

Redundant column - one to one mapping with composite 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 table 中创建了一个冗余列,它反映了 ID 的值。我想去掉这个专栏。字段 cover 可能为空。

经过深思熟虑,我决定最好将此映射移动到外部 table。显然它没有解决我的问题,它变得更加复杂。

@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 这个模型

忘记连接 table 和多余的列名。在一个 Entity 中两次使用相同的列名是可以的,只要它的一个实例可以是 inserted/updated。 @Column@JoinColumn 注释可让您覆盖默认的 insertable/updatable 值。

@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