2012-04-27 175 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