Hibernate OneToMany为每个父实例选择所有子实例

时间:2014-07-19 06:36:35

标签: hibernate jpa hibernate-mapping hibernate-onetomany

我有两个与OneToMany相关的类 - ManyToOne映射。 当我选择父实体时,它也选择子实体,但是,所有子实例都分配给它的每个父实例,而不是分配相关实例。

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;

}

使用PurchaseDetails.java实例Collection保存PurchaseEntry.java对象时,它工作正常,但在选择父表时,它会选择相关的子表行,但这相关的所有行都是为每个父类对象分配的

选择查询

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, purchase_id - 1, ...

PURCHASE_DETAIL_ID - 2, purchase_id - 1, ...

PURCHASE_DETAIL_ID - 3, purchase_id - 1, ...

当我选择PurchaseEntry 时,使用 invoice_date &#39; 18-07-2014&#39;它返回3个PurchaseEntry对象,在每个PurchaseEntry对象中,purchaseDetailsList有3个与 purchase_id = 1 相关的PurchaseDetails对象

我的配置或其他任何错误???

预期:每个PurchaseEntry对象在purchaseDetailsList中只有一个相关的PurchaseDetails实例

3 个答案:

答案 0 :(得分:1)

不幸的是,我通过使用下面的代码

找到了这个问题
@OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name="PURCHASE_ID")
    @Fetch(FetchMode.SELECT)
    private Collection<PurchaseDetails> purchaseDetailsList = new ArrayList<PurchaseDetails>();

按照我的预期添加@Fetch(FetchMode.SELECT)我也重新创建了我的架构

答案 1 :(得分:0)

我认为您不需要在@JoinColumn中提供PurchaseEntry。也不需要提供targetEntity,因为它可以推断出类型。

尝试此配置。

@OneToMany(mappedBy="purchaseEntry", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private Collection<PurchaseDetails> purchaseDetailsList = new ArrayList<PurchaseDetails>(); 

答案 2 :(得分:0)

Hibernate关系映射将每个对象与相关对象相关联,就像一个表与另一个表相关,然后它将从两个表中获取。您可以使用不同的获取策略来智能地获取数据。

在你的情况下,

fetch=FetchType.EAGER

会在开头提取所有记录,但只有在需要时才会使用FetchType.lazy

您可以查看不同的fetch strategies here以获取更多详细信息。