@Valeriy_Morozov

Какие отношения должны быть между этими двумя Entity?

Есть 3 Entity
Order, OrderItem, Product

@Entity
public class Order {
lic class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
       @OneToMany(
            mappedBy = "order",
            cascade = CascadeType.ALL,
            orphanRemoval = true)
    private List<OrderItem> orderItems;
    }

OrderItem имеет всего 2 поля и обратную ссылку на Order

@Entity
public class OrderItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private Product product;
    private int quantity;
 @ManyToOne
    private Order order;
}

По сути, я его использую как замена map, чтобы знать, сколько раз product был заказан. А вот Product

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
 private long id;
    private String name;
    private String description;
    private Category category;
    }

Если с отношениями Order - OrderItem все понятно ( OneToMany bidirectional );

То какие отношения должны быть между Product и OrderItem? Если @ManyToMany, то не будет ли проблем с обращениями к БД и оптимизацией, если это будет ManyToMany unidirectional ( OneToMany unidirectional их имеет, а про ManyToMany я не знаю ).
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Нечто похожее уже обсуждалось в данном вопросе:
https://qna.habr.com/q/1111518

Допустим, что у вас есть сущность Product, а также сущность Order.
В одном заказе может быть некоторое кол-во одного товара, а значит, вам где-то нужно хранить еще и кол-во заказанного товара.
Для этого подойдет аггрегация, как вариант.
Т.е. нужно завести доп. таблицу (например, OrderData), в которой foreign_keys будут являться и product_id и order_id, а также будет. доп. колонка quantity.
+----------+------------+----------+
| order_id | product_id | quantity |
+----------+------------+----------+
|        1 |          2 |       10 |
|        2 |          3 |       11 |
+----------+------------+----------+


Таким образом, у вас должно получится что-то типа такого (псевдокод):
Product {
long productId;
}
Order {
long orderId;
}
OrderData {
Order order;
Product product;
int quantity;
}


Другой вариант:
это как указано в вопросе по ссылке выше. Использовать мапу.
Привожу ссылку на полезный ресурс:
https://www.baeldung.com/hibernate-persisting-maps
Что в данном случае должно получиться (псевдокод):
Product {
long productId;
}

Order {

@MapKeyColumn(name = "product_id")
@Column(name = "quantity")
Map<Long, Integer>
}


В данном случае, мы указываем на MapKeyColumn. Т.е. уник. ключом будет являться идентификатор продукта. А значением будет его кол-во (название указано в Column).

Наверняка, если подумать еще, то можно найти еще варианты.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы