Hibernate JPA不在集合表中插入行以获取空值

时间:2013-03-06 19:17:49

标签: hibernate jpa collections null

我已尝试使用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中的一个错误,但我希望这是我能用不同配置修复的东西。

2 个答案:

答案 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)

我似乎遇到了同样的问题,但是:

  1. 发生在 Oracle 11g上,但发生在MySQL上,不是发生在HSQL上
  2. 对我来说,空白值似乎是插入表格时自动变成 null 值的问题
  3. 行的值为 null ,Hibernate加载的集合为空(实际上是空的,因为地图只有一个条目)(尝试过Hibernate 3.6.8,3.6.10和4.1) .10)
  4. 然后发生的是,当我更新Map时,Hibernate想要更新集合(Hibernate认为它为空),而数据库中已存在相同的条目,导致ORA-00001唯一约束违例
  5. 我想知道在表格中插入空白变成 null 是多么神奇。为空白 null 插入伪值似乎很乏味。 我再次指出,我只有 Oracle 下的问题。相同的软件在MySQL和HSQL下运行良好。