3

OneToMany - ManyToOne マッピングに関連付けられた 2 つのクラスがあります。親エンティティを選択すると、子エンティティも選択されますが、それに割り当てられたすべての子インスタンスは、関連するインスタンスを割り当てるのではなく、すべての親インスタンスです。

PurchaseEntry.java

@Entity
@Table(name="PURCHASE_ENTRY")
public class PurchaseEntry {

    public PurchaseEntry() {
    }
    @Id @Column(name="PURCHASE_ID") @GeneratedValue(strategy=GenerationType.AUTO)
    private long purchaseId;
    @Column(name="INVOICE_NO")
    private String invoiceNo;
    @Column(name="INVOICE_DATE")
    @Type(type="date")
    private Date invoiceDate;          

    @OneToMany(targetEntity=PurchaseDetails.class, cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="PURCHASE_ID")
    private Collection<PurchaseDetails> purchaseDetailsList = new ArrayList<PurchaseDetails>(); 
}

PurchaseDetails.java

@Entity
@Table(name = "PURCHASE_DETAILS")
public class PurchaseDetails {

    public PurchaseDetails() {
    }

    @Id
    @Column(name = "PURCHASE_DETAIL_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long purchaseDetailId;
    @Column(name = "AMOUNT")
    private float amount;    

    @ManyToOne
    @JoinColumn(name = "PURCHASE_ID")
    private PurchaseEntry purchaseEntry;

}

PurchaseEntry.java オブジェクトを PurchaseDetails.java インスタンス Collection で保存すると正常に動作しますが、親テーブルを選択すると関連する子テーブルの行が選択されますが、これに関連するすべての行がすべての親クラス オブジェクトに割り当てられます。

クエリを選択

Criteria criteria = session.createCriteria(PurchaseEntry.class)
                    .add(Restrictions.between("invoiceDate", fromFilterDate, toFilterDate)).addOrder(Order.asc("invoiceDate"));

            purchaseEntryList = criteria.list();

たとえば、 Purchase_Entry テーブルには次の行があります

purchase_id - 1、invoice_date - 18-07-2014

Purchase_details テーブルには

PURCHASE_DETAIL_ID - 1、購入 ID - 1、...

PURCHASE_DETAIL_ID - 2、購入 ID - 1、...

PURCHASE_DETAIL_ID - 3、購入 ID - 1、...

請求書の日付が '18 -07-2014 ' である基準を使用してPurchaseEntry を選択する と、3 つの PurchaseEntry オブジェクトが返されます

私の設定やその他の何が問題になっていますか???

expected : すべての PurchaseEntry オブジェクトには、 purchaseDetailsList に関連する PurchaseDetails インスタンスが 1 つだけあります。

4

3 に答える 3

1

残念ながら、以下のコードを使用して、これに対する ans を見つけました

@OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name="PURCHASE_ID")
    @Fetch(FetchMode.SELECT)
    private Collection<PurchaseDetails> purchaseDetailsList = new ArrayList<PurchaseDetails>();

期待どおりに機能することを追加し@Fetch(FetchMode.SELECT)ても、スキーマを再作成しました

于 2014-07-21T04:25:35.723 に答える
0

Hibernate リレーショナル マッピングは、すべてのオブジェクトを関連するオブジェクトに関連付けます。たとえば、あるテーブルが別のテーブルに関連付けられている場合、両方のテーブルからフェッチします。さまざまなフェッチ戦略を使用して、データをインテリジェントにフェッチできます。

あなたの場合、

fetch=FetchType.EAGER

は最初にすべてのレコードを取得しますが、 を使用すると、必要なFetchType.lazy場合にのみ取得されます。

詳細については、 ここでさまざまなフェッチ戦略を調べることができます 。

于 2014-07-21T04:57:27.050 に答える
0

@JoinColumn屈する必要はないと思いますPurchaseEntry。型を推測できるため、 targetEntity も指定する必要はありません。

この構成を試してください。

@OneToMany(mappedBy="purchaseEntry", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private Collection<PurchaseDetails> purchaseDetailsList = new ArrayList<PurchaseDetails>(); 
于 2014-07-19T08:55:48.527 に答える