编程语言
首页 > 编程语言> > java-Spring-Data JPA:建模图形时删除边获得“列违反非空”

java-Spring-Data JPA:建模图形时删除边获得“列违反非空”

作者:互联网

我有一组构建某种图形的实体.这由类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;

保存时,所有outEdge都应属于该实体,inEdge是从这些实体“推断”的.问题是,在删除边缘后,我总是收到错误错误:列“ fromid”中的null值违反了非null约束,其中fromid是EntityRelation的字段.

出于性能原因,我不想从实体到实体直接建立联系.

为了解决这个问题,我使用了一个新的Spring-Data JPA方法(在相应的Repository类中)来显式删除实体指向的所有内容(例如

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

但这以某种方式遗漏了全部要点,因为我希望JPA对此负责.

这是怎么了我真的很困惑,因为我能找到的所有帖子都建议它应该只与孤立删除一起使用.

在SQL-Trace中,您可以看到org.hibernate.SQL-更新EntityRelation设置fromId = null其中fromId =?和id =?自动发出(然后触发错误).

谢谢并恭祝安康
rick

解决方法:

这是休眠的已知问题.在某些情况下(您找到了其中一种),它违反了对外键关系的约束.有多种选择(但恐怕您可能不喜欢其中任何一种)

>删除约束.我知道我知道 ..
>设置为constraint deferred.不确定除Oracle以外的其他数据库是否提供此功能.
>将期望限制为JPA.认真地说,您似乎希望从中获得更多,然后它就会为您提供.我强烈建议reading this article使用任何类型的ORM进行任何项目之前.

标签:spring-data-jpa,spring-data,hibernate,java
来源: https://codeday.me/bug/20191120/2043198.html