冗余列 - 具有复合 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
。如果 authorId
和 ordinalNumber
已经指定了唯一键,只需从连接中删除 galleryId
。
这是我的模型
@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
。如果 authorId
和 ordinalNumber
已经指定了唯一键,只需从连接中删除 galleryId
。