Hibernate JPA多对一自联接关联级联,如何选择顶级层次结构并映射子级?

时间:2015-12-23 16:15:13

标签: java hibernate jpa annotations hibernate-criteria

基于this示例。我尝试使用Hibernate和JPA注释将Employee映射到他的经理。

Table Employee

@Entity
@Table(name="EMPLOYEE")
public class Employee {

    @Id
    @Column(name="EMPLOYEE_ID")
    @GeneratedValue
    private Long employeeId;

    @Column(name="FIRSTNAME")
    private String firstname;

    @Column(name="LASTNAME")
    private String lastname;

    @ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="manager_id")
    private Employee manager;

    @OneToMany(mappedBy="manager")
    private Set<Employee> subordinates = new HashSet<Employee>();

    public Employee() {
    }

    public Employee(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }

    // Getter and Setter methods
}

我使用hibernate条件来编写我的选择请求。问题是,我只想要树中的高级经理,我需要他的下属的集合,他们也知道他们的经理和下属等。

Criteria crit = getCurrentSession().createCriteria(Employee.class, "employee");
crit.add(Restrictions.isNull("manager"))
crit.setResultTransformer(new AliasToBeanTransformer<Employee>(Employee.class));

结果是我要求的正确的员工(高层管理人员),但是下属的集合是空的,如果我尝试更改我的标准以在树的底部选择员工,则映射成功完成为了一切。如何更改我的代码以首先映射最高管理员。我知道我可以从底层开始并访问高层管理人员,但有更清洁的方法吗?

1 个答案:

答案 0 :(得分:0)

经过几天的研究,我发现了问题

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

解决方案是更改我的结果的映射因为&#39;每行结果都是根实体的一个独特实例&#39;

{{1}}