【发布时间】: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