Java 相关实体中未填充复合主键表

Java 相关实体中未填充复合主键表,java,spring,jpa,composite-primary-key,Java,Spring,Jpa,Composite Primary Key,我的数据库包含一个具有复合主键的表,其中一个键是外键,另一个应该用于从外部服务获取实体。代码看起来有点像这样: @AllArgsConstructor @NoArgsConstructor @Getter @Setter @Embeddable @EqualsAndHashCode public class PrimaryKey implements Serializable { @Column(name = "A_ID") private Long aId; @Col

我的数据库包含一个具有复合主键的表,其中一个键是外键,另一个应该用于从外部服务获取实体。代码看起来有点像这样:

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Embeddable
@EqualsAndHashCode
public class PrimaryKey implements Serializable {
    @Column(name = "A_ID")
    private Long aId;

    @Column(name = "F_ID")
    private Long fId;
}


@Entity
@Table(name = "JOIN_ENTITY")
@Getter
@Setter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class JoinEntity {
    @EmbeddedId
    private PrimaryKey pk;

    @MapsId("aId")
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "A_ID")
    private EntityA a;

    public getFId() { return pk.getFId(); }
}



@Entity
@Table(name = "ENTITY_A")
@Getter
@Setter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class EntityA implements Serializable {
    ....

   @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true)
   List<JoinEntity> list = new ArrayList<>();
}
@allargsconstuctor
@诺尔格构装师
@吸气剂
@塞特
@可嵌入
@EqualsAndHashCode
公共类PrimaryKey实现可序列化{
@列(name=“A_ID”)
私人长期援助;
@列(name=“F_ID”)
私人长fId;
}
@实体
@表(name=“加入实体”)
@吸气剂
@塞特
@EqualsAndHashCode
@AllArgsConstructor
@诺尔格构装师
公共类联合实体{
@嵌入ID
私钥pk;
@MapsId(“援助”)
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“A_ID”)
私人实体a;
public getFId(){return pk.getFId();}
}
@实体
@表(name=“实体A”)
@吸气剂
@塞特
@EqualsAndHashCode
@AllArgsConstructor
@诺尔格构装师
公共类EntityA实现可序列化{
....
@OneToMany(mappedBy=“a”,cascade=CascadeType.ALL,orphan=true)
列表=新的ArrayList();
}

当我保存JoinEntity并尝试从数据库获取EntityA时,列表不会被填充,但如果我从数据库获取一些JoinEntity,则相关EntityA会正确恢复。如何使用EntityA恢复JoinEntity列表?

您需要在EntityA类的@OneToMany关联上使用FetchType.EAGER:

   @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
   List<JoinEntity> list = new ArrayList<>();
@OneToMany(mappedBy=“a”,cascade=CascadeType.ALL,orphaneremovation=true,fetch=FetchType.EAGER)
列表=新的ArrayList();

这样,当您从数据库检索一个实体a时,它的连接实体将被自动检索。

解决了添加一个id为的实体表并切换到简单的多个关系的问题。

不起作用,如果查看JoinEntity,尽管提取是惰性的,但EntityA会被自动检索。不过还是要谢谢你。定义一下“列表没有被填充”是什么意思,它是空的还是只是懒洋洋地获取的?保存实体时,是否将新的JoinEntity添加到EntityA列表中?您必须维护关系的双方,并且JPA具有缓存,这将导致您返回未填充的EntityA实例,其中包含一个空列表。您可以通过使用em.refresh(entityA)强制刷新,然后检查列表来验证这是否是问题所在。