В Grails / Hibernate Можно ли настроить генератор на приращение, только если он не назначен? - PullRequest
3 голосов
/ 15 июня 2010

Есть ли способ использовать hibernate, используя автоматически сгенерированные идентификаторы, если он не был назначен, но использовать назначенное значение, если оно было?

1 Ответ

3 голосов
/ 16 июня 2010

Я полагаю, что в 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"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...