2011-10-03 160 views
1

您好我有一个域对象可以说,学生及残疾人没有作为主键休眠Session.save问题

这里是它的样本映射。

@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指定一个新的No,而不是通过setRollNo()方法设置。有没有什么办法可以在休眠状态下实现这一点?

回答

1

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

希望有所帮助。

+0

谢谢它的工作:) – dpsdce

3

不删除记录,添加一个新的布尔字段名为soemthign像活跃有效,而不是删除只是使激活=假

或者,

你可以插入记录要被删除到归档表,然后删除,然后再从那里查找。

+0

我不能改变现有的功能。作为其传统代码 – dpsdce

1

鉴于您不能更改行的删除,另一种方法是编写您自己的id生成器,如果尚未分配值,则只会获得新的序列值。有关编写自己的发电机的信息,请参阅section 5.1.2.2 in the reference guide的末尾。我从来没有尝试过,所以我只能指出你的大方向。