我有两个与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实例
答案 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以获取更多详细信息。