2011-10-03 158 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的末尾。我從來沒有嘗試過,所以我只能指出你的大方向。