Hibernate Triple Multi-to-Many Join

时间:2012-04-03 03:03:59

标签: java hibernate jpa

我需要一些帮助来建模一个与另一个表有很多关系的表,这个表与第三个表有很多关系。

为了说明,我说有三张与汽车有关的表:经销商,品牌和型号。经销商与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模型对象有什么影响?

2 个答案:

答案 0 :(得分:2)

我几乎会说你错过了一个名为“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();

答案 1 :(得分:1)

经销商模式关系不直接;它只存在于经销商制造和制造模型的关系中。这样,将其指定为经销商的财产是不合适的。相反,您应该执行JPQL查询以查找经销商提供的模型。