Отключение mysql sql_mode в Hibernate - PullRequest
0 голосов
/ 22 марта 2019

У меня есть проект java hibernate 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 голосов
/ 27 марта 2019

Я пытался использовать @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 {
}
0 голосов
/ 22 марта 2019

Не думаю, что ваша проблема с INSERT связана с sql_mode.

Даже когда Hibernate устанавливает sql_mode на STRICT_TRANS_TABLES, что означает что?

Если значение не может быть вставлено, как указано в транзакционной таблице, прервать утверждение. Для нетранзакционной таблицы прервите оператор если значение встречается в однострочном выражении или в первой строке многострочный оператор.

Подробнее здесь

Возвращаясь к вашей проблеме вставки

Если вы используете Hibernate, значит, вам нужно, чтобы какая-то сущность сказала студенту что-то вроде этого

@Entity
public class Student {

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

    // ...
}

Теперь, когда вы звоните em.persist(student); или другим способом добавления данных

Вам не нужно указывать studentId значение. Hibernate позаботится об этом

Если это тоже не поможет

Просьба добавить детали сущности и то, как вы сохраняете запись, в части кода БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...