gpt4 book ai didi

java - 当对象从集合中删除时,Hibernate 更新一对多集合

转载 作者:行者123 更新时间:2023-12-01 19:05:03 25 4
gpt4 key购买 nike

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

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

现在我需要从集合中过滤已删除的项目,但不能使用除 jpa 之外的任何内容。不允许使用 hibernate 特定注释。所以我写了一个后加载函数:

@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 :更新 billing_on_item 设置 ch1_id=null,其中 ch1_id=?和id=?

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

提前致谢,

兰迪

最佳答案

通过从集合中删除项目,您告诉 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;
}

关于java - 当对象从集合中删除时,Hibernate 更新一对多集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10436074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com