3

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

购买入口.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>(); 
}

购买详情.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,...

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

我的配置或其他有什么问题???

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

4

3 回答 3

1

不幸的是,我通过使用下面的代码找到了答案

@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

我认为你不需要屈服@JoinColumnPurchaseEntry也不需要给 targetEntity 因为它可以推断类型。

试试这个配置。

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