2

次のようなマッピングを持つクラスがあります。

@Entity
public class CurrencyTable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @Version
    @Column(nullable=false)
    private Timestamp version;

    @Column(length=32, unique=true)
    private String refCode;

   @OneToMany(mappedBy="currencyTable", fetch=FetchType.LAZY, cascade =  {CascadeType.ALL})
   @MapKey(name="currency")
   private Map<String, CurrencyTableRate> rateMap = new HashMap<String, CurrencyTableRate>();
}

@Entity
public class CurrencyTableRate{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @Version
    @Column(nullable=false)
    private Timestamp version;

    @Column(length=3)
    private String currency;

    @Basic
    private BigDecimal rateValue;

    @ManyToOne(optional=false,fetch=FetchType.LAZY)
    private CurrencyTable currencyTable;
}

CurrencyTable には 1 つの行があり、CurrencyTableRate にはデータベース内の CurrencyTable を参照する 3 つの行があります。

HQL を使用して CurrencyTable を読み込む場合:

from CurrencyTable where refCode = :refCode

rateMap に 3 つのエントリを持つエンティティを取得しましたが、これを試してみると:

from CurrencyTable table left outer join fetch table.rateMap where refCode = :refCode

rateMap には 1 つのエントリしかありません。

Hibernate によって生成されたクエリを見て、手動で実行しました。予想どおり 3 行が返されたため、フェッチ後にそれらをマッピングする際に問題があるようです。誰もそのような問題に遭遇しましたか? Hibernate バージョン 3.2.6.ga と Oracle 10g を使用しています

4

1 に答える 1

0

まず、refCode にエイリアスを追加することをお勧めします。結果に影響はないと思いますが、念のため。

from CurrencyTable table left outer join fetch table.rateMap where table.refCode = :refCode

次に、SQL コードをオンにして、SQL レベルで実際に何が起こっているかを分析します。そのような場合、HQLで同様の問題が発生しました

from CurrencyTable table left outer join fetch table.rateMap map where map.id = :id

私が書き直さなければならないもの

from CurrencyTable table left outer join fetch table.rateMap map where EXISTS (SELECT a.id from CurrencyTable table a INNER JOIN a.rateMap m WHERE m.id = :id and table.id=a.id)

私のヒントが役立つことを願っています。

于 2009-05-28T14:30:41.653 に答える