CascadeType.ALL 不会保存子级。孩子没有得到保存并得救

问题描述 投票:0回答:1

我有三个实体,如下所示:

@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 足以保存实体的所有部分?

提前感谢您的帮助。

java database spring-boot jpa cascade
1个回答
0
投票

您的情况是这样解释的:在保存时,子

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.