Я полагаю, что в Grails для этого нет готового решения, но реализовать собственный org.hibernate.id.IdentifierGenerator должно быть довольно просто.
Реализуя этот интерфейс, вы делегировали бы свою стратегию генерации идентификатора по умолчанию, если идентификатор не назначен, и в противном случае используете уже присвоенное значение вашего доменного объекта.
Простая реализация, делегирующая IdentityGenerator, когда не назначен ключ, может выглядеть следующим образом:
package my.company.hibernate
import org.hibernate.engine.SessionImplementor
public class PreAssignedIdGenerator extends org.hibernate.id.IdentityGenerator {
public Serializable generate(SessionImplementor session, Object object) {
return object.id ? object.id : super.generate(session, object)
}
}
Вашему классу домена нужно будет определить новый генератор идентификаторов:
class FooDomain {
Long id
static mapping = {
id generator: "my.company.hibernate.PreAssignedIdGenerator"
}
}