[英]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. 相关的位是我有三个对象:首字母缩写词,扩展和标记。
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.