@Id @GeneratedValue, но установить собственное значение идентификатора - PullRequest
23 голосов
/ 21 января 2010

У меня есть таблица с сгенерированным идентификатором, но в некоторых случаях я хотел бы установить ее самостоятельно. Можно ли заставить Hibernate игнорировать @GeneratedValue?

Ответы [ 4 ]

8 голосов
/ 15 февраля 2010

Это может быть излишним, но вы задумывались о написании своего собственного CustomIDGenerator, который, вероятно, подклассы говорят AutoGenerator hibernate и предоставляет пару методов, где вы можете установить идентификатор следующего объекта класса, который будет сгенерирован, например,

class MyGenerator extends .... {

public void setIdForObject(Class clazz, Long id) {
    //once you use this API, the next time an object of 
    //type clazz is saved the id is used
}

public void setIdForObject(Class clazz, Long id, Matcher matcher) {
    //once you use this API, the next time an object of 
    //type clazz is saved and the matcher matches yes the id will be 
    //assigned. Your matcher can match properties like name, age etc
    //to say the matched object
}
}

Это может быть сложно, но, по крайней мере, возможно согласно hibernate doco

4 голосов
/ 13 ноября 2012

Хотя этот вопрос задавался довольно давно, я нашел идеальный ответ на него в этом посте от @lOranger и хотел поделиться им.

В этом предложении проверяется, установлено ли для текущего идентификатора объекта значение, отличное от null, и, если это так, оно использует его, в противном случае оно генерирует его, используя стратегию генерации по умолчанию (или настроенную).

Это просто, прямо и решает проблему, поднятую @Jens, о невозможности получить текущий идентификатор объекта.

Я только что реализовал это (расширяя UUIDGenerator), и он работает как шарм: -D

3 голосов
/ 20 апреля 2017

создайте свой собственный идентификатор генератора / генератора последовательностей

public class FilterIdentifierGenerator extends IdentityGenerator implements IdentifierGenerator{

@Override
public Serializable generate(SessionImplementor session, Object object)
        throws HibernateException {
    // TODO Auto-generated method stub
    Serializable id = session.getEntityPersister(null, object)
            .getClassMetadata().getIdentifier(object, session);
    return id != null ? id : super.generate(session, object);
}

}

измените свою сущность следующим образом:

@Id
@GeneratedValue(generator="myGenerator")
@GenericGenerator(name="myGenerator", strategy="package.FilterIdentifierGenerator")
@Column(unique=true, nullable=false)
private int id;
...

и при сохранении вместо использования persist() используйте merge() или update()

2 голосов
/ 24 января 2010

В вашем случае вы можете вручную добавить этого пользователя. Один из способов сделать это - поместить операцию вставки в файл с именем. Hibernate выполнит эти операторы при запуске SessionFactory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...