2011-12-06 32 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中做过这个,但不知道如何在这里表达它。另外,我希望(哦,上帝请让它这样),有一些标准的串行器,可以处理整数阵列。 –