2012-05-13 23 views
2

我有一個類別實體有一個類別作爲父類和一個類別列表作爲子類。這裏是它的聲明:如何使用Hibernate Annotation註釋一個實體與它自己的列表

@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個孩子,例如,當從數據庫獲取所有類別時,它將返回所有四個孩子,令人驚訝的是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; 
} 
+0

你能顯示代碼來獲取所有類別嗎? – Firo

+0

@Firo我爲所有的實體使用通用類...:\t我將加入問題。 – Ehphan

回答

2

雙向關聯總是具有所有者側和逆側。所有者方是定義關聯如何映射的方式(使用@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; 

請注意,設置這樣急於將強制Hibernate每次加載整個樹的關聯兩側加載樹的一個節點。準備好要執行的大量查詢,以及糟糕的性能。

相關問題