HIbernate Annotations - 条件查询 - 加载延迟属性失败

时间:2012-09-10 12:52:02

标签: hibernate criteria-api

我正在尝试关联2个类,如下所示

用于描述的代码示例如下 账单等级

public class Bill {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO )
    private long id;
    private long billNumber;
    private BillType billType;
    @OneToOne
    private Customer billCustomer;

//getter and setter omitted
}

和客户类的定义是

public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String customerRef;
    @OneToMany(fetch = FetchType.EAGER)
    private List<Bill> customerBills;}

当我尝试使用条件API检索对象时,将重新关联相关对象。

Bill bill = (Bill) session.createCriteria(Bill.class)
                .add(Restrictions.eq("billNumber", BILL_NUMBER)).uniqueResult();

当我验证与客户关联的账单大小时,它将重新归零。 (但是1个账单与客户相关)

Assert.assertEquals(1,bill.getBillCustomer().getCustomerBills().size());

(上述条件失败),但当我以其他方式验证时,它成功

List<Bill> billList = session.createCriteria(Customer.class)
                .add(Restrictions.eq("customerRef",CUSTOMER_REF)).list();
        Assert.assertEquals(1,billList.size());

我急切地装上了这些物品。我无法弄清楚我错过了什么?

1 个答案:

答案 0 :(得分:1)

您的映射是错误的。如果关联是一对多双向关联,则一方必须将其定义为OneToMany,将另一方定义为ManyToOne(不是OneToOne)。

此外,双向关联始终具有所有者方和反方。反面是具有mappedBy属性的反面。在OneToMany的情况下,反面必须是一边。所以映射应该是:

@ManyToOne
private Customer billCustomer;

...

@OneToMany(fetch = FetchType.EAGER, mappedBy = "billCustomer")
private List<Bill> customerBills;

此映射在hibernate documentation

中描述