某個老舊的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;
}
}
沒有留言:
張貼留言