复合主键 table 未填充到相关实体中
Composite primary key table not populating in related entity
我的数据库包含一个带有复合主键的 table,其中一个键是外键,另一个应该用于从外部服务获取实体。代码看起来有点像这样:
@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 将被正确恢复。我该怎么做才能使 JoinEntity 列表与 EntityA 一起恢复?
您需要在 EntityA 中的 @OneToMany 关联上使用 FetchType.EAGER class:
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
List<JoinEntity> list = new ArrayList<>();
这样当您从数据库中检索 EntityA 时,它的 JoinEntity 将被自动检索。
解决了使用 id 添加 ENTITY_F table 并切换到简单的 ManyToMany 关系的问题。
我的数据库包含一个带有复合主键的 table,其中一个键是外键,另一个应该用于从外部服务获取实体。代码看起来有点像这样:
@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 将被正确恢复。我该怎么做才能使 JoinEntity 列表与 EntityA 一起恢复?
您需要在 EntityA 中的 @OneToMany 关联上使用 FetchType.EAGER class:
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
List<JoinEntity> list = new ArrayList<>();
这样当您从数据库中检索 EntityA 时,它的 JoinEntity 将被自动检索。
解决了使用 id 添加 ENTITY_F table 并切换到简单的 ManyToMany 关系的问题。