Я попытался воспроизвести это поведение, используя Grails 1.3.7, и обнаружил, что оно воспроизводимо.
class Child {
String name
static constraints = { name(unique:true) }
}
table created
CREATE TABLE `child` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
)
Запросы, запущенные на child.save()
Hibernate: select this_.id as id0_0_, this_.version as version0_0_, this_.created_by as created3_0_0_, this_.date_created as date4_0_0_, this_.last_updated as last5_0_0_, this_.name as name0_0_, this_.updated_by as updated7_0_0_ from child this_ where this_.name=?
Hibernate: insert into child (version, created_by, date_created, last_updated, name, updated_by) values (?, ?, ?, ?, ?, ?)
Причина, по которой я думаю, что спящий режим запускает вышеуказанный запрос, заключается в проверке уникального ограничения. И в случае, если вы пытаетесь выполнить обновление, этот запрос приведет к тому, что в памяти будет другой объект с тем же идентификатором, что может привести к неуникальному объектному исключению.
Я думаю, что это спящий режим, а не Грааль, дважды не проверял это в java/hibernate.
Спасибо
20.05.2011