我有一组构建某种图形的实体。这是由类 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 是从这些“推断”出来的。问题是在删除边缘后我总是得到一个错误 ERROR: null value in column "fromid" violates not-null constraint
其中 fromid
是EntityRelation
的领域.
出于性能原因,我不想与 Entity
建立直接关系至 Entity
.
为了解决这个问题,我使用了一个新的 Spring-Data JPA 方法(在相应的 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=?
自动发出(然后触发错误)。
感谢和问候 弗里克
最佳答案
这是 hibernate 的一个已知问题。在某些情况下(你发现了其中之一)它违反了外键关系的约束。有多种选择(但恐怕您可能不喜欢其中任何一种)
解除限制。我知道我知道..
制作constraint deferred .不确定除 Oracle 以外的其他数据库是否提供此功能。
限制对 JPA 的期望。说真的,看起来你对它的期望比它给你的要多。我强烈推荐reading this article在使用任何类型的 ORM 继续任何项目之前。
关于java - Spring 数据 JPA : modelling a graph getting 'column violates not-null' when removing edges,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30175589/