Hibernate Session.save问题

时间:2011-10-03 07:24:10

标签: hibernate sequence

您好我有一个域对象让我们说学生及其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中实现这个目标?

3 个答案:

答案 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。

希望有所帮助。