2011-12-06 35 views
0

免責聲明:我對Java開發完全陌生。我做了很多C#和一些NHibernate,但這個@Attributes和get/set方法的世界對我來說完全是陌生的。如何序列化Hibernate中的集合屬性?

問:我有一個非常簡單的持久化對象

@Entity 
@Table(name = "ADMIN_SETTINGS") 
public class AdminSettings extends ClientEntity { 
    @Column(name = "SAMPLE_ID_PREFIX") 
    private String sampleIdPrefix; 
    @Column(name = "USE_24_Hr_CLOCK") 
    private Boolean use24hrClock; 

    private Integer[] FieldsForSampleBoxView; 
... 

映射,去年場我被卡住用。這是一個最多3個整數的簡單列表。我不需要一對多的表,我不需要聚合它,我只需要將集合序列化到數據庫中的字段。理想情況下,通過一些人的可讀性,但老實說,我不在乎。

我該如何去做這個映射?

回答

1

如果它最多包含3個整數,爲什麼不把這三個整數存儲在三列中?這至少會被標準化和查詢。如果不是,那麼就使用持久String類型的屬性,並解析這個字符串中的getter和轉換爲字符串中的二傳手:

@Column(FIELDS_FOR_SAMPLE_VIEW_BOX) 
private String fieldsForSampleViewBox; 

public void setFieldsForSampleViewBox(Integer[] array) { 
    StringBuilder b = new StringBuilder(); 
    for (int i = 0; i < array.length; i++) { 
     if (array[i] != null) { 
      b.append(array[i]); 
     } 
     if (i < array.length - 1) { 
      b.append(','); 
     } 
    } 
    fieldsForSampleViewBox = b.toString(); 
} 

public Integer getFieldsForSampleViewBox() { 
    if (fieldsForSampleViewBox == null || fieldsForSampleViewBox.length() == 0) { 
     return new Integer[0]; 
    } 
    String[] strings = fieldsForSampleViewBox.split(","); 
    Integer[] result = new Integer(strings.length()); 
    for (int i = 0; i < strings.length(); i++) { 
     if (!strings[i].equals("") { 
      result[i] = Integer.valueOf(strings[i]); 
     } 
    } 
    return result; 
} 

您也可以使用@Lob註解或@Type(TYPE =「序列化「)註釋在Integer數組上,但是將使用本地Java序列化,並且它更脆弱並且不可讀。

+0

所以,如果我只是把它放在我的Integer []數組上'@Column(「FIELDS_FOR_SAMPLE_VIEW_BOX」)'和@Type(type =「serializable」)'它應該工作?如果這段數據被破壞並且用戶不得不重新選擇,那麼說實話並不重要。您可以請包括@ Lob/@ Type解決方案的樣子嗎?謝謝! –

+0

是的,它應該工作。該列應該是一個二進制列。請注意,如果數據損壞,用戶將無法執行任何操作:每次加載實體時都會拋出異常。 –

+0

好的,這將是一個問題確定 –

0

Credit轉到第一個鏈接谷歌返回「冬眠堅持陣列」:您可能需要this。從本質上講,它說你需要將你自己的串行器插入到Hibernate中。由於我不是Hibernate專家,因此我不知道如何在註釋中表達這一點。

簡單得多,但不那麼優雅:不要序列int[]所有,而不是拿着它的數據序列化形式裏面AdminSettings,比方說,在自定義的分隔符(啊)的字符串。或者同時具有int[]和序列化格式,但它將花費更多的內存和更多的CPU來支持它們之間的一致性。

+0

是的,這就是我問的問題。我之前在NHibernate中做過這個,但不知道如何在這裏表達它。另外,我希望(哦,上帝請讓它這樣),有一些標準的串行器,可以處理整數陣列。 –