java - 在 Hibernate 上禁用 mysql sql_mode
问题描述
我有一个 java hibernate mysql 项目,其中一个查询一直无法 INSERT 因为我没有提供主键的值AUTO_INCREMENT
。
我跟踪了 Hibernate 查询,Hibernate 真正发送到 MySql 的内容
SET GLOBAL general_log = 'ON';
SHOW GLOBAL VARIABLES LIKE 'general_log%';
我跟踪了 general_log 文件,似乎发出了一些会话命令,例如SET sql_mode='STRICT_TRANS_TABLES',有些人认为我们不应该这样做。我们应该保持sql_mode为空。
2019-03-22T15:16:11.207625Z 418 Query SET sql_mode='STRICT_TRANS_TABLES'
2019-03-22T15:16:11.207987Z 418 Query SHOW WARNINGS
2019-03-22T15:16:11.213624Z 418 Query SELECT @@session.transaction_isolation
2019-03-22T15:16:11.214109Z 418 Query SELECT @@session.transaction_read_only
2019-03-22T15:16:11.221148Z 418 Query SET autocommit=0
2019-03-22T15:16:11.252061Z 418 Query rollback
2019-03-22T15:16:11.252457Z 418 Query SET autocommit=1
2019-03-22T15:16:11.514489Z 418 Query SET autocommit=0
2019-03-22T15:16:11.545532Z 418 Query DELETE FROM `db1`.`table_a`
2019-03-22T15:16:11.549415Z 418 Query commit
2019-03-22T15:16:11.550861Z 418 Query SET autocommit=1
2019-03-22T15:16:11.551402Z 418 Query SET autocommit=0
2019-03-22T15:16:11.551896Z 418 Query ALTER TABLE `db1`.`table_a` AUTO_INCREMENT = 1
2019-03-22T15:16:11.567116Z 418 Query commit
2019-03-22T15:16:11.567413Z 418 Query SET autocommit=1
2019-03-22T15:16:11.568958Z 418 Query SET autocommit=0
2019-03-22T15:16:11.569947Z 418 Query INSERT INTO `db1`.`table_a` (key_reference, customer_obj_id, is_deleted) VALUES ('1ab0ccd3-3195-45eb-a65e-8ce8cf7b9808', 1, 0)
我已经在我的 my.cnf 中确认了这一点
[mysqld]
sql-mode=""
使用 MySQL Workbench 连接到服务器:
SHOW VARIABLES LIKE 'sql_mode';
Variable_name sql_mode, Value=
所以我已经确认它不是来自我的服务器配置。如何阻止休眠SET sql_mode='STRICT_TRANS_TABLES'?
解决方案
我认为您的 INSERT 问题与sql_mode
.
即使 Hibernate 将 sql_mode 设置为STRICT_TRANS_TABLES
这意味着什么?
如果无法将给定的值插入到事务表中,则中止该语句。对于非事务表,如果值出现在单行语句或多行语句的第一行中,则中止语句。
更多细节在这里
回到您的 INSERT 问题
如果您使用的是 Hibernate,那么您必须有一些实体说学生这样的东西
@Entity
public class Student {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private long studentId;
// ...
}
现在当您打电话em.persist(student);
或以其他方式添加数据时
你不需要提供studentId
价值。Hibernate 会解决这个问题
如果这也没有帮助
请在代码的 DB 部分添加实体详细信息以及如何保存记录。
推荐阅读
- javascript - 多个画布上的多个场景 Threejs
- sql-server - 为什么 DECIMAL 的行为类似于 FLOAT?
- applescript - AppleScript——列表 1 的项目包含列表 2 的项目
- android - Xamarin 图像背景未在 Android 上显示
- ibm-content-navigator - 在 Content Navigator 中单击文档时调用的服务
- ios - 辅助功能:Talkback 会自动读取对话内容。但是 NVDA 和 VoiceOver 不会读取
- android - UnityPlayer 原生崩溃
- python - 如何使用 Python 监控 Informatica 作业并发送有关作业状态的邮件?
- php - 如何根据某些值或索引拆分数组?
- com0com - Com0Com 从命令提示符创建端口