foreign-keys - Javers - 外键约束因 mysql 而失败
问题描述
我是javers的新手。为我的应用程序启动了 POC,但由于 mysql 的“last_insert_id()”函数返回“0”而在提交时获取 SQL_EXCEPTION。
我做了什么:
- 在 spring boot maven (javers core & javers mysql) 中添加了started
- 与我的数据库架构创建了连接
- 得到了 May db 中的所有表(jv_global_id、jv_commit 等)
问题:
我正在使用带有 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 配置中还有其他需要注意的地方。
解决方案
我遇到了同样的问题,这是由于每次在 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;
}
};
推荐阅读
- sql - 如何使用 EXEC 命令
- javascript - 谷歌浏览器扩展,关闭持久化后台页面
- javascript - MongoDB 聚合 - 查询对象数组
- angular - 请求的身份验证范围不足(Google Cloud 资源管理器)
- python - 如何让用户输入从现有的词袋中提取?
- c++ - 有没有办法将 std::atomic 存储在结构内、std::pair 内?
- javascript - 使用烧瓶在套接字 io 中创建动态事件
- r - R Studio 没有响应 names() 命令
- git - 使用 Apache 基本身份验证禁用 git 对特定目录的访问
- angular - 如何从 Angular 登录页面连接和使用内置身份?