首页 > 解决方案 > 在 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'

标签: javamysqlhibernate

解决方案


我认为您的 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 部分添加实体详细信息以及如何保存记录。


推荐阅读