orphanRemoval导致延迟加载集合出错

时间:2018-03-08 09:55:55

标签: spring hibernate spring-data-jpa all-delete-orphan

我使用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试图将空列表合并到配置中。

我做错了什么?

2 个答案:

答案 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关系。