如何在2个实体类之间显示2种不同类型的映射,相互之间的参考

时间:2016-11-20 01:23:13

标签: entity-framework jpa java-ee

2个表(Department和Employee)之间的映射如下(还提供了显示映射的图像的链接):

  • 每个部门都有一个且只有一个部门负责人。
  • 每个部门都可以有多名员工。
  • dept_id和empId是各自表格的主键。
  • dept_head(这是员工ID)和部门是他们的外键 各自的表格。

Mapping Employee and Department table

我为上面的两个表创建了实体类(结构在下面提供)。

员工类:

public class Employee implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "empId")
private Integer empId;
@Size(max = 45)
@Column(name = "name")
private String name;
@Size(max = 45)
@Column(name = "address")
private String address;
@Size(max = 45)
@Column(name = "grade")
private String grade;
@Size(max = 45)
@Column(name = "email")
private String email;

@JoinColumn(name = "dept", referencedColumnName = "dept_id")
@ManyToOne
private Department deptartment; 
.. ... 
}

系类:

public class Department implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 8)
@Column(name = "dept_id")
private String deptId;
@Size(max = 45)
@Column(name = "name")
private String name;

@JoinColumn(name = "dept_head", referencedColumnName = "empId")
@OneToOne
private Employee deptHead;

@OneToMany(mappedBy = "deptartment")
private List<Employee> employeeList;
....
...
}

如果我在Employee Class中添加mappedBy(就像我在Department中所做的那样),为了显示empId和deptHead之间的OneToOne映射,代码正在编译并运行。但是,如果我没有在Employee类中添加mappedBy语句,如上面的代码所示,代码仍然可以编译并运行正常。

我想知道为什么上面的代码工作,即使我没有在员工类中提供mappedBy。

如果有人可以帮助我清除上述疑虑并解释其工作背后的逻辑将是伟大的,因为我是新手。

1 个答案:

答案 0 :(得分:0)

使用和不使用mappedBy属性尝试使用它的位置并不十分清楚。

但如果我正确地提出你的问题,你会问为什么你只能注释一方或双方?

这取决于您的关系的来源和目的地是哪一方,也可能是双向的。在Java端,由于对象引用,您可以始终在两个方向上建立关系,但在数据库端,您可能只在一个方向上拥有它。

有关详细信息,请查看该主题的JPA Wiki book

此外,OneToOne的API文档指出:

  

指定与另一个实体的单值关联   一对一的多样性。通常不需要指定   明确关联的目标实体,因为它通常可以推断出来   来自被引用对象的类型。如果关系是   双向,非拥有方必须使用mappedBy元素   OneToOne注释指定关系字段或属性   拥有方。