Mysql / Grails: как ID объекта инициализируется после вызова Entity.save () (без сброса) для вновь созданного объекта? - PullRequest
0 голосов
/ 10 ноября 2018

Я использую Mysql и Grails.

Предположим, у меня есть класс сущностей Book, таблица book в mysql имеет столбец auto_incremented id.

Скажите, что мой метод обслуживания следующий:

@Transactional
public void someMethod() {
    Book book = new Book("Book Name", "Author Name") // book.id is null here 
    book.save();
    println book.id // id is initialized
}

Когда я останавливаюсь на операторе println с использованием отладчика, я вижу, что book свойство id инициализировано. Поскольку я не flushing, что-либо для db, строка еще не вставлена ​​в db, и, следовательно, id не генерируется при вставке, а каким-то другим способом. Один из возможных способов инициализации id заключается в том, что hibernate запускает запрос только для извлечения следующего значения auto_increment, когда метод save() выполняется на объекте (не уверен, что это так). Если это так, то как насчет двух одновременных транзакций, получающих одинаковый идентификатор?

...