免责声明:我对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中的一个字段。理想情况下,通过人类可读但诚实的东西,我不在乎。
如何进行此映射?
答案 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来支持它们之间的一致性。