Hibernate JPA 多对一自连接关联级联,如何select top hierarchy and map children?
Hibernate JPA many-to-one self-join association cascade, how to select the top hierarchy and map children?
基于 this 示例。我尝试使用 Hibernate 和 JPA 注释将员工映射到他的经理。
@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
}
我使用休眠条件来编写我的 select 请求。问题是,我只想要树中的最高管理者,我需要他的下属的集合,他们也知道他们的经理和下属等。
Criteria crit = getCurrentSession().createCriteria(Employee.class, "employee");
crit.add(Restrictions.isNull("manager"))
crit.setResultTransformer(new AliasToBeanTransformer<Employee>(Employee.class));
我要求的结果是正确的员工(高层经理),但是下属集合是空的,如果我尝试更改我的标准以选择树底部的员工,则映射是成功地完成了一切。我如何更改我的代码以首先映射高层管理器。我知道我可以从底层开始接触高层管理人员,但是有没有更简洁的方法?
经过几天的研究,我发现了问题
.setResultTransformer(new AliasToBeanTransformer<Employee>(Employee.class));
解决方案是更改我的结果的映射,因为 'Each row of results is a distinct instance of the root entity'
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
基于 this 示例。我尝试使用 Hibernate 和 JPA 注释将员工映射到他的经理。
@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
}
我使用休眠条件来编写我的 select 请求。问题是,我只想要树中的最高管理者,我需要他的下属的集合,他们也知道他们的经理和下属等。
Criteria crit = getCurrentSession().createCriteria(Employee.class, "employee");
crit.add(Restrictions.isNull("manager"))
crit.setResultTransformer(new AliasToBeanTransformer<Employee>(Employee.class));
我要求的结果是正确的员工(高层经理),但是下属集合是空的,如果我尝试更改我的标准以选择树底部的员工,则映射是成功地完成了一切。我如何更改我的代码以首先映射高层管理器。我知道我可以从底层开始接触高层管理人员,但是有没有更简洁的方法?
经过几天的研究,我发现了问题
.setResultTransformer(new AliasToBeanTransformer<Employee>(Employee.class));
解决方案是更改我的结果的映射,因为 'Each row of results is a distinct instance of the root entity'
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);