1

我在 jpa 和 hibernate 中遇到了一个令人讨厌的错误。我有一个带有以下注释的计费类:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="ch1_id", referencedColumnName="id")
private List<BillingItem>billingItems = new ArrayList<BillingItem>();

现在我需要从集合中过滤已删除的项目,但只能使用 jpa。不允许使用特定于休眠的注释。所以我写了一个post load函数:

@PostLoad
public void postLoad() {
    ArrayList<BillingItem>tempItems = new ArrayList<BillingItem>();

    Iterator<BillingItem> i = this.billingItems.iterator();
    BillingItem item;
    while(i.hasNext()) {
        item = i.next();            
        if( item.getStatus().equals("D")) {
            tempItems.add(item);                
        }                       
    }

    this.billingItems.removeAll(tempItems);
}

但是,当有要过滤的已删除项目时,我看到

休眠:更新 billing_on_item 设置 ch1_id=null where ch1_id=? 和身份证=?

这会产生异常,因为 ch1_id 是外键并且不能为空。然而,休眠将参数绑定到正确的值。为什么首先会发生此更新?如何纠正错误?

提前致谢,

兰迪

4

2 回答 2

4

通过从集合中删除项目,您告诉 Hibernate 这两个实体之间的关联不再存在,因此很明显,Hibernate 删除了在数据库中实现该关联的内容:它将外键设置为 null。

您可能想要的只是实体中的一个吸气剂,它只返回未删除的项目:

public List<BillingItem> getNonDeletedItems() {
    List<BillingItem> result = new ArrayList<BillingItem>();
    for (BillingItem item : this.billingItems) {
        if (!"D".equals(item.getStatus()) {
            result.add(item);
        }
    }
    return result;
}
于 2012-05-03T17:12:01.830 回答
0

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)行表示它将级联所有更新。查看CascadeType

于 2012-05-03T17:13:04.997 回答