2014-10-20 71 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