У меня есть таблица с генерируемым идентификатором, но в некоторых случаях я хотел бы установить ее самостоятельно. Могу ли я каким-то образом заставить Hibernate игнорировать @GeneratedValue?
@Id @GeneratedValue, но установите собственное значение ID
Ответ 1
Это может быть перебор, но вы подумали о написании собственного CustomIDGenerator, который, вероятно, подклассы говорят об автогенераторе спящего режима и предоставляет несколько методов, в которых вы можете установить идентификатор следующего объекта класса, который будет создан, например,
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
Ответ 2
Хотя этот вопрос был задан довольно давно, я нашел для него идеальный ответ в этом сообщении от @lOranger и хотел поделиться им.
Это предложение проверяет, установлено ли в текущем id объекта что-то отличное от null
, и если это так, оно использует его, в противном случае оно генерирует его с использованием стратегии генерации по умолчанию (или конфигурации).
Это просто, прямо и решает проблему, вызванную @Jens, из которой невозможно получить текущий идентификатор объекта.
Я только что реализовал его (расширив UUIDGenerator), и он работает как шарм: -D
Ответ 3
Для использования данного случая вы можете вручную добавить этого пользователя. Один из способов сделать это - поместить операцию вставки в файл с именем. /import.sql(в вашем пути к классам). Hibernate будет выполнять эти инструкции при запуске SessionFactory.
Ответ 4
создать свой собственный identifienerenerator/sequencegenerator
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()