2015-01-12 32 views
3

我有新的JPA項目使用休眠,我在閱讀代碼時遇到困難。我看到:ManyToOne關係沒有列表/設置使用JPA

@Entity 
public class Product { 

    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Manufacturer manufacturer; 

... 
} 

與另一個實體

@Entity 
public class Manufacturer{ 

private ManufacturerId manufacturerId; 

    private String name; 

    private Manufacturer() { 
    } 
... 

爲什麼沒有列出/設置與在製造商實體類產品(S)? ManyToOne關係是雙向的嗎?爲什麼這可能?製造商如何知道其產品,以及如何在數據庫表上保留這些信息?

+0

製造商如何知道它的產品?你的問題回答你的問題「它的」,它的產品,所以他會知道的。大有一個產品組合 –

+0

ManyToOne是雙向的,如果有List/Set和單向的,如果有不是。還有什麼可說的...... –

+0

@Xelian您是否能夠在沒有HQL的情況下從java代碼獲取產品列表? –

回答

2

一對多關聯的多方是可選的。如果有意的話,你可以實現它,或者如果不需要甚至冒險,可以跳過它。製造商可能有數千種產品。比一次抓取所有這些都沒有意義。最好通過查詢加載並使用分頁。當然如果您認爲這對您有幫助,您可以將產品集合添加到您的製造商。

  • 爲什麼在製造商實體類中沒有產品列表/集合?

    因爲不需要或被認爲有風險。

  • ManyToOne的關係是雙向的嗎?

    當然是的。即使關係沒有實現,它仍然存在。

  • 這是爲什麼呢?這將如何保持在數據庫表上?

    OneToMany關係總是由一側的ID實現。 (ManufacturerId的產品在這種情況下是必要的。沒有別的。即使你實現產品的集合。這將不會製造商如何知道影響它的持續存在的方式。

  • 其產品?

    它不。但當然可以查詢數據庫

+0

您能否詳細說明爲什麼會回答這個問題?事實上,很難理解爲什麼這是正確的解決方案。 – brandonscript

+0

@remus是的,閱讀有點快。現在應該會更好。 –

1

如果您在數據庫級別查看,表Product將具有類似manufacturer_id這是Manufacturer表的外鍵。在單向和雙向映射的情況下,表結構保持不變。

製造商將通過查詢表Productmanufacturer_id = <its id>瞭解其產品。在JPA級別,如果是單向映射,您可以通過from Product p where p.manufacturer.id = :man_id來查詢。在雙向映射的情況下,您可以僅執行manufacturer.getProducts(),但它會轉換爲相同的SQL。