我有一组实体来构建某种图形,这是由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
,其中fromid
是EntityRelation
的一个字段。
由于性能原因,我不希望从Entity
到Entity
有直接关系。
为了解决这个问题,我使用了一个新的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
3条答案
按热度按时间xiozqbni1#
这是一个已知的休眠问题。在某些情况下(您发现了其中之一),它违反了外键关系的约束。有多种选择(但恐怕您不会喜欢其中任何一种)
vybvopom2#
请注意,即使将
hbm2ddl.auto
设置为UPDATE
,当实体中的nullable
设置为FALSE
时,也不会删除非空类型约束。我建议检查类的历史记录,以查看实体关系或列Map是否有任何更改,从而确定是否存在可为空的约束。oaxa6hgo3#
如果有人在寻找解决方案,
JoinCoulum
注解中的updatable=false
为我解决了这个问题