在Hibernate上禁用mysql sql_mode

时间:2019-03-22 15:31:47

标签: java mysql hibernate

我有一个Java休眠mysql项目,由于我未提供主键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'

2 个答案:

答案 0 :(得分:0)

我认为您的INSERT问题与sql_mode没有关系。

即使Hibernate将sql_mode设置为STRICT_TRANS_TABLES也意味着什么?

  

如果无法按照交易表中的值插入值,   中止该语句。对于非事务表,中止该语句   如果值出现在单行语句或a的第一行中   多行语句。

更多详细信息here

回到您的INSERT问题

如果您使用的是Hibernate,那么您必须让某些实体说出Student之类的东西

@Entity
public class Student {

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private long studentId;

    // ...
}

现在,当您调用em.persist(student);或另一种添加数据的方式

您不需要提供studentId值。休眠会解决这个问题

如果这也无济于事

请在代码的数据库部分中添加实体详细信息以及如何保存记录。

答案 1 :(得分:0)

我尝试使用@GeneratedValue (strategy = GenerationType.IDENTITY),但是由于某些原因,它仍然无法正常工作。可能与我正在处理的旧项目的设置有关,或者可能需要较新的休眠模式。下面的代码有效,比我期望的更长。

@Entity
@Table(name = "table_a")
@GenericGenerator(name = "MyProject_Sequence_Generator", strategy = "org.hibernate.id.enhanced.TableGenerator", parameters = {
        @Parameter(name = TableGenerator.TABLE_PARAM, value = "table_primary_key_lookup"),
        @Parameter(name = TableGenerator.VALUE_COLUMN_PARAM, value = "next_obj_id"),
        @Parameter(name = TableGenerator.SEGMENT_COLUMN_PARAM, value = "table_name"),
        @Parameter(name = TableGenerator.OPT_PARAM, value = OptimizerFactory.POOL),
        @Parameter(name = TableGenerator.INITIAL_PARAM, value = "1"),
        @Parameter(name = TableGenerator.INCREMENT_PARAM, value = "1"),
        @Parameter(name = TableGenerator.CONFIG_PREFER_SEGMENT_PER_ENTITY, value = "true") })
public class TableAModel {
}