这是我的模型
@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
。如果 authorId
和 ordinalNumber
已指定唯一键,只需从联接中删除galleryId
即可。