【问题标题】:Referential Integrity Constraint Violation when saving Many to Many - Ebean, Play, Yaml, Tests保存多对多时违反参照完整性约束 - Ebean、Play、Yaml、测试
【发布时间】:2013-12-09 17:33:37
【问题描述】:

我有一个使用 Ebean 的 Play 2.2.1 Java 应用程序,为此我有一个测试环境,该环境使用 .yml 文件中的初始数据创建数据库:

criteria:
  - !!models.Criterion
    name: "testcriterion1"
    id: 10
  - !!models.Criterion
    name: "testcriterion2"
    id: 20

scoringmodels:
  - !!models.ScoringModel
    id: 10
    criteria:
        - !!models.Criterion
            id: 10

模型如下所示:

@Entity
public class ScoringModel extends Model {
    @Id
    public Long id;
    @ManyToMany
    public List<Criterion> criteria;
}

@Entity
public class Criterion extends Model {
    @Id
    public Long id;
    @Required
    public String name;
}

在每次测试之前清除并重建数据库:

@Before
public void createCleanDb() {
    Ebean.execute(Ebean.createCallableSql(dropDdl));
    Ebean.execute(Ebean.createCallableSql(createDdl));
    //Create initial data
    Map<String,List<Object>> all = (Map<String,List<Object>>)Yaml.load("initial-data.yml");
    Ebean.save(all.get("scoringmodels"));
    Ebean.save(all.get("criteria"));
} 

运行测试时出现以下错误:

参照完整性约束违反: “FK_SCORING_MODEL_CRITERION_CR_02:PUBLIC.SCORING_MODEL_CRITERION FOREIGN KEY(CRITERION_ID) REFERENCES PUBLIC.CRITERION(ID) (10)"; SQL 语句:[错误] 插入到 score_model_criterion (scoring_model_id,criteria_id) 值 (?, ?) [23506-172] [错误]
在 com.avaje.ebeaninternal.server.persist.ExeUpdateSql.execute(ExeUpdateSql.java:76) [错误] 在 com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeSqlUpdate(DefaultPersistExecute.java:115) [错误] 在 com.avaje.ebeaninternal.server.core.PersistRequestUpdateSql.executeNow(PersistRequestUpdateSql.java:44) [错误] 在 com.avaje.ebeaninternal.server.core.PersistRequest.executeStatement(PersistRequest.java:74) [错误] 在 com.avaje.ebeaninternal.server.core.PersistRequestUpdateSql.executeOrQueue(PersistRequestUpdateSql.java:49) [错误] 在 com.avaje.ebeaninternal.server.persist.DefaultPersister.executeSqlUpdate(DefaultPersister.java:139) [错误] 在 com.avaje.ebeaninternal.server.persist.DefaultPersister.saveAssocManyIntersection(DefaultPersister.java:999) [错误] 在 com.avaje.ebeaninternal.server.persist.DefaultPersister.saveMany(DefaultPersister.java:730) [错误] 在 com.avaje.ebeaninternal.server.persist.DefaultPersister.saveAssocMany(DefaultPersister.java:631) [错误] 在 com.avaje.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:339) [错误] 在 com.avaje.ebeaninternal.server.persist.DefaultPersister.saveEnhanced(DefaultPersister.java:310) [错误] 在 com.avaje.ebeaninternal.server.persist.DefaultPersister.saveRecurse(DefaultPersister.java:280) [错误] 在 com.avaje.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:248) [错误] 在 com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1759) [错误] 在 com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1737) [错误] 在 com.avaje.ebean.Ebean.save(Ebean.java:526) [错误]
在 com.avaje.ebean.Ebean.save(Ebean.java:533) [错误] 在 controllers.BaseControllerTest.createCleanDb(BaseControllerTest.java:53) [错误] ... [错误] 引起:org.h2.jdbc.JdbcSQLException: 参考 Integrität verletzt:“FK_SCORING_MODEL_CRITERION_CR_02: PUBLIC.SCORING_MODEL_CRITERION FOREIGN KEY(CRITERION_ID) 参考 PUBLIC.CRITERION(ID) (10)"

任何提示或答案将不胜感激!

【问题讨论】:

    标签: java testing yaml ebean playframework-2.2


    【解决方案1】:

    所以我通过更改对象的持久化顺序解决了这个问题。由于评分模型参考标准,因此需要首先插入这些标准。 因此它必须是:

    @Before
    public void createCleanDb() {
        Ebean.execute(Ebean.createCallableSql(dropDdl));
        Ebean.execute(Ebean.createCallableSql(createDdl));
        //Create initial data
        Map<String,List<Object>> all = (Map<String,List<Object>>)Yaml.load("initial-data.yml");
        Ebean.save(all.get("criteria"));
        Ebean.save(all.get("scoringmodels"));
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多