Подтвердить что ты не робот

@Id @GeneratedValue, но установите собственное значение ID

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

4b9b3361

Ответ 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()