我正在使用 wicket 和 hibernate。我有两个对象 category
和 group
。一个组
可以有多个类别
,一个类别
可以有多个组
。
我的问题(我很难用英语解释它): 似乎在我的列表中,我从数据库中获取的对象与我存储到组中的类别的大小相同(而在数据库中只有一个组)。
示例:
类别 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
中保持此页面,则相同的对象等于存储到组中的类别的大小。数据库内部仍然只有一行。
组实体:
@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..
}
最佳答案
这是由于您使用急切获取而引起的,无论如何,这通常是一个坏主意。
如果可能的话,您应该尝试更改映射以延迟获取集合。这将解决这个问题,并且它引入的任何新问题都可以通过其他方式更好地处理,例如“在 View 中打开 session ”。您可以在 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;
}
关于java - Wicket 口/hibernate : get duplicated records in list from db,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26463292/