Hibernate:如何在单个类中映射ManyToOne

时间:2015-10-21 06:22:42

标签: hibernate jpa many-to-one

我有以下情况。 员工可以有经理,但经理是雇员。

ERM: 员工n<有> 1位经理

说明:一个或多个员工可以有一个或没有经理。如何在单个POJO中映射? 当google关于它时,我发现只有两个类这样的解决方案 http://www.concretepage.com/hibernate/example-manytoone-hibernate

$("#select_id").val("val2").change();

设置managerId

@Entity
public class Employee {

    @Id
    private Integer employeeId;

    @ManyToOne
    @JoinColumn(name="employeeId", nullable=true, insertable = false, updatable = false)
    private Employee managerId;

    /* Getter and setter */
}

我在桌子上看不到managerId ...... 我正在使用

Employee emp = new Employee();
/* bla bla bla */
emp.setManagerId(emp);

2 个答案:

答案 0 :(得分:1)

Employee <-> Manager关系是具有自引用关系的实体的样本。

员工将拥有对其经理的引用 - 这将被映射为@ManyToOne。这将是我们可以定义@JoinColumn

的关系的拥有方

经理将拥有其下属的集合 - 这将被映射为@OneToMany。这将是关系的反面,并将指定mappedBy属性。

以下是具有自引用关系(双向)的Employee实体的示例代码。

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

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

    private String name;

    @ManyToOne
    @JoinColumn(name = "MANAGER_ID")
    private Employee manager;

    @OneToMany(mappedBy = "manager")
    private List<Employee> subordinates = new ArrayList<Employee>();

    // Getters and Setters
...
}

以下是持久性经理及其员工的示例代码:

    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();

    Employee manager = new Employee();
    manager.setName("John");

    Employee emp1 = new Employee();
    emp1.setName("James");

    Employee emp2 = new Employee();
    emp2.setName("Anna");

    // define both sides of the relationship
    emp1.setManager(manager);
    emp2.setManager(manager);
    manager.getSubordinates().add(emp1);
    manager.getSubordinates().add(emp2);

    em.persist(manager);
    em.persist(emp1);
    em.persist(emp2);

    em.getTransaction().commit();

以下是Hibernate / JPA生成模式的方法:

Hibernate: 
    create table EMPLOYEE (
        id bigint not null auto_increment,
        name varchar(255),
        MANAGER_ID bigint,
        primary key (id)
    )
Hibernate: 
    alter table EMPLOYEE 
        add constraint FK_slgfbmxe6gqdcw80b5gvn16ye 
        foreign key (MANAGER_ID) 
        references EMPLOYEE (id)

我的Git repo中提供了此实现的示例。

答案 1 :(得分:0)

你的字段引用实际上都是同一列 - employeeId。变化

@ManyToOne
@JoinColumn(name="employeeId", nullable=true, insertable = false, updatable = false)
private Employee managerId;

@ManyToOne
@JoinColumn(name="managerId", nullable=true, insertable = false, updatable = false)
private Employee manager;

然后在创建后,您将在表格中看到managerId列