2012-11-09 9 views
6

Hibernate(4.1.8.FINAL)がNULL値を持つリスト(単方向OneToManyマッピング)を返すという問題が発生しています。私は取得しています何Hibernateがnull値を持つリストを返す(List型のOneToManyアノテーション)

私はEntryAddressは10日インデックス上にあるとして、21の大きさ、および第二エントリアドレスのリストを取得していますが20日インデックスにあります。

@Entity 
@Table(name = "entry") 
public class Entry { 
    ... 
    @OneToMany(fetch = FetchType.EAGER, orphanRemoval = true) 
    @JoinColumn(name = "entry_id") 
    @OrderColumn(name = "precedence") 
    private List<EntryAddress> addresses; 
    ... 
} 
ここ
@Entity 
@Table(name = "entry_address") 
public class EntryAddress { 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Integer id; 

    @Column(name = "entry_id") 
    private Integer entryId; 

    @Column(name = "precedence") 
    private Integer precedence; 
... 
} 

は、MySQLの構造です:

Entry [addresses=[EntryAddress [id=5, entryId=3, precedence=10, line=Line 3.1], EntryAddress [id=6, entryId=3, precedence=20, line=Line 3.2]]] 

ここでは最小限のソースコードがあります: -

Entry [addresses=[null, null, null, null, null, null, null, null, null, null, EntryAddress [id=5, entryId=3, precedence=10, line=Line 3.1], null, null, null, null, null, null, null, null, null, EntryAddress [id=6, entryId=3, precedence=20, line=Line 3.2]]] 

は私がを期待する私は2つだけEntryAddressオブジェクトのリストを期待します(エンジンInnoDB):

CREATE TABLE entry (
    id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    name varchar(500) NOT NULL, 
    active int(1) NOT NULL DEFAULT '0', 
    modifiedTS timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, 
    createdTS timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

-- -------------------------------------------------------- 

CREATE TABLE entry_address (
    id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    entry_id int(10) unsigned NULL, 
    precedence int(2) NULL DEFAULT '0', 
    line varchar(255) DEFAULT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY entry_address_uq (entry_id , precedence) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

"List"を "Set"に置き換えようとすると、コレクションにNULL値はありませんが、シーケンス/優先順位は機能しません。

1つ目のEntryAddressの優先順位を1に設定し、2番目のEntryAddressの優先順位を2に設定すると、2のサイズのListが取得されます。優先順位は、優先順位はソートにのみ使用する必要がありますが、リストの返却です。

私が間違っていることを教えてもらえますか?ありがとうございます:-)

答えて

1

私はそれを使用して、これは

@OneToMany(orphanRemoval = true) 
@LazyCollection(LazyCollectionOption.FALSE) 
@JoinColumn(name = "entry_id") 
@OrderBy("precedence") 
private List<EntryAddress> addresses; 

@OneToMany(orphanRemoval = true) 
@LazyCollection(LazyCollectionOption.FALSE) 
@JoinColumn(name = "entry_id") 
@OrderBy("precedence") 
private List<EntryContact> contacts; 
+0

答えを拡大してください。それのどの部分があなたの問題を解決しましたか? @LazyCollection? –

2

問題はリストとセットの違いです。

私は、EntryAddressが10番目のインデックスにあり、2番目のエントリアドレスが20番目のインデックスにある21のサイズのリストを取得しています。

これはリストであるはずだったセットです。

「リストとセットを置き換える」ときに、@OrderColumn(name = "precedence")を削除することを忘れましたか? Setを使用している場合、Order列を持つことができないためです。 OrderColumnのjavadocをから

+1

問題を解決し、解決策を見つけたがお返事をいただき、ありがとうございます。はい、私はセットを使用する必要がある場合@OrderColumnを削除する必要があることを認識していますが、また、優先順位でEntityAddressを並べ替える必要があります。だから私はList型で試しています。提案:-)?私もOrderByアノテーションで試しましたが失敗しました。 – pitschr

13

: 「順番列は整数型でなければならない持続性プロバイダは、連続した(非スパース)会合または要素のコレクションを更新する際、注文欄の値のを注文を維持します。最初の要素のorder列の値は0です。

したがって、OrderColumnの値は0から始まり、連続した値になると予想されます。したがって、値が連続していない場合、Hibernateはヌル要素をJavaリストに追加します。

このOrderColumnの動作は、hibernate xmlマッピングのlist-indexの動作と似ていると思います。

関連する問題