Я бы почти сказал, что вам не хватает сущности под названием "автомобиль", в которой есть "Марка, модель и год". У дилеров тогда были бы Автомобили. У вас больше не будет трехстороннего "многие ко многим" Но, учитывая, что это всего лишь пример, вы можете смоделировать отношения как свою собственную сущность, скажем, «Инвентаризация», которая будет иметь дилерский центр, марку, модель и любые дополнительные атрибуты, связанные с ней, которые вы хотите (например, год, количество )
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();