[英]Hibernate Triple Many-To-Many Join
我需要一些幫助來建模一個與另一個表有多對多關系的表,這個表與第三個表有很多關系。
為了說明,我說有三張與汽車有關的表:經銷商,品牌和型號。 經銷商與Make有許多關系(即:本田,福特等),而且Make與模型有許多關系(即:Passport,Accord等)。 (注意,在現實生活中,我確信Make和Model沒有多對多的關系,但我將這種關系用於說明目的)。 鑒於一個特定的經銷商,我想得到他們攜帶的所有Make,並且從每個Make我想得到經銷商所帶的那個Make的所有型號。 它們可能不會攜帶特定品牌的每個型號,因此它應該只返回它們攜帶的型號。
Dealership
----------------
1 - Motor Experts
2 - Auto Sales
Make
----------------
1 - Honda
2 - Ford
Model
----------------
1 - Passport
2 - Accord
3 - Taurus
我知道如何在Dealership和Make之間建立多對多的關系,以及Make和Model之間的多對多關系。 問題是我不知道如何僅與經銷商所攜帶的模型相關聯。
對連接表建模的最佳方法是什么?JPA / Hibernate注釋對我的java模型對象有什么影響?
我幾乎會說你錯過了一個名為“car”的實體,它將擁有“Make,Model和Year”。 經銷商將擁有汽車。 你將不再擁有3對多對多。 但鑒於它只是一個例子,你可以將關系建模為自己的實體,讓我們說“庫存”,它將擁有經銷商,品牌,型號以及與之相關的任何其他屬性(例如年份,數量) )
Inventory (Dealership, Make, Model)
---------
1, 1, 1 -- (Motor Exports, Honda, Passport)
1, 2, 3 -- (Motor Exports, Fort, Taurus)
etc...
在Hibernate中,您將Inventory建模為具有嵌入式主鍵的自己的實體。 縮寫形式,它看起來像這樣:
@Entity
public class Inventory {
@EmbeddedId
public InventoryId id;
// additional attributes
@MapsId("dealership")
@ManyToOne
public Dealership dealership;
@MapsId("make")
@ManyToOne
public Make make;
@MapsId("model")
@ManyToOne
public Model model;
}
@Embeddable
public class InventoryId implements Serializable {
@ManyToOne public Dealership dealership;
@ManyToOne public Make make;
@ManyToOne public Model model;
// Don't forget to implement equals and hashcode
}
@Entity
public class Dealership {
@Id @GeneratedValue public Long id;
@Basic public String name;
@OneToMany(mappedBy="dealership") public List<Inventory> inventory;
}
// classes Make and Model follow the same pattern as Dealership
然后運行查詢特定經銷商在庫存中使用的所有模型:
List<Model> stock = em.createQuery(
"select distinct inv.model "+
"from Dealership d "+
"join d.inventory inv "+
"where d.name = :dealer",
Model.class)
.setParameter("dealer", "Motor Exports")
.getResultList();
經銷商模式關系不直接; 它只存在於經銷商制造和制造模型的關系中。 這樣,將其指定為經銷商的財產是不合適的。 相反,您應該執行JPQL查詢以查找經銷商提供的模型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.