JPA关系映射概念

时间:2012-04-27 09:00:26

标签: jpa

我对双向映射有几个问题。

我有这些实体:

  1. 员工(1) - (1)Parking_Lot
  2. 员工(*) - (1)部门
  3. 员工(*) - (1)项目

  4. 上述关系的来源和目标实体是什么?

  5. ManyToOne关系的所有者是什么?我不知道主人是谁 在许多实体或一个实体上?
  6. mappedBy是否在所有者方或反方指定?
  7. 请帮忙。

    编辑:

    我有下表: 项目 - Proj_Client - 客户端(多对多关系)并保留项目表但客户端未获得持久性。怎么了?

    感谢。

1 个答案:

答案 0 :(得分:8)

@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)来完成,然后说“部门实体拥有其员工实体”真的很有意义,但这种关系仍将由员工实体拥有。