【问题标题】:Composite primary key table not populating in related entity复合主键表未填充到相关实体中
【发布时间】:2020-01-30 13:34:45
【问题描述】:

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

@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<>();
}

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

【问题讨论】:

  • 定义你的意思'列表没有被填充',它是空的还是只是懒惰地获取?保存实体时,是否将新的 JoinEntity 添加到 EntityA 列表中?您必须维护关系的双方,并且 JPA 具有缓存,这会导致您取回未填充的 EntityA 实例和一个空列表。您可以通过使用 em.refresh(entityA) 强制刷新,然后检查列表来验证这是否是问题所在。

标签: java spring jpa composite-primary-key


【解决方案1】:

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

   @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
   List<JoinEntity> list = new ArrayList<>();

这样,当您从数据库中检索 EntityA 时,将自动检索其 JoinEntity

【讨论】:

  • 没有工作,如果您查看 JoinEntity,虽然 fetch 是 LAZY 的,但 EntityA 会被自动检索。不过还是谢谢你。
【解决方案2】:

解决了添加带有 id 的 ENTITY_F 表并切换到简单的多对多关系的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多