我已尝试使用List和Map,但我无法弄清楚如何强制Hibernate 3.6.4在这些集合中保留空值。这就是我尝试过的:
@ElementCollection(fetch=FetchType.EAGER)
@Column(columnDefinition="longtext")
private Map<Integer, String> parameterValues;
和
@ElementCollection(fetch=FetchType.EAGER)
@OrderColumn
@Lob @Column(length=65535)
private List<String> parameterValues;
如果Map或List包含空值,则Hibernate不会将其持久保存在集合表的行中。从数据库中检索集合时,它的元素数少于存储时的元素数,因为不会还原那些为null的元素。 List使用非空值为第一个和最后一个索引之间的索引恢复了空值,但是列出了列表末尾的任何空值。 Map仅包含非空值的条目。
我希望这是有道理的。对我来说这似乎是Hibernate中的一个错误,但我希望这是我能用不同配置修复的东西。
答案 0 :(得分:5)
原来这是Hibernate中的一个错误......好吧,不是根据Gavin King的说法,但是根据许多其他人想要将Null存储在数据库中。见HHH-772。这个问题显然永远不会得到解决。
所以,我必须通过为我的参数值添加一个@Embeddable类来解决这个问题,这个类很乐意在数据库中存储一个空值,如下所示:
@Embeddable
@Access(AccessType.FIELD)
public final class ParameterValue {
@Basic(optional=false)
private int id;
@Column(columnDefinition="longtext")
private String value;
/** For JPA */
ParameterValue() {}
public ParameterValue(int id, String value) {
this.id = id;
this.value = value;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @return the value
*/
public String getValue() {
return value;
}
}
答案 1 :(得分:0)
我似乎遇到了同样的问题,但是:
我想知道在表格中插入空白变成 null 是多么神奇。为空白和 null 插入伪值似乎很乏味。 我再次指出,我只有 Oracle 下的问题。相同的软件在MySQL和HSQL下运行良好。