JPA:@Embeddable对象如何将引用返回给它的所有者,但@Embeddable是否在一个惰性集合中?

时间:2017-06-09 11:17:32

标签: java hibernate jpa

我知道如果你想从@Embeddable引用它的父母,你可以设置父母"手动"在setter中使用@Access(AccessType.PROPERTY)作为this answer中所述的嵌入字段,但是如果这个嵌入元素被映射到一个延迟加载的集合中会怎样?

1 个答案:

答案 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>