我有几个关于双向映射的问题。
我有这些实体:
- 员工 (1) - (1) Parking_Lot
- 员工(*) - (1) 部门
员工(*) - (1) 项目
上述关系的源实体和目标实体是什么?
ManyToOne
关系的所有者是什么。我想知道楼主是 在许多实体还是一个实体上?mappedBy
指定在所有者侧还是相反侧?
请帮忙。
编辑:
我有下表: Project - Proj_Client - Client(多对多关系)并保存项目表,但客户端不会保存。有什么问题吗?
谢谢。
最佳答案
@Entity
@Table(name="empoyee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@ManyToOne
@JoinColumn(name="department_id", referencedColumnName="id")
private Department department;
@ManyToOne
@JoinColumn(name="project_id", referencedColumnName="id")
private Project projects;
@OneToOne(mappedBy="employee")
private ParkingLot parkingLot;
//Other properties,constructors, getters and setters and so on
}
@Entity
@Table(name="department")
public class Department implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany(mappedBy="department")
private List<Employee> employees;
//Other properties,constructors, getters and setters and so on}
@Entity
@Table(name="parking_lot")
public class ParkingLot implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToOne
@JoinColumn(name="employee_id",referencedColumnName="id")
private Employee employee;
//Other properties,constructors, getters and setters and so on}
@Entity
@Table(name="project")
public class Project implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany(mappedBy="project")
private List<Employee> employees;
//Other properties,constructors, getters and setters and so on
}
如果关系是单向的,则实际上没有拥有方,也没有任何 mappedBy 注释。 如果关系是双向的,则一侧带有 mappedBy 注释 - 另一侧是拥有方。 拥有方是拥有关系的一方。因此,该术语的应用并不像 ParkingLot 拥有其 Employee 或 Employee 拥有其 ParkingLot,而是像 ParkingLot 和 Employee 之间的关系由 Employee 拥有(或 ParkingLot 见下文)。 对于 ManyToOne 没有 mappedBy,所以它总是拥有关系的 OneToMany 注释下指定的实体(有道理,因为例如项目表不能有所有员工的外键) 因此,对于您示例中的两个 ManyToOne/OneToMany 映射,我们无法选择哪一方拥有关系。在 Employee 和 ParkingLot 之间我们可以选择,我选择了 ParkingLot。 如果有选择,那又有什么关系呢?好吧,主要区别在于 mappedBy 具有属性级联。请注意,哪个表有外键或者关系是否在它自己的表中并不重要 - JPA 支持所有情况(@InverseJoinColumn 等)。
对于双向映射,没有明确的映射目标和源,这取决于您从哪个方向进行映射。该术语更适用于单向映射,源端当然是具有映射的实体(即目标实体的可能知识)
4) 不适用(除非您将 ParkingLot 和 Employee 之间的关系设为单向)。 5)关系的所有者总是“在一个实体上” 6)反面
最后说明:
“拥有方”令人困惑,例如我们可以设计一个部门拥有它的员工,如果我们删除一个部门,它的所有员工也将被删除。这可以通过将 @OneToMany(mappedBy="department")
更改为 @OneToMany(mappedBy="department", cascade= CascadeType.REMOVE)
来完成说“Department 实体拥有其 Employee 实体”是有道理的,但该关系仍将由 Employee 实体拥有。
关于JPA 关系映射概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10347766/