您好我有一个域对象让我们说学生及其Roll no作为主键
这是它的示例映射。
@Id
@Column(name = "Roll_NO", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Roll_NO_SEQ")
@SequenceGenerator(name = "Roll_NO_SEQ", sequenceName = "Roll_NO_SEQ", allocationSize = 1)
public Long getRollNo() {
return this.rollNo;
}
问题:让我们说一个特定的学生是否从数据库中删除,然后在重新录取时重新录取我想保留旧卷号。所以,当我调用session.save时,hibernate根据指定的Sequence指定一个新的卷号,而不是我通过setRollNo()方法设置的内容。有没有办法在hibernate中实现这个目标?
答案 0 :(得分:3)
不要删除记录,添加一个名为soemthign的新布尔字段,如 active 或 valid ,而不是仅删除make active = false 。
或者,
您可以将要删除的记录插入存档表中,然后删除,然后从那里查找。
答案 1 :(得分:1)
鉴于您无法更改行的删除,另一种方法是编写您自己的id生成器,如果尚未分配值,则只生成新的序列值。有关编写自己的生成器的信息,请参阅section 5.1.2.2 in the reference guide的末尾。我以前从未尝试过这个,所以我只能指出你的方向。
答案 2 :(得分:1)
鉴于您无法更改遗留代码,Ryan有正确的想法。不久前我在个人项目中必须做同样的事情。有两个部分:简单的部分是允许有效设置其他自动编号列的ID ...另一部分是让ID生成器在转到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()”的方法,以避免混淆我是否使用“普通”ID(在Update()调用中)或被覆盖的ID。
希望有所帮助。