我知道如果你想从@Embeddable引用它的父母,你可以设置父母"手动"在setter中使用@Access(AccessType.PROPERTY)作为this answer中所述的嵌入字段,但是如果这个嵌入元素被映射到一个延迟加载的集合中会怎样?
答案 0 :(得分:0)
实际上不确定这是否是一个问题,如果不是"手动"从@embeddable引用回到它的父级,一切都很好。
@CollectionTable.JoinColumns()用于设置引用实体主表的集合表的外键列,这意味着一旦设置了这个可选属性,就没有必要"手动&#34 ;从@embeddable引用回其父级。
以您的案例为例:
@Entity
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
....
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "COMPUTERS", joinColumns = @JoinColumn(name = "ID_IMAGE"))
private List<Computer> computers;
}
@Embeddable
public class Computer {
@Column
private String ipAddress;
*****//This idImage field is not necessary
@Column(name = "ID_IMAGE", insertable = false, updatable = false)
private Long idImage;*****
}
注释掉字段idImage及其@Column注释后,生成的SQL为:
create table IMAGES (
id bigint not null,
Name_Image varchar(255),
primary key (id)
)
create table COMPUTERS (
ID_IMAGE bigint not null,
ipAddress varchar(255)
)
alter table COMPUTERS
add constraint FKl1ucm93ttye8p8i9s5cgrurh
foreign key (ID_IMAGE)
references IMAGES
如果&#34;手动&#34;声明可嵌套类中的连接列,虽然DDL是相同的,但是嵌入对象将包含一个额外的字段&#34; imageId&#34;,这将导致执行INSERT操作时JDBC调用参数超出索引。 / p>