当从集合中删除对象时,Hibernate会更新一个到多个集合

时间:2012-05-03 17:03:41

标签: java hibernate jpa

我遇到了jpa和hibernate的讨厌错误。我有一个带有以下注释的结算类:

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

现在我需要从集合中过滤掉已删除的项目,但除了jpa之外不能使用任何其他内容。不允许使用特定于hibernate的注释。所以我写了一个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);
}

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

Hibernate:update billing_on_item set ch1_id = null其中ch1_id =?和id =?

产生异常,因为ch1_id是外键而不能为null。但是,hibernate将参数绑定到正确的值。为什么这个更新首先发生?如何更正错误?

提前致谢,

兰迪

2 个答案:

答案 0 :(得分:4)

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

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

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;
}

答案 1 :(得分:0)

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