2

我有几个关于双向映射的问题。

我有这些实体:

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

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

  5. 什么是ManyToOne关系的所有者。我想知道所有者是在多个实体还是一个实体上?
  6. mappedBy在所有者方还是反方指定?

请帮忙。

编辑:

我有下表: 项目- Proj_Client -客户端(多对多关系)并持久化项目表,但客户端没有持久化。它有什么问题?

谢谢。

4

1 回答 1

7
@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)then 来完成,说“Department 实体拥有其 Employee 实体”确实有意义,但该关系仍将由 Employee 实体拥有。

于 2012-04-29T08:05:28.317 回答