簡體   English   中英

Hibernate Triple Multi-to-Many Join

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM