【问题标题】:Hibernate JPA many-to-one self-join association cascade, how to select the top hierarchy and map children?Hibernate JPA多对一自加入关联级联,如何选择顶层层次结构并映射子级?
【发布时间】:2015-12-23 16:15:12
【问题描述】:

基于this 示例。我尝试使用 Hibernate 和 JPA 注释将 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
}

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

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

结果是我要求的正确员工(最高经理),但下属集合为空,如果我尝试更改条件以选择树底部的员工,则映射成功一切。我如何更改我的代码以首先映射最高管理者。我知道我可以从底层开始接触到高层管理者,但是有没有更简洁的方法?

【问题讨论】:

  • 您的查询无效。 Employee 类中没有名为“manager_id”的字段。 HQL/Criteria 从不使用表名和列名。他们在实体、他们的领域和他们的协会上工作。所以你想要crit.add(Restrictions.isNull("employee.manager"))。如何测试下属列表是否为空?向我们展示一个完整的测试用例,带有示例数据。此外, ManyToOne 上的 cascade=ALL 也不正确。您不想在删除员工时删除员工的经理。
  • 对不起,我编辑了它。它是“经理”。
  • 嗨,jpa CriteraiBuilder 代替 Hobgernate Criteria 怎么样?

标签: java hibernate jpa annotations hibernate-criteria


【解决方案1】:

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

.setResultTransformer(new AliasToBeanTransformer<Employee>(Employee.class));

解决方案是更改我的结果的映射,因为“每一行结果都是根实体的不同实例”

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2014-07-23
    • 2019-03-11
    • 2021-07-05
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多