【问题标题】:How to create Hibernate Mapping for a self referencing table如何为自引用表创建 Hibernate 映射
【发布时间】:2015-04-30 19:05:12
【问题描述】:

有人问我如何为表中引用表主键的列创建休眠映射。

例如,Employee 表有 EMP_ID 作为主键,它还有 MGR_ID 列来知道员工的经理。由于经理也是员工,因此它将在同一张表中。因此,每个员工行都有一个经理 ID,它也是一个员工。

  1. 我们如何为这个员工类创建 Hibernate 映射?
  2. Employee 类会是什么样子?它是否只有一个经理 ID,或者它将包含另一个 Employee 对象作为成员变量。

请帮助我解决这种情况。谢谢。

【问题讨论】:

    标签: hibernate self-referencing-table


    【解决方案1】:

    您可以在 Employee 类中引用 manager

    实体如下所示:

    @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 Self Join Annotations One To Many mapping example

    【讨论】:

    • 这种方法有效吗?假设,你有董事,董事有经理,经理有员工。所以当你打开一个员工时,你会得到一个经理,在那个经理里面你会得到一个小时候的员工。所以它会产生一个循环数据加载问题。解决方案是什么?
    • 这种糟透了..你需要引入第二列只是为了不让休眠崩溃
    • @SayedUzZaman 解决方案是在注解参数中添加 fetch = FetchType.LAZY
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2012-11-20
    • 2020-05-14
    相关资源
    最近更新 更多