2012-05-13 11 views
2

を使用して、その中に自身のリストをエンティティに注釈を付けます。ここでの宣言です:どのように私は親として、カテゴリと子などのカテゴリのリストを持っているカテゴリのエンティティを持って休止状態注釈

@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つの子と驚くほど4のmainCatが返されます...奇妙な部分は返されたオブジェクトが正しいということです正しい4つのメインキャットは同じです!私は何をすべきか?

Iは、結果を取得するために、次のコードを使用:

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属性を使用することでそれが逆の側面であると定義する必要があります。代わりに、親子双方向関連を定義する

、次の2つの異なる関連付けを定義しています。

コレクションのマッピングは次のようになります

@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そのような関連付けの両側を設定するツリー全体をツリーの一つのノードをロードするたびにロードするために休止状態に強制すること。膨大な数のクエリが実行されるように準備してください。

関連する問題