我使用hibernate 5.0.8和spring data jpa 1.10.1
鉴于这些实体
class Model {
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
@JoinColumn(nullable = false)
private Configuration configuration;
//more fields and methods
}
class Configuration {
@OneToMany(mappedBy = "configuration", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Setting> settings = new ArrayList<>();
//more fields and methods
//settings is never assigned again - I use settings.add(...) and settings.clear()
}
class Setting {
@ManyToOne
@JoinColumn(nullable = false)
private Configuration configuration;
//more fields and methods
}
模型是主模型,但多个模型可以使用相同的配置。模型中的级联配置是必需的,因为如果我在配置中更改任何内容,我希望它在所有使用此配置的模型中应用
现在,当我使用具有设置的配置检索现有模型并保存此模型时,如果不对设置进行任何更改,则会出现以下异常
@Transactional
public void doSomething() {
Model model = modelRepository.findOne(0);
//change something in the model, but no changes are made in its configuration
//or do nothing
modelRepository.save(model);
}
我收到以下异常
A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: Configuration.settings
我怀疑这与延迟加载的设置有关,而hibernate试图将空列表合并到配置中。
我做错了什么?
答案 0 :(得分:0)
在解除引用时,检查您尝试清理的对象的getter和setter:
尝试并使用:
public void setChildren(Set<Child> aSet) {
//this.child= aSet; //Results in this issue
//change to
this.child.clear();
if (aSet != null) {
this.child.addAll(aSet);
} }
答案 1 :(得分:0)
问题是由hibernate-enhance-maven-plugin中的enableLazyInitialization引起的。我仍然不知道它为什么会导致此错误,但删除此插件解决了这个问题。
我使用了这个插件,因为我想在模型中延迟加载一个大的String字段,我会在应用程序中缓存。我现在将它改为懒惰取出的OneToOne关系。