Когда вы вызываете Session.save()
или подобное, Hibernate немедленно генерирует идентификаторы и выполняет вставку, а не просто ставит ее в очередь, чтобы сохранить позже. Таким образом, нет пробела, в котором элемент имеет свой идентификатор, назначенный до его вставки. Для стратегии генерации идентификаторов «идентичности» все равно их невозможно разделить ...
По моему опыту, самый безопасный и простой способ справиться с этим случаем - это использовать Interceptor (или, может быть, EventListener?), Чтобы перехватить сущность, вставляемую с незаданным свойством hashedId, и сгенерировать ее непосредственно перед сохранением. Это немного неприятно, но ИМХО лучше, чем затягивать генерацию идентификатора в код приложения.
Вот пример, в котором я генерирую свойство 'reference' для новой сущности Ticket (используя Interceptor):
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames,
Type[] types) {
boolean changed = super.onSave(entity, id, state, propertyNames, types);
if (entity instanceof Ticket) {
for (int i = 0; i < propertyNames.length; i++) {
if (propertyNames[i].equals("reference") && state[i] == null) {
state[i] = generateTicketReference((Integer) id);
changed = true;
}
}
}
return changed;
}