spring-data-jpa Spring Data JPA:在删除边时对得到“列违反非空”的图建模

lfapxunr  于 2022-11-10  发布在  Spring
关注(0)|答案(3)|浏览(158)

我有一组实体来构建某种图形,这是由Entity类建模的,它有两个字段来建模实体之间的关系。

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "fromId")
private Set<EntityRelation> outEdges;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "toId")
private Set<EntityRelation> inEdges;

所有outEdges在保存时都应该属于实体,inEdges是从这些中“推断”出来的。问题是在删除一个outEdges后,我总是得到一个错误ERROR: null value in column "fromid" violates not-null constraint,其中fromidEntityRelation的一个字段。
由于性能原因,我不希望从EntityEntity有直接关系。
为了解决这个问题,我使用了一个新的Spring-DataJPA方法(在相应的Repository类中)来显式删除实体所指向的所有内容(例如

@Modifying
@Query(value = "delete from entityrelation where fromid = ?1", nativeQuery = true)
int deleteEntityRelations(String entityId);

但这不知何故忽略了全部要点,因为我希望JPA对此负责。
这里出了什么问题?我真的被卡住了,因为我能找到的所有帖子都建议它应该简单地与orphan-delete一起工作。
在SQL-Trace中,您可以看到自动发出了org.hibernate.SQL - update EntityRelation set fromId=null where fromId=? and id=?(然后触发错误)。
谢谢并问候fricke

xiozqbni

xiozqbni1#

这是一个已知的休眠问题。在某些情况下(您发现了其中之一),它违反了外键关系的约束。有多种选择(但恐怕您不会喜欢其中任何一种)

  • 解除约束我知道我知道。
  • 使约束条件延迟。不确定此功能是否在Oracle以外的其他数据库中可用。
  • 将期望限制在JPA上。说真的,看起来你对它的期望比它给予你的要高。我强烈推荐在使用任何类型的ORM进行任何项目之前使用reading this article
vybvopom

vybvopom2#

请注意,即使将hbm2ddl.auto设置为UPDATE,当实体中的nullable设置为FALSE时,也不会删除非空类型约束。我建议检查类的历史记录,以查看实体关系或列Map是否有任何更改,从而确定是否存在可为空的约束。

oaxa6hgo

oaxa6hgo3#

如果有人在寻找解决方案,JoinCoulum注解中的updatable=false为我解决了这个问题

@JoinColumn(name = "fromId", updatable = false)

相关问题