5

List と Map を試してみましたが、Hibernate 3.6.4 に強制的にこれらのコレクションに null 値を保持させる方法がわかりません。これは私が試したことです:

@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 に null 値が含まれている場合、Hibernate はそれをコレクション テーブルの行に保持しません。コレクションがデータベースから取得されると、null の要素は復元されないため、格納されたときよりも要素が少なくなります。List は、null 以外の値を持つ最初と最後のインデックスの間のインデックスの null 値を復元しましたが、リストの最後の null 値は除外されました。マップには、null 以外の値のエントリのみが含まれていました。

これが理にかなっていることを願っています。Hibernate のバグのように思えますが、別の構成で修正できることを願っています。

4

2 に答える 2

6

これは Hibernate のバグであることがわかりました...まあ、Gavin King によるのではなく、Null を DB に保存したい他の多くの人によると。HHH-772を参照してください。この問題は明らかに解決されることはありません。

そのため、次のように、DB に null 値を喜んで格納するパラメーター値に @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. 私にとっても、空白の値は、テーブルに挿入されたときに自動的にnull値に変わる問題のようです
  3. 行は値nullでそこにあり、Hibernate によってロードされたコレクションは空です (マップにはエントリが 1 つしかないため、事実上空です) (Hibernate 3.6.8、3.6.10、および 4.1.10 を試しました)。
  4. その後、マップを更新すると、Hibernate はコレクション (Hibernate が空と見なす場所) を更新しようとしますが、同じエントリがデータベースに既に存在し、ORA-00001 Unique Constraint Violation が発生します。

テーブルに空白を挿入するとnullになるという魔法は何なのだろうか。空白nullに疑似値を挿入するのは面倒に思えます。そして、私が問題を抱えているのはOracleだけであることをもう一度指摘します。同じソフトウェアが、MySQL と HSQL の下で問題なく動作します。

于 2013-03-07T20:06:29.033 に答える