2009-07-01 46 views
0

我們有存儲SpecialStrings的舊式列的表。這些SpecialStrings不能爲NULL,而是等於SPECIAL_UNICODE_NULL通過使用自己的註釋來更改Entity Bean值的查看方式

因此,要發送的實體回通過JAX-WS客戶端,我們必須要麼實現整個實體包裝發送它,而不是實體的或明確添加轉換邏輯實體get方法。

我們希望做的就是用我們自己的@LegacyString註解。

@Column(name="A_LEGACY_COLUMN") 
@LegacyString 
public String oneOfThenLegacyColumn; 

然後在默認實體監聽@PostLoad我們會通過適當的變換變換所有@LegacyString領域普通字符串。

但是,這樣的解決方案的問題是,經過後負載修改實體被認爲是改變和實體管理器將嘗試將其更新到數據庫中。當然,我可以使用​​方法恢復更改。但我不確定這是否會阻止實體進行真正的更新。

所以問題是:如何更改實體Bean值通過自己的註釋查看?

P.S.我對ClassLoader進行了一些挖掘,並且我將考慮在加載時間中添加更改的變體。但是我無法找到Application Server類加載器案例的合理示例。

回答

2

您可以通過創建自己的實現的org.hibernate.usertype.UserType處理特殊情況是這樣的休眠。

public class SpecialStringUserType implements UserType { 

    private static final int[] SQL_TYPES = { Types.VARCHAR }; 

    public int[] sqlTypes() { 
    return SQL_TYPES; 
    } 

    public Class returnedClass() { 
    return String.class; 
    } 

    public boolean equals(Object x, Object y) 
     throws HibernateException { 
    if (x == y) { 
     return true; 
    } else if (x == null || y == null) { 
     return false; 
    } else { 
     return x.equals(y); 
    } 
    } 

    public Object nullSafeGet(ResultSet resultSet, 
     String[] names, Object owner) 
     throws HibernateException, SQLException { 
    String result = resultSet.getString(names[0]); 
    if ("SPECIAL_UNICODE_NULL".equals(result)) { 
     return null; 
    } 
    return result; 
    } 

    public void nullSafeSet(PreparedStatement statement, 
     Object value, int index) 
     throws HibernateException, SQLException { 
    if (value == null) { 
     statement.setString(index, "SPECIAL_UNICODE_NULL"); 
    } else { 
     statement.setString(index, value); 
    } 
    } 

    public Object deepCopy(Object value) throws HibernateException { 
    return value; 
    } 

    public boolean isMutable() { 
    return false; 
    } 
} 

而不是使用自己的@LegacyString註釋執行以下操作:

@Column(name="A_LEGACY_COLUMN") 
@Type(type = "SpecialStringUserType") 
public String oneOfThenLegacyColumn; 
+0

我打算今天這個檢查。它看起來很漂亮。與TopLink相同的事情呢?它可以以某種方式跨越廠商? – 2009-07-02 06:57:21

相關問題