5

我尝试过使用 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 的元素不会被恢复。列表恢复了具有非空值的第一个和最后一个索引之间的索引的空值,但列表末尾的任何空值都被忽略了。Map 仅包含非空值的条目。

我希望这是有道理的。对我来说,这似乎是 Hibernate 中的一个错误,但我希望它可以通过不同的配置来修复。

4

2 回答 2

6

原来这是 Hibernate 中的一个错误......好吧,不是根据 Gavin King 的说法,而是根据许多其他想将 Null 存储在 DB 中的人的说法。见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;
    }
}
于 2013-03-08T16:45:55.637 回答
0

我似乎有同样的问题,但是:

  1. 发生在Oracle 11g 上,但不在MySQL 上,也不在 HSQL 上
  2. 对我来说,空白值似乎也是插入表时自动变成空值的问题
  3. 这些行的值为null并且 Hibernate 加载的集合是空的(实际上是空的,因为地图只有一个条目)(尝试了 Hibernate 3.6.8、3.6.10 和 4.1.10)
  4. 然后发生的情况是,当我更新 Map 时,Hibernate 想要更新集合(Hibernate 认为它是空的),而数据库中已经存在相同的条目,导致 ORA-00001 Unique Constraint Violation

我想知道在表格中插入空白变为空的神奇之处是什么。为空白值插入伪值似乎很乏味。我再次指出,我只有在Oracle下才有问题。相同的软件在 MySQL 和 HSQL 下运行良好。

于 2013-03-07T20:06:29.033 回答