递归查找父实体的值

时间:2018-08-20 12:46:01

标签: java spring hibernate jpa

我有一个使用分层结构的类别实体,每个实体可以有一个父或子。

该实体保留“已启用”值,如果标记为false,则所有子实体也应标记为“ false”。

我创建了一个如下所示的简单递归方法来实现此目的,但它给了我非常奇怪的结果(奇怪的是,我的意思是当前实体总是返回“ enabled”的正确值,但是,所有父实体默认为“ false” < / p>

这是代码段:

@Entity
@Table(name = "category")
@SQLDelete(sql ="UPDATE category SET active = 0 WHERE pk = ? AND version = ?")
@Where(clause = "active = 1")
public class CategoryEntity extends AbstractEntity{


    private static final long serialVersionUID = -2285380147654080016L;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_category")
    private CategoryEntity parentCategory;

    @OneToMany(fetch = FetchType.LAZY, mappedBy="parentCategory", cascade = CascadeType.ALL)
    private List<CategoryEntity> childCategories = new ArrayList<CategoryEntity>();

    @Column(name = "source_id", unique=true)
    private String sourceId;

    @Column(name = "enabled", nullable = false, columnDefinition = "boolean default true")
    private boolean enabled;

    public CategoryEntity getParentCategory() {
        return parentCategory;
    }

    public void setParentCategory(CategoryEntity parentCategory) {
        this.parentCategory = parentCategory;
    }

    public List<CategoryEntity> getChildCategories() {
        return childCategories;
    }

    public void setChildCategories(List<CategoryEntity> childCategories) {
        this.childCategories = childCategories;
    }

    public boolean getEnabled() {
        return isEnabled(this);
    }

    private boolean isEnabled(CategoryEntity cat){
        if(cat != null && cat.enabled){
            if(cat.getParentCategory() == null) return true;
            return isEnabled(cat.getParentCategory());
        }
        return false;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

}

罪魁祸首是 isEnabled()方法,希望你们能在这里提供帮助吗?也许更好的问题是,这在JPA中是否合法?

2 个答案:

答案 0 :(得分:0)

在方法isEnabled中,如果实体具有父级,则返回true,否则返回false。因此,所有孩子将为true,而没有父母的孩子将为false

答案 1 :(得分:0)

我认为其背后的原因是您直接在父对象中使用了“ enabled”属性。它是延迟加载的对象,并且尚未初始化(访问父级时)。而且,当您访问该父类别对象时,它基本上是该对象的代理,所有原语均设置为其默认值(启用后将为false)。

尝试将其更改为:

public boolean getEnabled() {
    return this.enabled;
}
public boolean getCalculatedEnabled() {
    return getCalculatedEnabled(this);
}

private boolean getCalculatedEnabled(CategoryEntity cat){
    if(cat != null && cat.getEnabled()){  //this will trigger the lazy initialization of the object
        if(cat.getParentCategory() == null) return true;
        return getCalculatedEnabled(cat.getParentCategory());
    }
    return false;
}

您将有两个字段,例如(enabled和calculatedEnabled),但它仍然不会破坏Java bean约定,并且有望运行;)