简体   繁体   English

所有者删除时违反参照完整性约束(OneToMany单向)

[英]Referential integrity constraint violation on owner delete (OneToMany unidirectional)

I'm having trouble deleting the owner object in a unidirectional OneToMany relationship. 我在删除单向OneToMany关系中的所有者对象时遇到问题。

The relevant bits are that I have three objects: Acronym, Expansion, and Tag. 相关的位是我有三个对象:首字母缩写词,扩展和标记。

  • Acronym has a unidirectional OneToMany relationship with Expansion 首字母缩略词与扩展具有单向OneToMany关系
  • Expansion has a bidirectional ManyToMany relationship with Tag 扩展与Tag具有双向的ManyToMany关系

Here's the code: 这是代码:

@Entity
public class Acronym extends Model {
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "acronym_id")
    public Set<Expansion> expansions;
...
}

@Entity
public class Expansion extends Model {
    @ManyToMany
    public Set<Tag> tags;
...
}

@Entity
public class Tag extends Model {
    @ManyToMany(mappedBy = "tags")
    public Set<Expansion> expansions;
...
}

Now, when I try to delete an Acronym object I'm getting the following error: 现在,当我尝试删除首字母缩略词对象时,出现以下错误:

[error] Test models.AcronymTest.testAsJSON failed: javax.persistence.PersistenceException: org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK_EXPANSION_TAG_EXPANSION_01: PUBLIC.EXPANSION_TAG FOREIGN KEY(EXPANSION_ID) REFERENCES PUBLIC.EXPANSION(ID) (7)"; SQL statement:
[error] delete from expansion where acronym_id = ? [23503-168]
[error]     at com.avaje.ebeaninternal.server.persist.ExeUpdateSql.execute(ExeUpdateSql.java:76)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeSqlUpdate(DefaultPersistExecute.java:125)
[error]     at com.avaje.ebeaninternal.server.core.PersistRequestUpdateSql.executeNow(PersistRequestUpdateSql.java:44)
[error]     at com.avaje.ebeaninternal.server.core.PersistRequest.executeStatement(PersistRequest.java:74)
[error]     at com.avaje.ebeaninternal.server.core.PersistRequestUpdateSql.executeOrQueue(PersistRequestUpdateSql.java:49)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.executeSqlUpdate(DefaultPersister.java:147)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.deleteManyDetails(DefaultPersister.java:1169)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.deleteAssocMany(DefaultPersister.java:1143)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:624)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.delete(DefaultPersister.java:452)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1867)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.delete(DefaultServer.java:1857)
[error]     at com.avaje.ebean.Ebean.delete(Ebean.java:648)
[error]     at play.db.ebean.Model.delete(Model.java:167)
[error]     at models.AcronymTest.testAsJSON(AcronymTest.java:201)
[error]     ...
[error] Caused by: org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation: "FK_EXPANSION_TAG_EXPANSION_01: PUBLIC.EXPANSION_TAG FOREIGN KEY(EXPANSION_ID) REFERENCES PUBLIC.EXPANSION(ID) (7)"; SQL statement:
[error] delete from expansion where acronym_id = ? [23503-168]
[error]     at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
[error]     at org.h2.message.DbException.get(DbException.java:169)
[error]     at org.h2.message.DbException.get(DbException.java:146)
[error]     at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:414)
[error]     at org.h2.constraint.ConstraintReferential.checkRowRefTable(ConstraintReferential.java:431)
[error]     at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:307)
[error]     at org.h2.table.Table.fireConstraints(Table.java:871)
[error]     at org.h2.table.Table.fireAfterRow(Table.java:888)
[error]     at org.h2.command.dml.Delete.update(Delete.java:99)
[error]     at org.h2.command.CommandContainer.update(CommandContainer.java:75)
[error]     at org.h2.command.Command.executeUpdate(Command.java:230)
[error]     at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:156)
[error]     at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:142)
[error]     at com.jolbox.bonecp.PreparedStatementHandle.executeUpdate(PreparedStatementHandle.java:203)
[error]     at com.avaje.ebeaninternal.server.persist.ExeUpdateSql.execute(ExeUpdateSql.java:68)
[error]     ... 48 more

I've tried to read through the JPA 2.0 Specification and its sections on Relationship Mapping Defaults and included what I thought to be the relevant annotations given my object relationships but something just isn't working right. 我试图通读《 JPA 2.0规范》及其有关“关系映射默认值”的部分,并考虑到我的对象关系包括了我认为是相关的注释,但是有些东西行不通。 This application is built on the Java Play! 该应用程序基于Java Play构建! framework (version 2.1.3) FYI. 框架(版本2.1.3)仅供参考。

Any thoughts on what I may be doing wrong? 对我可能做错的事情有任何想法吗?

NOTE: 注意:
The functionality I'm looking for is 我正在寻找的功能是

  • When you create/update/delete an Acronym, any associated Expansion(s) should also be created/updated/deleted 创建/更新/删除首字母缩写词时,还应创建/更新/删除任何关联的扩展

  • When you delete an Expansion or a Tag, associated Tags or Expansions, respectively, should not be affected (a Tag can exist without an associated Expansion and vice versa) 删除扩展或标签时,分别不会影响关联的标签或扩展(没有关联的扩展就可以存在标签,反之亦然)

When you delete an Acronym, it's associated Expansion objects get deleted. 删除首字母缩写词时,它的关联扩展对象将被删除。 However, on the Tag table, there's a foreign key to the Expansion table, which prevents the Expansion from being deleted. 但是,在Tag表上,Expansion表有一个外键,这可以防止Expansion被删除。

I suggest that you revisit your design and think carefully about the delete functionality and whether you really want the deletion of the Acronym to delete all the related Expansions and Tags. 我建议您重新设计,并仔细考虑删除功能以及是否真的要删除首字母缩写词以删除所有相关的扩展和标签。 This doesn't seem like a realistic usecase. 这似乎不现实。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 尝试删除时违反参照完整性约束 - Referential integrity constraint violation when trying to delete Hibernate Cascade DELETE OneToMany 不起作用。 违反参照完整性约束 - Hibernate Cascade DELETE OneToMany does not work. Referential integrity constraint violation 尝试从 hibernate 中与 cascadeType.ALL 的 OneToMany 关系中删除时出现参照完整性约束违规 - Getting referential integrity constraint violation while trying to delete from OneToMany relation with cascadeType.ALL in hibernate Hibernate / H2 @OneToMany移除子代时违反“参照完整性约束”? - Hibernate/H2 @OneToMany “Referential integrity constraint violation” on remove of child? JPA 2:在保存具有无方向OneToMany关系的实体时违反了引用完整性约束 - JPA 2: Referential integrity constraint violation while saving entity with undirectional OneToMany relationship H2参照完整性约束违反 - H2 Referential integrity constraint violation 无继承关系的参照完整性约束违规 - Referential integrity constraint violation for none inheritance relationship 如何防止在测试中违反参照完整性约束? - How to prevent referential integrity constraint violation in tests? 参照完整性约束违规 - 添加超过2条记录时失败 - Referential integrity constraint violation - failing when add more then 2 records 更新和/或删除时违反 Hibernate H2 参照完整性约束 - Hibernate H2 Referential Integrity Constraint Violation on Update and/or Remove
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM