1

関連する 2 つのエンティティの一部を次に示します。

実在物Trademark

public class Trademark extends AbstractEntity {
    @OneToOne(mappedBy = "trademark", optional = false, cascade = CascadeType.MERGE)
    private ReferenceNumber referenceNumber;
(...)

}

実在物ReferenceNumber

public class ReferenceNumber extends AbstractEntity {

    @OneToOne(optional = true)
    private Trademark trademark;
(...)
}

それでは、Criteria API を介して何かをフェッチしましょう。

protected Criteria createCriteria(SharedSessionContract session) {
    Criteria criteria = session.createCriteria(Trademark.class);
    criteria.createAlias("service", "s");
    criteria.createAlias("referenceNumber", "rn", JoinType.INNER_JOIN);
    criteria.add(Restrictions.eq("deleted", false));
    criteria.add(Restrictions.in("service", createServiceList(getConfig().getServices())));
    criteria.setMaxResults(1);
    return criteria;

プロパティreferenceNumberはフェッチされません - すべてのエンティティで null です。ただし、これは次のとおりです。

    protected Criteria createCriteria(SharedSessionContract session) {
        Criteria criteria = session.createCriteria(ReferenceNumber.class);
        criteria.createAlias("service", "s");
        criteria.createAlias("trademark", "t", JoinType.INNER_JOIN);
        criteria.add(Restrictions.eq("t.deleted", false));
        criteria.add(Restrictions.in("t.service", createServiceList(getConfig().getServices())));
        criteria.setMaxResults(1);
        return criteria;
}

うまく動作します。結果の正確な数を返します (はい、取得する前にそれらを数えています) が、ここではリレーションは正常に取得されます。どうして?2 番目の例のように H でプロパティを取得する方法。

編集:

Hによって生成された「実際の」SQLは実際には基準によって結合されているため、エンティティマッパーはここで彼の仕事をしていないと思います: inner join referencenumber rn2_ on this_.id=rn2_.trademark_id->これreferenceNumber.id=trademark.idで問題ありません。休止状態のバグ?

4

2 に答える 2

0

OneToOne マッピングに関するバグが最近修正されたことを読んだことを覚えています。最新のパッチ バージョン (執筆時点では 4.2.7 SP1) にアップグレードして、何かが変わるかどうかを確認してみてください。

于 2013-11-04T13:36:09.480 に答える
0

この点を追加して、log4jdbc を使用して調査し、Hibernate によって生成される SQL クエリを確認します。結合が間違っているなど、違いがあるに違いありません。たとえば、間違った nullability プロパティを設定して、Hibernate が間違った結果を生成するようにしました。

于 2013-11-05T10:21:43.187 に答える