java - Spring 数据 JPA : modelling a graph getting 'column violates not-null' when removing edges

标签 java hibernate spring-data 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;

所有 outEdges 都应该在保存时属于实体,inEdges 是从这些“推断”出来的。问题是在删除边缘后我总是得到一个错误 ERROR: null value in column "fromid" violates not-null constraint其中 fromidEntityRelation的领域.

出于性能原因,我不想与 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/

相关文章:

spring - 使用带有 @Document 的 Spring-Data Elasticsearch 动态创建索引名称

java - 当调用非静态/实例方法时,“this”参数被隐式传递 - java

java - 哈希仅返回 8 或 9 个字符

java - Jsf Netbeans、Hibernate、获取 session 工厂找不到符号错误

java - 仅当对象不为 null 时才进行 Hibernate join

mysql - 使用 Spring Data 时外键约束失败

java - Spring Data Repositories - 查找列表中的 where 字段

java - SQL语句花费大量时间,是否可以对其进行优化?

java - Java 有反向查找的 HashMap 吗?

java - 插入两个不同数据库中的两个表