【问题标题】:Cannot remove jpa child entity by persistance remove无法通过持久性删除删除 jpa 子实体
【发布时间】:2017-08-01 23:47:35
【问题描述】:

我可以通过普通的 HQL 删除任何行,例如

Query q = em.createQuery("DELETE FROM Cities WHERE id = :id");

但我想删除它像

Cities city = em.getReference(Cities.class, 8);

    try {
        em.getTransaction().begin();
        em.remove(city);
        em.getTransaction().commit();
    }
    catch(RuntimeException e) {
        e.printStackTrace();
        em.getTransaction().rollback();
    }

我没有收到任何警告或错误

模型很简单

国家(仅限 OneToMany 注释)

@OneToMany(mappedBy = "country", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private List<Cities> cities;

城市(仅限 fk 字段)

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "country_id", nullable = false)
private Countries country;

我正在尝试的事情是:

1) trying to apply orphanRemoval = true
2) cascade = CascadeType.MERGE to Cities
3) em.refresh(city)

【问题讨论】:

  • 您是在说“我没有收到任何警告或错误”,因此系统没有出现任何错误。那么问题是什么?
  • 我在这些更改后达到了结果:try { em.getTransaction().begin(); city.setCountries(null); em.refresh(城市); em.remove(城市); em.getTransaction().commit(); } catch(RuntimeException e) { e.printStackTrace(); em.getTransaction().rollback(); }
  • 问题是为什么子实体中没有删除不删除FK并像上面一样刷新:(

标签: java hibernate jpa java-ee-7 persistent


【解决方案1】:

您正在删除一个城市,但是您对国家/地区对现在已删除城市的引用做了什么?如果这是在持久性单元中,则级联持久/合并选项将导致它被拾取并重新插入,从而撤消所需的删除操作。您必须先取消对该城市的任何引用,然后才能将其删除。您的 JPQL 可能会起作用,因为您没有将任何内容加载到内存中,因此国家(及其对城市的引用)不存在,因此在您提交时未检查。虽然有效,但依赖并不好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多