2014-02-20 52 views
1

我的表的列爲char(5),無法將其更改爲varchar(5)。所以當我使用hibernateTemplate從表中取出數值時,它會返回帶有實際單一字母表值的空格(客戶定義是使用.trim()方法檢查NPE),但是我們是否提供了處理這種類型的方法的情況。 PS.I使用Spring支持hibernate dao支持。 (在SQL中,CHAR數據類型是一個固定長度的字符串,根據定義,其他字符用空格填充)如何使用休眠和舊數據庫修剪字段pojo中的空格

回答

0

我已經similar question here

建議的解決方案我覺得添加的用戶類型最好的套房的要求提到的討論和更有意義,因爲 1. @PostLoad(或實際生命週期方法)做不能與使用SessionFactory和Hibernate一起工作。 2.代碼重寫器中的修改可能會被忽略,而另一個開發人員可能會忽略可能導致重寫該setter的setter。

所以我正在使用以下解決方案。 1.有一個package-info.java: - 它具有正在使用的typedefs的詳細信息。 2.Annotated與@Type(類型= 「MyTrimTypeString」) 3.Defined用戶類型的類MyTrimTypeString,Code for which followed reply by StepherSwensen字段與nullSafeGet輕微更新看起來像

@Override 
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException 
    { 
    final String val = rs.getString(names[0]); 
    return (val == null ? val : val.trim()); 
    } 

和nullSafeSet看起來像:

@Override 
    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException 
    { 
    final String val = (String)value; 
    st.setString(index, val); 
    } 
1

避免顯式調用trim()的一種方法是可以提供使用生命週期方法一個@PostLoad註釋你的Enitity。 如:

@PostLoad 
protected void trim(){ 
    if(stringAttr!=null){ 
     stringAttr=stringAttr.trim(); 
    } 
} 
+0

它非常像提供setter方法。這是沒有錯的,但尋找一些通用的解決方案 – Sankalp

+0

如果將此操作移動到setters/getters,則此檢查將在初始加載時以及隨後每次調用方法時發生。在此方法中,僅在初始加載時執行此操作。 – Rohit

+0

@PostLoad永遠不會在使用會話工廠使用休眠方式的地方調用。請參閱[鏈接](http://stackoverflow.com/questions/2802676/hibernate-postload-never-gets-invoked) – Sankalp