Я использую 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()
выполняется на объекте (не уверен, что это так). Если это так, то как насчет двух одновременных транзакций, получающих одинаковый идентификатор?