Hibernate Triple-многие-многие присоединиться - PullRequest
1 голос
/ 03 апреля 2012

Мне нужна помощь в моделировании таблицы, которая имеет отношение многих ко многим, к другой таблице, которая имеет отношение многих ко многим к третьей таблице.

Для иллюстрации скажем, у меня есть три таблицы, относящиеся к автомобилям:Автосалон, Марка и Модель.Дилерство имеет много-много-много отношений с Маркой (то есть: Honda, Ford и т. Д.), А Марка имеет много-много-много отношений с Моделью (то есть: Паспорт, Согласие и т. Д.).(Обратите внимание, что в реальной жизни я уверен, что у моделей «Мак» и «Модель» нет отношения «многие ко многим», но я использую это отношение в целях иллюстрации).Учитывая конкретный дилерский центр, я хотел бы получить все марки, которые они несут, и от каждой марки я хотел бы получить все модели той марки, которые несет дилерский центр.Они не могут нести каждую модель определенной марки, поэтому она должна возвращать только те модели, которые они несут.

Dealership
----------------
1 - Motor Experts
2 - Auto Sales

Make
----------------
1 - Honda
2 - Ford

Model
----------------
1 - Passport
2 - Accord
3 - Taurus

Я знаю, как установить отношения многие-ко-многим между дилерством и маркой и многими-ко-много отношения между маркой и моделью.Проблема в том, что я не знаю, как соотносить только те модели, которые несет дилерский центр.

Каков наилучший способ моделирования таблиц соединений и какими будут аннотации JPA / Hibernate на моих объектах модели Java?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

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

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 голос
/ 05 апреля 2012

Дилерская модель не является прямой; оно существует только благодаря отношениям дилерской марки и модели. Это не уместно указывать как собственность дилерского центра. Скорее вы должны выполнить JPQL-запрос, чтобы найти модели, доступные в дилерском центре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...