1

这是两个相关实体的一部分

实体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.idwhitch 很好。休眠错误?

4

2 回答 2

0

添加这一点,我将使用 log4jdbc 进行调查,以查看 Hibernate 生成的 SQL 查询;我敢打赌那里有区别,就像一个连接做错了。例如,我通过设置错误的可空性属性触发了 Hibernate 产生错误的结果。

于 2013-11-05T10:21:43.187 回答
0

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

于 2013-11-04T13:36:09.480 回答