2015-07-02 36 views
3

JPA 2.1引入了一個漂亮的新功能Attribute Converter - 請參閱文章例如這裏:http://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/如何在JPA <= 2.0中模擬屬性轉換器?

它允許你有一個特定類型的屬性,並將其作爲別的東西存儲在數據庫列中。例如。您有一個字段顏色類型爲java.awt.Color的實體,但您希望將其作爲String存儲在數據庫中,例如REDWHITE

@Entity 
class Tag { 
    String name; 
    java.awt.Color color; // I want it to be stored as a different type 
} 

有沒有得到類似的結果,在JPA < = 2.0的一種方式?我想爲而不是enum

我們沒有區分業務領域層和@Entity類。當然,如果在它們之間存在某種映射關係,我可以想象許多有效的解決方案。我正在尋找的是一個解決方案,我們在業務領域層自己使用直接@Entity類。

+0

在我以前工作的系統中,他們每次使用前都會序列化類並反序列化字段。 – user902383

+0

@ user902383,你能更具體嗎?我直接使用'@ Entity'類作爲域類。如果域類與'@ Entity'類不同,我可以想象得到一百萬個解決方案。 –

+0

依賴於實現。有些「類型轉換器」在什麼時候回來。你沒有提及你的實現 –

回答

4

我建議是什麼使這列@Transient並添加另一個@Column,這將是awt.Color,使用getter和setter作爲轉換器的字符串值。

你的班會,因爲這:

@Transient 
java.awt.Color color; 
@Column 
String colorField; 

每次你用你的顏色使用的setter時,此setter將解碼的顏色和它添加到colorField領域。

public setColor(java.awt.Color color){ 
    this.colorField = color.toString(); 
    this.color = color; 
} 
+0

謝謝@Koitoer,這裏的主要想法是使用'@ Transient'字段進行映射。這是否意味着'colorField'的setter將該值解碼並將其實際存儲爲'color'?我仍然有點不確定... –

+0

看到我的更新回覆 – Koitoer

+2

只是一個小小的評論,你不需要瞬態場'顏色'只是創建瞬態二傳手和吸氣劑,你自動做轉換 – user902383

1

正如我在評論提到,在我的工作系統,定做非實體類串行化爲字節數組,並把以分貝爲BLOB,並在使用前反序列化。

場被映射爲:

@Column(name = "data") 
private byte[] data; 

那麼我們不得不UTIL類有兩個靜態方法

public static byte[] serialize(Object object) throws IOException, 
      ClassNotFoundException { 
     // Serialize to a byte array 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutputStream out = new ObjectOutputStream(bos); 
     out.writeObject(object); 
     out.close(); 

     // Get the bytes of the serialized object 
     byte[] buf = bos.toByteArray(); 
     return buf; 
    } 

    public static Object deserialize(byte[] data) throws IOException, 
      ClassNotFoundException { 
     // Deserialize from a byte array 
     ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(
       data)); 
     Object o = in.readObject(); 
     in.close(); 
     return o; 
    } 

現在你可以創建瞬態getter和setter和使用derialize和反序列化也從和翻譯您的類

不確定是否推薦解決方案,但是直接從現有系統複製

+0

有趣的解決方案,雖然它不完全是我想要的 - 我不需要存儲對象的內容,而是將其轉換。不過,你應該得到我的+1點:)無論如何,它與Koitoer提到的差不多,只是更具體。我這裏的主要想法是使用'@ Transient'字段進行映射。 –

+0

對不起,我誤解了你,這一切都取決於你想要存儲/轉換什麼樣的對象,也許你可以做一些枚舉和'枚舉'註釋或去與小妞建議。 – user902383