首页 > 解决方案 > Hibernate OneToMany/ManyToOne 列表返回

问题描述

这些是我下面的表格,其中很少有记录。

                                    EMPLOYEE TABLE
______________________________________________________________________________________
|  id  |  username  |  name  |  surname  |     mail    |password|salary|deptId| type |
|------|------------|--------|-----------|-------------|--------|------|------|------|
|  1   |    jdoe    |  John  |    Doe    | jdoe@doe.com|  123   |  31  |  15  |annon |
|  2   |    wise    | Wise   | Sunshine  | ws@ws@com   |  345   |  62  |  15  |visib |
--------------------------------------------------------------------------------------

DEPARTMENT TABLE
_________________
|  id  |  name  |
|------|--------|
|  15  |Backend |
|  16  |Fontend |
|  17  |Unknown |
-----------------

下面是我的Employee课。

@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column
private String username;
@Column
private String name;
@Column
private String surname;
@Column
private String mail;
@Column
private String password;
@Column
private String salary;

@Column
private String type;

@ManyToOne(cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
@JoinColumn(name = "deptId")
private Department deptId;

//setters getters
//constructors

}

我的Department课如下:

@Entity
@Table(name = "department")
public class Department {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column
private String name;

@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
        CascadeType.REFRESH }, mappedBy = "deptId")
private List<Employee> employes;

public void add(final Employee employee) {

    if (this.employes == null) {
        this.employes = new ArrayList<>();
    }

    this.employes.add(employee);
    employee.setDeptId(this);
}

//setter getters
//constructors

}

DepartmentDao补充:

public class DepartmentDaoImpl implements DepartmentDao {
Session session;

@Override
public void addDepartment(final Department dept) {
    this.session.persist(dept);
}

@SuppressWarnings("deprecation")
@Override
public List<Department> listDepartments() {
    return this.session.createCriteria(Department.class).list();
}

@Override
public Department getDepartmentById(final int id) {
    return this.session.get(Department.class, id);
}

@Override
public void deleteDepartment(final int id) {
    this.session.delete(id);

}

public Session getSession() {
    return this.session;
}

public void setSession(final Session session) {
    this.session = session;
}

}

EmployeeDao执行:

public class EmployeeDaoImpl implements EmployeeDao {

    Session session;

    @Override
    public void addEmployee(final Employee employee) {
        this.session.save(employee);
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Employee> listEmployees() {
        return this.session.createCriteria(Employee.class).list();
    }

    @Override
    public Employee getEmployeeById(final int id) {
        return this.session.get(Employee.class, id);
    }

    @Override
    public void removeEmployee(final int id) {
        this.session.delete(this.session.get(Employee.class, id));
    }

    public void updateEmployee(final Employee employee) {
        this.session.update(employee);
    }

    public Session getSession() {
        return this.session;
    }

    public void setSession(final Session session) {
        this.session = session;
    }

}

我确实打电话如下listDepartmentsManagementServiceClass

public List<Department> getDepartmentList() {
    List<Department> departmentList;
    try {
        this.session = Service.FACTORY.openSession();
        this.departmentDao.setSession(this.session);
        this.session.beginTransaction();
        departmentList = this.departmentDao.listDepartments();
        this.session.getTransaction().commit();
    } finally {
        this.session.close();
    }
    return departmentList;
}

问题是,当我只想要部门表中的部门列表时,我使用listDepartments()in DepartmentDaoImpl,但返回

Department[15,Backend]  
Department[15,Backend]
Department[15,Backend]
Department[16,Frontend]
Department[17,UNKNOWN]

而不仅仅是这三个部门。所以我想Employee返回属于特定部门的 s 数量。我在这里做错了什么?

标签: javaspringhibernateorm

解决方案


在里面EmployeeDao我们必须实现

@Override
@SuppressWarnings("unchecked")
public List<Employee> listEmployees() {
    return this.session.createCriteria(Employee.class).
    setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
}

推荐阅读