Учитывая, что вы не можете изменить устаревший код, Райан имеет правильную идею .Некоторое время назад мне приходилось делать то же самое в личном проекте.Он состоял из двух частей: простая часть состоит в том, чтобы разрешить эффективную настройку идентификатора столбца с другим идентификатором-автонумерацией ... а другая - заставить генератор идентификаторов прекратить перезаписывать это значение при переходе к Save ().
Вот код для FlexibleIDGenerator, который я использовал:
public class FlexibleIDGenerator extends IdentityGenerator implements Configurable {
public static final String DEFAULT = "default";
private IdentifierGenerator assignedGenerator;
private IdentifierGenerator defaultGenerator;
@SuppressWarnings("unchecked")
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
//boolean useDefault = false;
if (object instanceof OverridableIdentity) {
if (((OverridableIdentity) object).isIDOverridden()) {
try {
Class cl = object.getClass().getSuperclass();
Method[] methods = cl.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equalsIgnoreCase("setId")) {
methods[i].invoke(object, Integer.valueOf((((OverridableIdentity) object).getOverriddenID())));
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return assignedGenerator.generate(session, object);
} else {
return defaultGenerator.generate(session, object);
}
} else {
return defaultGenerator.generate(session, object);
}
}
public void configure(Type type, Properties params, Dialect d) throws MappingException {
assignedGenerator = IdentifierGeneratorFactory.create("assigned", type, params, d);
defaultGenerator = IdentifierGeneratorFactory.create("increment", type, params, d);
}
}
Чтобы использовать его для класса, вы обновляете свой файл отображения Hibernate следующим образом:
<id
name="Id"
type="integer"
column="id"
>
<generator class="com.mypackage.FlexibleIDGenerator"/>
</id>
Еще одна деталь:Я добавил метод к своему базовому объекту с именем «GetOverriddenID ()», чтобы избежать путаницы в том, что я использую «обычный» идентификатор (в вызовах Update ()) или переопределенные.
Надеюсь, что это поможет.