Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠一通多址/多通删除级联_Hibernate - Fatal编程技术网

Hibernate 休眠一通多址/多通删除级联

Hibernate 休眠一通多址/多通删除级联,hibernate,Hibernate,我正试图建立一种一对一/多对一的关系。除删除操作外,所有操作均按预期工作,这意味着当删除所有者侧时,非所有者侧也会被删除 有没有办法防止这种行为,因此如果删除了所有者侧,非所有者侧的所有者侧id将设置为NULL 伪码 public class OwningSide { @OneToMany( cascade = {CascadeType.ALL}, mappedBy = "owningSide") @LazyCollection(LazyCollectionOp

我正试图建立一种一对一/多对一的关系。除删除操作外,所有操作均按预期工作,这意味着当删除所有者侧时,非所有者侧也会被删除

有没有办法防止这种行为,因此如果删除了所有者侧,非所有者侧的所有者侧id将设置为NULL

伪码

public class OwningSide {

  @OneToMany(
      cascade = {CascadeType.ALL},
      mappedBy = "owningSide")
  @LazyCollection(LazyCollectionOption.FALSE)
  @JsonManagedReference  
  private List<NonOwningSide> nonOwningSide;

}

public class NonOwningSide {

  @ManyToOne(
      cascade = {CascadeType.ALL},
      fetch = FetchType.EAGER)
  @JoinColumn(name = "owningSide_id")
  @JsonBackReference
  private OwningSide owningSide;

}
公共类所有者侧{
@独身癖(
cascade={CascadeType.ALL},
mappedBy=“owningSide”)
@LazyCollection(LazyCollectionOption.FALSE)
@JsonManagedReference
私有列表非所有方;
}
公共类非所有者侧{
@许多酮(
cascade={CascadeType.ALL},
fetch=FetchType.EAGER)
@JoinColumn(name=“owningSide\u id”)
@JsonBackReference
私人所有;
}

您必须将cjild的对象显式设置为null

for (NonOwningSide child : OwningSide.getChildren()) {
child.setNonOwningSide(null);
}
删除(OwningSide)

第一次更改级联=级联类型。在自己的一侧保持

public class OwningSide {

  @OneToMany(
      cascade = {CascadeType.PERSIST}, mappedBy = "owningSide")
  @LazyCollection(LazyCollectionOption.FALSE)
  @JsonManagedReference  
  private List<NonOwningSide> nonOwningSide;

}

public class NonOwningSide {

  @ManyToOne(
      cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
  @JoinColumn(name = "owningSide_id")
  @JsonBackReference
  private OwningSide owningSide;

}
要做到这一点,当您创建表并将外键添加到NonOwningSide时,请将cascade type指定为set null以删除owningSide,如下所示

--这一次,在delete set null上使用创建它:

alter table NonOwningSide add constraint constraintName 
foreign key (id) references OwningSide(id) on delete set null

当然不要使用cascade=ALL,它精确地告诉Hibernate做你不想做的事情。并确保在删除之前没有非所有者侧引用所有者侧。如果我从所有者侧删除CascadeType.ALL,则非所有者侧的所有者侧id在创建/更新操作时将保持为空。级联不是填充非所有者侧的所有者侧字段的内容。无论如何,不使用cascade=ALL并不意味着不能使用任何级联。CascadeType注释中还有许多其他值。
alter table NonOwningSide add constraint constraintName 
foreign key (id) references OwningSide(id) on delete set null