首页 > 解决方案 > Javers - 外键约束因 mysql 而失败

问题描述

我是javers的新手。为我的应用程序启动了 POC,但由于 mysql 的“last_insert_id()”函数返回“0”而在提交时获取 SQL_EXCEPTION。

我做了什么:

问题:

我正在使用带有 mysql 版本 5.7 的 spring boot 2.0 我深入调试了问题,发现当 Javers 代码 'org.javers.repository.sql.session.Session.java' 方法 'executeInsertAndGetSequence' 第 40 行时,试图找到主键它返回为零'0'。根据代码,mysql 方言不支持序列,因此它使用 mysql 函数“last_insert_id()”从 keyGenerator 生成一个值,最终它返回零。

我收到以下错误:

SQL_EXCEPTION: Cannot add or update a child row: a foreign key constraint fails (`jv_snapshot`, CONSTRAINT `jv_snapshot_commit_fk` FOREIGN KEY (`commit_fk`) REFERENCES `jv_commit` (`commit_pk`))\nwhile executing sql: INSERT INTO thinkhr_portal.jv_snapshot ( type, global_id_fk, commit_fk, version, state, changed_properties, managed_type ) VALUES  ( ?,?,?,?,?,?,? )

我想知道,如果 javers 不支持 mysql 5.7 版,或者在我的 javers 配置中还有其他需要注意的地方。

标签: foreign-keyssqlexceptionaudit-trailjavers

解决方案


我遇到了同样的问题,这是由于每次在 ConnectionProvider 中创建一个新连接。Javers 试图通过运行来获取提交 ID select last_insert_id(),并且在新连接中,它总是返回 0。

您希望您的连接提供商是这样的:

        ConnectionProvider connectionProvider = new ConnectionProvider() {
            private Connection conn;
            @Override
            public Connection getConnection() throws SQLException {
                if (conn == null) {
                    conn = buildNewConnection();
                }
                return conn;
            }
        };

推荐阅读