java - Wicket 口/hibernate : get duplicated records in list from db

标签 java hibernate wicket

我正在使用 wicket 和 hibernate。我有两个对象 categorygroup。一个可以有多个类别,一个类别可以有多个

我的问题(我很难用英语解释它): 似乎在我的列表中,我从数据库中获取的对象与我存储到组中的类别的大小相同(而在数据库中只有一个组)。

示例:

类别 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 中保持此页面,则相同的对象等于存储到组中的类别的大小。数据库内部仍然只有一行。 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..
}

最佳答案

这是由于您使用急切获取而引起的,无论如何,这通常是一个坏主意。

如果可能的话,您应该尝试更改映射以延迟获取集合。这将解决这个问题,并且它引入的任何新问题都可以通过其他方式更好地处理,例如“在 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/

相关文章:

java - 将泛型类型限制为方法上的父类(super class)型

java - 员工类别: cannot resolve symbol in EmployeeMain

java - 追加两个 hibernate 查询列表并存储在第三个查询列表中

java - 使用 hibernate 保留基类和子类

java - 有什么方法可以在 Eclipse 中创建 wicket 项目

java - RestTemplate 是否同步 REST 调用?

java - GOOGLE_APPLICATION_CREDENTIALS 在 JAVA 中不起作用

java - 删除在 Hibernate/Spring Data 中不起作用

java - Wicket:创建指向 PDF 文件的链接

session - WebSession ClassCastException