有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么@OnDelete(action=OnDeleteAction.CASCADE)在删除InheritanceType时不删除parenttableentry。加入

参与:

  • 爪哇
  • JPA/Hibernate
  • Spring数据

问题

当使用@Inheritation(strategy=InheritanceType.join)并通过“外部触发器”(又名@OnDelete(action=OnDeleteAction.CASCADE))删除对象时,子表中的条目将被删除,换句话说:ParentTable保留一个“孤立”条目。为什么

我搜索了很多这个话题,但只找到了一个相关的问题(JPA Inheritance - parent is not deleted with child)。这没用

变通办法 (我不想使用,但它会起作用)

  • 手动删除子项“独立”/。然后,按照Hibernate文档中的描述删除父表的条目
  • 更改所属关系,以便VorschRech在OneToOne(cascade=CascadeType.ALL)有一个“正常”的删除cascade

也不起作用的事情:

  • 多个而不是一个

所以我对

为什么@OnDelete(action=OnDeleteAction.CASCADE)不能与InheritanceType一起工作。加入

参与课程:

@MappedSuperclass
public class BasisEntity {
    @javax.persistence.Id
    private final Long id;

    public BasisEntity() {
        this.id = Long.valueOf(Id.next());
    }
[.. more Code goes here]}

“触发”类:

@Entity
public class VorschRech extends BasisEntity {

    public VorschRech() {
        super();
    }

}

继承情况:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class VerbrParent extends BasisEntity {
    private String parentalLyrics;

    public VerbrParent() {
        super();
    }

    public String getParentalLyrics() {
        return parentalLyrics;
    }

    public void setParentalLyrics(String parentalLyrics) {
        this.parentalLyrics = parentalLyrics;
    }
}

只被部分删除的子项:在表verbr_intern yes中,但不是其在verbr_parent中的行:

@Entity
public class VerbrIntern extends VerbrParent {
    @OneToOne
    @OnDelete(action = OnDeleteAction.CASCADE) //<<-- The TRIGGER
    private VorschRech vorschRech;

    public VerbrIntern() {
        super();
    }

    public VorschRech getVorschRech() {
        return vorschRech;
    }

    public void setVorschRech(VorschRech vorschRech) {
        this.vorschRech = vorschRech;
    }
}

另一个随机的孩子:

@Entity
public class VerbrXt extends VerbrParent {

    public VerbrXt() {
        super();
    }
}

回购协议1:

public interface VorschRechRepository
        extends JpaRepository<VorschRech, Long>, QuerydslPredicateExecutor<VorschRech> {
}

回购协议2:

public interface VerbrParentRepo
        extends JpaRepository<VerbrParent, Long>, QuerydslPredicateExecutor<VerbrParent> {}

创建操作:

VorschRech vrech = new VorschRech(); vorschrechRepo.save(vrech);

VerbrIntern verbrIntern = new VerbrIntern();

verbrIntern.setParentalLyrics("VerbrIntern blah!");

verbrIntern.setVorschRech(vrech);

verbrParentRepo.save(verbrIntern);

删除操作:

vorschrechRepo.deleteAll();

结果

表VORSCHU rech:不再输入

实习医生:不再输入

表verbr_父项:1个不应存在的条目。(也就是创建VerbrIntern-Object时的“剩余部分”。)


共 (0) 个答案