0

私は以下のように2つのクラスを関連付けようとしています

説明用のコードサンプルは以下のとおりです。BillClass

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();

顧客に関連付けられた請求書のサイズを検証すると、nullとして取得されました。(ただし、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());

私は熱心にオブジェクトをロードしました。何が欠けているのかわかりませんか?

4

1 に答える 1

1

マッピングが間違っています。アソシエーションが1対多の双方向アソシエーションである場合、一方の側はそれをとして定義しOneToMany、もう一方の側はManyToOne(ではなくOneToOne)として定義する必要があります。

さらに、双方向アソシエーションには常に所有者側と逆側があります。逆側はmappedBy属性を持つ側です。OneToManyの場合、逆側は片側である必要があります。したがって、マッピングは次のようになります。

@ManyToOne
private Customer billCustomer;

...

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

このマッピングは、休止状態のドキュメントで説明されています。

于 2012-09-10T13:01:02.700 に答える