我有一个类别实体,它有一个类别作为父级,一个类别列表作为子级。 这是它的声明:
@Entity
@Table(name="CATEGORYENTITY")
public class CategoryEntity extends BaseEntity<Long> {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name="ID")
private Long id;
@Column(name="NAME")
private String name;
@Column(name="VIEWSCOUNT")
private Integer viewsCount;
@OneToMany(fetch=FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
@JoinColumn(name="CATEGORY_ID")
private List<CategoryEntity> childCategories;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="CATEGORY_ID")
private CategoryEntity parent;
setters and getters...
保存和更新时它可以正常工作,但是当尝试获取所有类别时......对于每个孩子,也返回一个父级!!我的意思是,如果我有一个 mainCat 并且这个 mainCat 有 4 个子类别,例如,当从 db 获取所有类别时,它会返回所有四个子类别,令人惊讶的是 4 个 mainCat...奇怪的部分是返回的对象是正确的,它们的属性设置正确,并且 4 个 mainCat 是相同的!!我该怎么办?
我使用以下代码检索结果:
public List<E> find(E example, final PagingObject paging, Map<?, ?> filter) throws Exception {
// create the criteria
final DetachedCriteria detachedCriteria = createCriteria(filter);
// add restrictions to the criteria based on example entity
pruneCriteria(detachedCriteria, example);
List<E> result = getHibernateTemplate().execute(new HibernateCallback<List<E>>() {
@SuppressWarnings("unchecked")
@Override
public List<E> doInHibernate(Session session) throws HibernateException, SQLException {
// attach criteria to the session
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
// add paging and sort to the criteria
paginate(criteria, paging);
List<E> list = criteria.list();
return list;
}
});
return result;
}
双向关联始终具有所有者端和反向端。所有者端是定义关联映射方式(使用 @JoinColumn)的一侧。在反之,您不得定义关联的映射方式(这将是多余的)。但是,您必须使用 mappedBy 属性将其定义为反侧。
您没有定义父子双向关联,而是定义了两个不同的关联。
集合的映射应为:
@OneToMany(mappedBy = "parent",
fetch=FetchType.EAGER,
cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private List<CategoryEntity> childCategories;
请注意,将此类关联的两端都设置为 EAGER 将强制 Hibernate 在每次加载树的单个节点时加载整个树。为要执行的大量查询和糟糕的性能做好准备。