2014-10-20 73 views
0

我正在使用wicket和hibernate。我得到了兩個對象categorygroup。 A group可以有幾個categoryscategory可以有幾個groupsWicket/Hibernate:從db中獲取重複列表中的記錄

我的問題(其漂亮對我來說很難解釋英文): 看來,在我的名單我從數據庫中獲取是相等的對象,因爲我存儲到組的categorys的大小(同時在數據庫只有一個組)。

實施例:

的categorys 1,2,3,4

測試

測試得到的類別1和2因此,在我面板的組測試顯示兩次。如果我添加第3類,則組測試將顯示三次。

我這是怎麼得到我的數據庫的數據:

public List<T> getAll(Class theClass) { 
    List<T> entity = null; 
    Transaction trns = null; 
    Session session = sessionFactory.openSession(); 
    try {   
     trns = session.beginTransaction(); 
     entity = session.createCriteria(theClass).list(); 
     session.getTransaction().commit(); 
    } catch (RuntimeException e) { 
     e.printStackTrace(); 
    }finally { 
    session.flush(); 
    session.close(); 
} 
    return entity; 
} 

我的面板內我得到這樣我的組列表:

List<Group> groupList = new ArrayList<Group>(); 
groupList = groupDao.getAll(Group.class); 

如果我調試通過我的面板和堅持在groupList的此頁面中,SAME對象等於存儲到組中的分類的大小。數據庫內部仍然只有一行。 picture of the debugged variable <code>groupList</code>

集團法人:

@Entity 
@Table(name = "GROUP_USER") 
public class Group implements Serializable{ 

@Id 
@GeneratedValue 
@Column(name = "GROUP_ID") 
private int groupID; 

@ManyToMany(cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER) 
@JoinTable(name="GROUP_TO_CATEGORY", 
      joinColumns={@JoinColumn(name="GROUP_ID")}, 
      inverseJoinColumns={@JoinColumn(name="CATEGORY_ID")}) 
private Set<Category> categorys = new HashSet<Category>(); 
//constructor.. getter and setter.. 
} 

分類實體:

@Entity 
@Table(name = "CATEGORY") 
public class Category implements Serializable{ 

@Id 
@GeneratedValue 
@Column(name = "CATEGORY_ID") 
private int categoryId; 

@ManyToMany(mappedBy="categorys", fetch = FetchType.EAGER) 
private Set<Group> groups = new HashSet<Group>(); 
//constructor.. getter and setter.. 
} 

回答

2

這是由您使用預先抓取,這通常是一個壞主意,反正引起的。

如果可能的話,您應該嘗試更改您的映射以執行集合的懶取回。這將解決這個問題,它引入的任何新問題都可以通過其他方式(如「在視圖中打開會話」)得到更好的處理。你可以在this question看到一些討論。

如果你有一個獲取,真正需要做熱切然而,您可以通過使用ResultTransformer,它整合了重複如下更正此問題:

public List<T> getAll(Class theClass) { 
    List<T> entity = null; 
    Transaction trns = null; 
    Session session = sessionFactory.openSession(); 
    try {   
     trns = session.beginTransaction(); 
     Criteria criteria = session.createCriteria(theClass); 
     criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
     entity = criteria.list(); 
     session.getTransaction().commit(); 
    } catch (RuntimeException e) { 
     e.printStackTrace(); 
    }finally { 
    session.flush(); 
    session.close(); 
} 
    return entity; 
} 
+0

從來就閱讀,在視圖中打開會話一個不好的做法? – monti 2014-10-20 12:13:11

+0

意見不盡相同。但這是處理延遲加載的一種選擇。 – 2014-10-20 12:29:20