Criteria API + Hibernate 4.2.4 final - 获取@OneToOne属性不起双向作用

时间:2013-11-04 13:22:05

标签: java hibernate criteria-api

以下是两个相关实体的部分

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

工作得很好。它返回确切的结果数(是的,我在获取之前计算它们)但是这里的关系被提取得很好。怎么会?如何使H获取属性,如第二个例子。

修改

H生成的“真正的”sql实际上是按标准加入的,所以实体映射器在这里没有完成他的工作我想:inner join referencenumber rn2_ on this_.id=rn2_.trademark_id - > referenceNumber.id=trademark.id whitch很好。 Hibernate bug?

2 个答案:

答案 0 :(得分:0)

我记得最近修正了一个关于OneToOne映射的错误;您可能想尝试升级到最新的补丁版本(在撰写本文时为4.2.7 SP1),看看是否有任何改变。

答案 1 :(得分:0)

添加这一点我将调查使用log4jdbc来查看Hibernate生成的SQL查询;我打赌那里存在差异,就像连接错误一样。我通过设置错误的可空性属性来触发Hibernate产生错误的结果。