鑑於您無法更改遺留代碼,瑞安有正確的想法。前一段時間我在一個個人項目中不得不基本做同樣的事情。有兩個部分:簡單的部分是允許有效設置另外自動編號的列ID ...另一個是當您轉到Save()時,使ID生成器停止覆蓋該值。
下面的代碼,以我所用的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()」,以避免混淆我是否使用「正常」ID(在Update()調用)或重寫的。
希望有所幫助。
謝謝它的工作:) – dpsdce