2012-04-27 217 views
2

我有几个关于双向映射的问题。JPA关系映射概念

我有这些实体:

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

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

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

请帮忙。

编辑:

我有如下表: 项目 - Proj_Client - 客户(多对多的关系)和持续的项目表,但客户端未得到坚持。它有什么不对?

谢谢。

回答

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拥有其员工或员工拥有其ParkingLot一样应用,而是像ParkingLot和员工之间的关系由员工拥有(或ParkingLot见下文)。 对于ManyToOne,没有mappedBy,所以它始终是拥有该关系的OneToMany注释下指定的实体(有意义,因为例如项目表不能为其所有员工提供外键) 因此,对于两个在你的例子中的ManyToOne/OneToMany映射我们没有选择哪一方拥有这种关系。在员工和ParkingLot之间,我们有一个选择,我选择了ParkingLot。 当给出选择时,它有什么关系?那么,主要区别是mappedBy具有多层级联。请注意,哪个表具有外键并不重要,或者关系是否在其自己的表中--JPA支持所有情况(@InverseJoinColumn等)。

对于双向映射,映射没有明确的目标和来源,它取决于映射的方式。该术语更适用于单向映射,并且源端当然是具有映射的实体(这是目标实体的可能知识)

4)不适用(除非您将ParkingLot和Employee之间的关系单向)。 5)的关系的所有者始终是“对一个实体” 6)反侧

最后一点: “拥有侧”是混乱的,例如我们可以设计这样一个部门拥有员工如果我们删除一个部门的所有员工也将被删除。这可以通过将@OneToMany(mappedBy="department")更改为@OneToMany(mappedBy="department", cascade= CascadeType.REMOVE)来完成,那么说“部门实体拥有其员工实体”真的很有意义,但这种关系仍将由员工实体拥有。

+0

拥有一方令人困惑,因为JPA执行映射(链接)操作,但提供程序执行sql操作。问题:我在Employee和项目之间存在多对多关系,并且所有必需的映射都像joinTable,但我没有连接表类/实体。在这种情况下如何填充joinTable? – peterwkc 2012-04-30 06:06:43

+0

级联如何影响所有者关系或JPA映射和sql操作? – peterwkc 2012-04-30 06:20:19

+0

JoinTable不需要单独的类/实体,只要它只保存关系而不是附加的数据/列。级联问题:http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Cascading – esej 2012-04-30 08:04:50