鉴于您无法更改遗留代码,瑞安有正确的想法。前一段时间我在一个个人项目中不得不基本做同样的事情。有两个部分:简单的部分是允许有效设置另外自动编号的列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