如何在Hibernate中序列化集合属性?

时间:2011-12-06 21:43:13

标签: java hibernate orm mapping

免责声明:我对Java开发完全陌生。我已经做了很多C#和一些NHibernate但是这个@Attributes和get / set方法的世界对我来说完全是陌生的。

问题:我有一个非常简单的持久对象

@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个整数的简单列表。我不需要一对多的表,我不需要在它上面聚合,我只需要将集合序列化到db中的一个字段。理想情况下,通过人类可读但诚实的东西,我不在乎。

如何进行此映射?

2 个答案:

答案 0 :(得分:1)

如果它包含最多3个整数,为什么不将这三个整数存储在三列中?这至少是规范化和可查询的。如果没有,那么只需使用持久的String属性,并在getter中解析此字符串并转换为setter中的字符串:

@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;
}

您也可以在Integer数组上使用@Lob注释或@Type(type =“serializable”)注释,但是将使用本机Java序列化,它更脆弱且不可读。

答案 1 :(得分:0)

信用转到google为“hibernate persist array”返回的第一个链接:您可能需要this。从本质上讲,它表示你需要将自己的序列化程序插入Hibernate。由于我不是Hibernate专家,我不知道如何在注释中表达这一点。

更简单但不那么优雅:根本不要序列化int[],而是在AdminSettings内以序列化形式保存它的数据,例如,在带有自定义分隔符(ugh)的字符串中。或者同时具有int[]和序列化形式,但它会花费更多内存和更多CPU来支持它们之间的一致性。