【问题标题】:Make EcliseLink fail if there is an error executing the DDL statements如果执行 DDL 语句出错,则使 EcliseLink 失败
【发布时间】:2011-08-25 14:41:42
【问题描述】:

我们使用 EclipseLink 进行持久化,并通过将属性 eclipselink.ddl-generation 设置为 drop-and-create-tables 来配置 EclipseLink 以自动创建数据库表等。

这可以正常工作,但是 EclipseLink(以及我们的应用程序)在单元测试期间以及在实际的 Web 应用程序启动时会愉快地继续,即使某些 DDL 语句失败。

我在错误地使用@Index 注释时注意到了这一点,并想知道为什么没有创建索引,直到我在日志中注意到:

org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.h2.jdbc.JdbcSQLException: 
Column "MY_INDEX_FLD" not found; SQL statement:
CREATE INDEX X_INDEX ON X (MY_INDEX_FLD)

我真的很想知道这是否会发生。如果某些 DDL 语句失败,是否有办法告诉 EclipseLink 使其成为致命错误?

在这种情况下,我至少希望我们的 (JUnit) 集成测试失败。

如果错误只是表已经存在(在针对现有数据库进行测试的情况下),则可以忽略某些方式的奖励积分。

【问题讨论】:

    标签: jpa error-handling integration-testing eclipselink


    【解决方案1】:

    显然,EclipseLink 无法做到这一点。

    我查看了 EclipseLink 中创建表的方法:

    org.eclipse.persistence.tools.schemaframework.TableCreator.createTables()

    (在页面上搜索“createTables”)。

    我包含以下行:

            try {
                schemaManager.createObject(table);
                session.getSessionLog().log(SessionLog.FINEST,
                    "default_tables_created", table.getFullName());
            } catch (DatabaseException ex) {
                session.getSessionLog().log(SessionLog.FINEST,
                "default_tables_already_existed", table.getFullName());
                    if (!shouldIgnoreDatabaseException()) {
                        throw ex;
                    }
            }
    

    显然 EclipseLink 假定创建表(和索引)期间的错误总是由已经存在的表引起的:-(。

    我为此提交了一个 EclipseLink 错误:Bug 356068。

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2019-02-09
      • 2011-01-02
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多