我有一个使用分层结构的类别实体,每个实体可以有一个父或子。
该实体保留“已启用”值,如果标记为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中是否合法?
答案 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约定,并且有望运行;)