2015-11-04 60 views
1

在SQL模式中有下一個表結構:客戶端,僱員,訂單。 和3個相應的java代碼中的實體類:Client,Employee,Order。休眠。在一個表中有幾個外鍵

來自客戶和員工的主要id字段都在外部表中作爲外鍵。

問題是如何顯示在java代碼中? 正如我在這裏理解的那樣,應該像在@OneToMany註釋的客戶和員工中添加Set字段一樣。

但是在Order Entity中應該做什麼,也許我必須添加除@OneToMany之外的任何其他註釋?

回答

1

我想你對Hibernate的關係映射有一些誤解。

事實上,如果你的Orders表有客戶和員工的外鍵,那麼你正在尋找的註解是@ManyToOne當你的實體必須通過有針對性的實體引用多個記錄

@OneToMany註解使用,而@ManyToOne用於你的實體只有一個記錄引用目標實體。

例如:

Orders實體有來自客戶端的一個參考和員工實體一個參考。

在這種情況下,訂單實體可以通過以下方式進行映射:

@Entity 
@Table(name = "Orders") 
public class Order implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    @ManyToOne 
    private Client client; 
    @ManyToOne 
    private Employee employee; 

    //getters and setters 
} 

@Entity 
@Table(name = "Clients") 
public class Client implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String attribute1; 

    //getters and setters 
} 

@Entity 
@Table(name = "Employees") 
public class Employee implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String attribute1; 

    //getters and setters 
} 

有了上面給出你應該能夠讓你的架構做工精細與Hibernate的例子,但便於理解,讓我們設想一個場景,您需要從客戶端獲取所有訂單,當然您可以通過查詢選擇客戶端表格中的訂單,但是Hibernate提供了@OneToMany註釋,這將使您可以訪問所有客戶訂單無需單獨查詢,只需通過映射!讓我們來看一個例子:

@Entity 
@Table(name = "Orders") 
public class Order implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    @ManyToOne 
    private Client client; 

    //getters and setters 
} 

@Entity 
@Table(name = "Clients") 
public class Client implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String attribute1; 
    @OneToMany(mappedBy = "client") 
    private List<Order> orders; 

    //getters and setters 
} 

在這個例子中,你應該能夠得到所有從客戶訂單剛剛通過調用「訂單」屬性的get。請注意,在@OneToMany映射中,我們將「mappedBy」屬性指定爲「客戶端」,因爲我們在客戶端和訂單之間有雙向映射,所以需要這樣做,因爲@OneToMany的簡單用法不需要​​此映射。

重要:當@OneToMany測繪工作,你最終會面臨一些延遲抓取的問題,在這種情況下,我強烈建議你看看這個問題:

Solve 「failed to lazily initialize a collection of role」 exception

另外,我認爲你應該開始閱讀更多關於Hibernate的瞭解它的基本概念,請查看關於@OneToMany和@ManyToOne註釋的其他問題關於休眠:

Hibernate/JPA ManyToOne vs OneToMany