我遇到了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将参数绑定到正确的值。为什么这个更新首先发生?如何更正错误?
提前致谢,
兰迪
答案 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。