当前位置: 首页 > 知识库问答 >
问题:

Hibernate:@onetomany:从“many”端删除实体导致EntityNotFoundException

文德曜
2023-03-14

我有以下实体:

@Entity
public static class Parent {
    @Id
    @GeneratedValue
    private Long id;

    String st;

    @OneToMany(mappedBy = "parent")
    Set<Child> children = new HashSet<>();
    // get,set 
}

@Entity
public static class Child {


    @Id
    @GeneratedValue
    private Long id;

    String st;

    @ManyToOne()
    private Parent parent;
    //get,set
  }
    null
    null

但看起来像是黑客。

所以,1。我做错了什么?看起来,直接删除子实体
2是正确的。有没有更优雅的方法来处理这个?

可复制的例子:

@Autowired
PrentCrud parentDao;

@Autowired
ChiildCrud childDao;
@PostConstruct
public void doSomething() {

    LogManager.getLogger("org.hibernate.SQL").setLevel(Level.DEBUG);


    Parent p = new Parent();
    p.setSt("1");
    Child e = new Child();
    e.setParent(p);
    e.setSt("c");
    p.getChildren().add(e);
    Parent save = parentDao.save(p);
    e.setParent(save);
    childDao.save(e);
    Parent next = parentDao.findAll().iterator().next();
    next.setSt("2");
    next.getChildren().size();
    childDao.deleteAll();
    next.getChildren().clear();
    if (next.getChildren() instanceof PersistentSet) { // this is hack, not working without
        ((Map)((PersistentSet) next.getChildren()).getStoredSnapshot()).clear();
    }
    parentDao.save(next); // exception is thrwn here without hack
    System.out.println("Success");

}

共有1个答案

胥玮
2023-03-14

您尝试过将fetch类型更改为eager吗?关系的默认值onetomany:LAZY manytoone:eary manytomany:LAZY onetoone:eary

也许它被缓存是因为fetch方法

 类似资料:
  • 我有两个具有一个任意关系的表 类ServiceProvider{ ... @OneTomany(Fetch=FetchType.Eager,MappedBy=“ServiceProvider”,Cascade={CascadeType.All,CascadeType.Remove},OlphanRemove=true)@OnDelete(action=OnDeleteAction.Cascade)

  • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应

  • 我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa

  • 在使用Hibernate删除与子实体具有关系的JPA实体时,我遇到了一个问题,但是在使用EclipseLink而不是Hibernate作为JPA提供程序时,相同的代码可以正常工作。父实体上的批注是 当使用Hibernate时,它尝试将子实体上的join列设置为null,但由于该列不允许null而失败。使用EclipseLink时,它首先删除子实体,然后删除父实体,这是所需的行为。 我的问题是: 为

  • 我在Spring MVC服务器中有2个JPA实体。其中一个是“父母”,另一个是孩子。正如我在这里读到的(原因4),当我有父实体和子实体时,首先必须删除父实体,然后删除子实体。它正在制作一个组织。冬眠例外约束ViolationException 父实体项目 儿童实体回复 我尝试在我的控制器中的“@Request estMap(value="ete")”中删除它们 但ConstraintViolati

  • 我用的是SpringBoot和JPA Hibernate。 我有这些实体: 当我尝试删除父实体(Post)时,所有相关实体注释都保留在数据库中。为什么级联删除不起作用?