Троичный (и не) отношения в В спящем режиме

Q 1), Как мы можем смоделировать троичное использование отношений, в спящем режиме? Например, как мы можем смоделировать троичные отношения, представленные, сюда использование В спящем режиме (или JPA)?

Примечание: Я знаю, что JPA 2 добавил некоторые конструкции для создания троичных отношений с помощью карт. Однако этот вопрос принимает JPA 1, или Будьте в спящем режиме 3.3.x, и мне не нравится использовать карты для моделирования этого.

ER Model
(источник: grussell.org)


ER Model with ternary relationships replaced
(источник: grussell.org)

Идеально я предпочитаю, чтобы моя модель была похожа на это:

class SaleAssistant {
Long id;
//...
}

class Customer {
Long id;
//...
}

class Product {
Long id;
//...
}

class Sale {
SalesAssistant soldBy;
Customer buyer;
Product product;
//...
}

Q 1.1)

Как мы можем смоделировать это изменение, в котором каждый объект Sale мог бы иметь много продуктов?

class SaleAssistant {
Long id;
//...
}

class Customer {
Long id;
//...
}

class Product {
Long id;
//...
}

class Sale {
SalesAssistant soldBy;
Customer buyer;
Set products;
//...
}

Q 2), В целом, как мы можем смоделировать не, n> = 3 отношения с, в спящем режиме?

Заранее спасибо.

6
задан Glorfindel 22 July 2019 в 11:12
поделиться

2 ответа

Q1. Как мы можем смоделировать троичные отношения с помощью Hibernate? Например, как мы можем смоделировать представленные здесь троичные отношения с помощью Hibernate (или JPA)? (...)

Я бы переделал ассоциацию с промежуточным классом сущности (и это рекомендуемый способ в Hibernate). Применительно к вашему примеру:

@Entity
public class Sale {
    @Embeddable
    public static class Pk implements Serializable {
        @Column(nullable = false, updatable = false)
        private Long soldById;

        @Column(nullable = false, updatable = false)
        private Long buyerId;

        @Column(nullable = false, updatable = false)
        private Long productId;

        public Pk() {}

        public Pk(Long soldById, Long buyerId, Long productId) { ... }

        // getters, setters, equals, hashCode
    }

    @EmbeddedId
    private Pk pk;

    @ManyToOne
    @JoinColumn(name = "SOLDBYID", insertable = false, updatable = false)
    private SaleAssistant soldBy;
    @ManyToOne
    @JoinColumn(name = "BUYERID", insertable = false, updatable = false)
    private Customer buyer;
    @ManyToOne
    @JoinColumn(name = "PRODUCTID", insertable = false, updatable = false)
    private Product product;

    // getters, setters, equals, hashCode
}

Q1.1. Как мы можем смоделировать этот вариант, в котором у каждого элемента Sale может быть много Products?

Я бы не стал использовать здесь составной первичный ключ и ввел PK для сущности Sale.

Q2. В общем, как мы можем моделировать n-арные отношения, n >= 3, с помощью Hibernate?

Я думаю, что мой ответ на вопрос 1. охватывает это. Если это не так, пожалуйста, поясните.


Обновление: Ответы на комментарии OP

(...) поля pk не заполняются и в результате я не могу сохранить элементы Sale в БД. Должен ли я использовать такие сеттеры для класса Sale? public void setBuyer(Customer cust) { this.buyer = cust; this.pk.buyerId = cust.getId(); }

Вам нужно создать новый Pk (я удалил конструкторы из моего первоначального ответа для краткости) и установить его на Sale элемент. Я бы сделал примерно так:

Sale sale = new Sale();
Pk pk = new Pk(saleAssistant.getId(), customer.getId(), product.getId());
sale.setPk(pk);
sale.setSoldBy(saleAssistant);
sale.setBuyer(customer);
sale.setProduct(product);
...

А затем сохранил sale.

Также, в аннотации JoinColumn, на какой столбец ссылаются поля "name"? К пк целевых отношений или к собственным именам столбцов таблицы sale?

К столбцам для атрибутов составного пк (т.е. к собственным именам столбцов таблицы sale), мы хотим, чтобы они получили ограничения PK и FK.

11
ответ дан 9 December 2019 в 22:31
поделиться

Используете ли вы первичные ключи, сгенерированные базой данных, для Customer, Product и SalesAssistant? Это может вызвать проблему, поскольку похоже, что вы пытаетесь использовать фактические идентификаторы БД, а не позволяете Hibernate разрешать ссылки на объекты во время фактического сохранения.

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

Думаю, достаточно иметь ссылки на ManyToOne.

Также включите отладку операторов SQL и посмотрите, что отправляется в БД.

0
ответ дан 9 December 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: