我有三个实体,如下所示:
@Table(name = "input")
@Entity
@Data
public class CreationInputEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "ID", unique = true, nullable = false, updatable = false)
Long id;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "index_id", referencedColumnName = "id")
IndexEntity index;
}
@Table(name = "index")
@Entity
@Data
public class IndexEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id", unique = true, nullable = false, updatable = false)
Long id;
@OneToOne(mappedBy = "index")
CreationInputEntity creationInputEntity;
@NotBlank
@Column(name = "indexName")
String indexName;
@OneToMany(mappedBy = "index", cascade=CascadeType.ALL)
List<IndexshareEntity> indexshares;
}
@Entity
@Data
public class IndexshareEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "ID", unique = true, nullable = false, updatable = false)
public Long id;
....
@ManyToOne
@JoinColumn(name="index_id")
public IndexEntity index;
}
我有几个端点。在第一次创建端点时,我创建了 CreationInputEntity 端点,然后 saveAndFlush,它在数据库中显示,并通过调试显示它的所有部分(例如 IndexEntity 和 IndexshareEntity)都已保存。但是在保存并尝试使用 getRequest 获取数据后,有一个 IndexEntity,但它的 IndexshareEntity 为空,并且 IndexshareEntities 没有保留在数据库中。
CreationInputEntity createdCreationInputEntity = inputRepository.saveAndFlush(creationInputEntity);
我哪里做错了?为什么孩子们不留在数据库中?我认为 saveAndFlush 与 CascadeType.ALL 足以保存实体的所有部分?
提前感谢您的帮助。
您的情况是这样解释的:在保存时,子
IndexshareEntity
对象不包含对父 IndexEntity
对象的引用。 IndexEntity
和 IndexshareEntity
之间的关系由 IndexshareEntity
对象管理,因为这是您加入 @JoinColumn(name="index_id")
列的位置。但是,在保存时, IndexshareEntity
对象不包含对 IndexEntity
对象的引用,因此 IndexEntity
对象的 id 不会存储在 index_id
列中。因此,当您加载 IndexEntity
时,Hibernate 无法确定与其相关的 IndexshareEntity
对象。
要解决这个问题,必须为每个子对象设置对父对象的引用。这可以使用
IndexshareEntity.setIdex()
方法手动完成,也可以使用 @JsonManagedReference
和 @JsonBackReference
注释自动完成。
class IndexEntity {
@JsonManagedReference
@OneToMany(mappedBy = "index", cascade=CascadeType.ALL)
List<IndexshareEntity> indexshares;
}
class IndexshareEntity {
@ManyToOne
@JsonBackReference
@JoinColumn(name="index_id")
public IndexEntity index;
}