某個老舊的table設定,其中一個欄位設char(10)
結果裡面的值有長有短,不足10碼的就自動補空白
導致在後端處理的時候處理很麻煩
當然最簡單的方式是改DB欄位設定
但總不是如人所願
所以只好針對Hibernate轉Bean的時候下手
先談失敗的改法:
我修改Hibernate塞Bean的時候一定要透過set方法 (找不到怎麼設的了QQ)
然後我在set方法中寫trim的動作
承原始問題,那些char設定很多都用在Primary Key
最後用Bean Update資料的時候就爆炸了
Exception在Hibernate這邊,還沒到DB
Exception的大意是Bean的Id被改過 (很久以前,也懶得還原當時情況了)
後來就改為現在這邊要介紹的方法
先自定義Hibernate Type
public class CustomerTrimStringType implements UserType{ private int sqlType(){ return Types.VARCHAR; } @Override public Object assemble(Serializable arg0, Object arg1) throws HibernateException { return null; } @Override public Object deepCopy(Object value) throws HibernateException { return value; } @Override public Serializable disassemble(Object arg0) throws HibernateException { return null; } @Override public boolean equals(Object value1, Object value2) throws HibernateException { if (value1 == null) { if (value2 != null) { return false; } return true; } return value1.equals(value2); } @Override public int hashCode(Object value) throws HibernateException { return value == null ? 0 : value.hashCode(); } @Override public boolean isMutable() { return false; } @Override public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException { Object value = rs.getString(names[0]); if ((value == null) || (rs.wasNull())){ return null; } return value.toString().trim(); } @Override public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor arg3) throws HibernateException, SQLException { if(value == null){ st.setNull(index, sqlType()); }else{ st.setString(index, (String)value); } } @Override public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException { return null; } @Override public Class returnedClass() { return String.class; } @Override public int[] sqlTypes() { return new int[]{ Types.VARCHAR }; } }
在45行nullSafeGet這個方法做修改
另外,沒意外的話nullSafeSet這個方法是Hibernate -> DB的動作
設定Hibernate Bean的欄位要使用自定義的Type
public class TableBean { private String column1; @Column(name = "column1") @Type(type="packageName.CustomerTrimStringType") public String getColumn1() { return this.Column1; } public void setColumn1(String column1){ this.column1 = column1; } }
沒有留言:
張貼留言