通过 UPDATE .. SET Query 更新实体关系
Update Entity Relationship via UPDATE .. SET Query
我有两个实体:
class A {
@OneToMany(mappedBy = "a")
List<B> bs;
// getter/ setter
}
class B {
@ManyToOne
A a;
// getter/ setter
}
要删除一个b,我首先需要使该关系无效。
"Traditionally" 我会这样做:
A a = em.getReference(A.class, entityIdA)
B b = em.getReference(B.class, entityIdB);
a.getBs().remove(b);
b.setA(null);
em.remove(b);
如果 a
的列表越来越大(在我的例子中有几百个),这不是很有效。
我知道我也可以使用 JPQL 创建更新查询。
像这样:
Query q = em.createQuery("UPDATE B b SET b.a = NULL");
q.executeUpdate();
问题:从a
中移除一个b
对应的JPQL查询是什么b
列表?
简而言之:
如何翻译
a.getBs().remove(b);
进入 JPQL 查询?
编辑: 提到的更新查询转换为
UPDATE B SET A_ID = ? WHERE (ID = ?)
bind => [null, 2]
表格如下所示:
A
ID
B
ID A_ID
根据评论和 问题,更改关系的拥有方就足够了。
因此,
a.getBs().remove(b);
作为jpql查询,可以做到
"UPDATE B b SET b.a = NULL"
这将释放 a
和 b
之间的双向关系。
请注意,您可能需要清除 L2 缓存或关闭 EntitiyManagerFactory 才能生效。
factory.getCache().evictAll();
我有两个实体:
class A {
@OneToMany(mappedBy = "a")
List<B> bs;
// getter/ setter
}
class B {
@ManyToOne
A a;
// getter/ setter
}
要删除一个b,我首先需要使该关系无效。 "Traditionally" 我会这样做:
A a = em.getReference(A.class, entityIdA)
B b = em.getReference(B.class, entityIdB);
a.getBs().remove(b);
b.setA(null);
em.remove(b);
如果 a
的列表越来越大(在我的例子中有几百个),这不是很有效。
我知道我也可以使用 JPQL 创建更新查询。
像这样:
Query q = em.createQuery("UPDATE B b SET b.a = NULL");
q.executeUpdate();
问题:从a
中移除一个b
对应的JPQL查询是什么b
列表?
简而言之: 如何翻译
a.getBs().remove(b);
进入 JPQL 查询?
编辑: 提到的更新查询转换为
UPDATE B SET A_ID = ? WHERE (ID = ?)
bind => [null, 2]
表格如下所示:
A
ID
B
ID A_ID
根据评论和
因此,
a.getBs().remove(b);
作为jpql查询,可以做到
"UPDATE B b SET b.a = NULL"
这将释放 a
和 b
之间的双向关系。
请注意,您可能需要清除 L2 缓存或关闭 EntitiyManagerFactory 才能生效。
factory.getCache().evictAll();