简体   繁体   中英

Criteria API + Hibernate 4.2.4 final - fetching @OneToOne properties does not work bidirectional

Here are parts of two related entities

Entity Trademark

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

}

Entity ReferenceNumber

public class ReferenceNumber extends AbstractEntity {

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

And now, lets fetch somethig via 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;

property referenceNumber is not fetched - null on every entity. However this one:

    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;
}

works just fine. It returns exact number of results (yes, I am counting them before fetching) but here relations are fetched just fine. How come? How to make H to fetch properties like in second example.

Edit:

"Real" sql generated by H is actually joining by criteria, so entity mapper is not doing his job here I guess: inner join referencenumber rn2_ on this_.id=rn2_.trademark_id -> referenceNumber.id=trademark.id whitch is fine. Hibernate bug?

I remember reading that a bug was recently fixed regarding OneToOne mappings; you may want to try upgrading to the latest patch version (4.2.7 SP1 at the time of writing) to see if that changes anything.

Add this point I'd investigate using log4jdbc to see what SQL query is generated by Hibernate; I'm betting there is a difference there, like a join being done wrong. I've triggered Hibernate to produce the wrong results by setting a wrong nullability property for example.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM