我有以下情况。 员工可以有经理,但经理是雇员。
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);
答案 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列