2

「モジュール」データを特定の順序でマップ内に保存しようとしています。私はこれを実現するためにTreeMapを使用しています。私がデータを読むとき、私はそれを正確に間違った順序で取得します。キー値9で始まり、0で終わります。??? JPAはそれ以外の場合、値をTreeMapに「配置」しますか?

@OneToMany(
    mappedBy="prditem", 
    fetch=FetchType.LAZY, 
    cascade=CascadeType.ALL,
    orphanRemoval=true,
    targetEntity=PubModule.class
)
@JoinColumn(name="prditmID")
@MapKey(name="order")
private Map<Integer, PubModule> modules = new PubModulesMap();

public class PubModulesMap extends TreeMap<Integer,PubModule> {

    @Override
public PubModule put(Integer key, PubModule value) {
    PubModule old = (PubModule)this.get(key);
        if (old!=null) {
            old.setPrditem(value.getPrditem());
    ....
}

Iterator <PubModule> it = list.values().iterator();
while (it.hasNext()) {
    PubModule pm = it.next();
    System.out.println(pm.getOrder());
}

9 8 7 6 5 4 3 2 1 0

4

2 に答える 2

1

予期しない順序の理由は、JPAがマップをソートする必要があることを理解していないためです。

一般的な解決策は、マップのゲッターメソッドを作成することです。

public Map<Integer, PubModule> getModules() {
   if (modules == null) {
      modules = new PubModulesMap();
   } else if (!(modules instanceof TreeMap)) {
      modules = new TreeMap(modules); // Or new PubModulesMap(modules)
   }
   return modules;
}

hibernateを使用している場合は、@ Sort(type = SortType.NATURAL)アノテーションを追加する必要があります。

于 2012-11-19T15:08:25.170 に答える
1

JPAは、データベースから読み取るときに独自のMap実装を使用して、LAZYと変更の追跡をサポートします。

EAGER関係の場合、必要に応じて独自の特定のクラスを使用できます。フィールドタイプをこのクラスに設定するか、DescriptorCustomizerを使用してOneToManyMappingでContainerPolicyを構成します。

ソートされたマップの一時フィールドを定義し、独自のget / setメソッドを使用して、永続性から遅延初期化することもできます。

OrderByを使用してデータベースで並べ替えることもできます。

于 2012-11-20T14:44:01.993 に答える