我需要一些帮助来建模一个与另一个表有很多关系的表,这个表与第三个表有很多关系。
为了说明,我说有三张与汽车有关的表:经销商,品牌和型号。经销商与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模型对象有什么影响?
答案 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查询以查找经销商提供的模型。