Java 所有者删除时引用完整性约束冲突(OneToMany单向)

Java 所有者删除时引用完整性约束冲突(OneToMany单向),java,jpa,playframework,playframework-2.1,ebean,Java,Jpa,Playframework,Playframework 2.1,Ebean,在单向OneToMany关系中删除所有者对象时遇到问题 相关的部分是我有三个对象:首字母缩写、扩展和标签 首字母缩略词与扩展有单向的一对一关系 扩展与标记具有双向多个关系 代码如下: @Entity public class Acronym extends Model { @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "acronym_id") public

在单向OneToMany关系中删除所有者对象时遇到问题

相关的部分是我有三个对象:首字母缩写、扩展和标签

  • 首字母缩略词与扩展有单向的一对一关系
  • 扩展与标记具有双向多个关系
代码如下:

@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;
...
}
我试着通读JPA2.0规范及其关于关系映射默认值的部分,并包含了我认为与对象关系相关的注释,但有些地方不正常。这个应用程序是基于Java Play构建的!框架(版本2.1.3)供参考

有没有想过我可能做错了什么

注意:
我正在寻找的功能是

  • 创建/更新/删除首字母缩略词时,还应创建/更新/删除任何关联的扩展

  • 删除扩展或标记时,相关联的标记或扩展不应分别受到影响(标记可以存在而不存在相关联的扩展,反之亦然)


删除首字母缩略词时,其关联的扩展对象将被删除。但是,在标记表上,扩展表有一个外键,可以防止删除扩展


我建议您重新审视您的设计,仔细考虑删除功能,以及是否真的希望删除首字母缩写以删除所有相关的扩展和标记。这看起来不像是一个现实的用例。

我们的想法是在删除首字母缩略词时只删除所有相关的扩展,但要保持标记的灵活性。我需要做些什么改变才能做到这一点?我尝试将标记中的扩展关系设置为nullable,但显然这不是一个有效的属性。我想我只是错误地使用了nullable属性,现在在标记中为Set Expansions字段设置@Column(nullable=true)。不幸的是,我仍然得到同样的错误。
[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