Составление связей моделей в spring. Как реализовать, какие связи использовать и какие модели брать за главные

Я создаю интернет магазин ключей от Windows и т.д. У меня возникла проблема со связями моделей.

Модель пользователя.

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "username", nullable = false)
    @NotBlank(message = "Username не может быть пустым")
    private String username;

    @Email(message = "Неверный адрес электронной почты")
    @NotBlank(message = "Адрес электронной почты не может быть пустым")
    @Column(name = "email", nullable = false)
    private String email;

    @Column(name = "password", nullable = false)
    @NotBlank(message = "Пароль не может быть пустым")
    private String password;

    @Column(nullable = false)
    private boolean active = false;
    private String activationCode;

    @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
    @Column(nullable = false)
    private Set<Role> roles = new java.util.LinkedHashSet<>();

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "cart_id")
    private Cart cart;
}

Модель товара (продукта)

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @NotBlank(message = "Название не может быть пустым")
    @Column(name = "title", length = 128, nullable = false)
    private String title;

    @NotBlank(message = "Описание не может быть пустым")
    @Column(name = "description", length = 2048, nullable = false)
    private String description;

    @Min(value = 1, message = "Цена не может быть меньше 1")
    @Column(name = "price", nullable = false)
    private int price;

    @Min(value = 2, message = "Старая цена не может быть меньше 2")
    @Column(name = "old_price", nullable = false)
    private int oldPrice;

    @NotBlank(message = "Ссылка не может быть пустой")
    @Column(name = "slug", unique = true, nullable = false)
    private String slug;

    @Column(name = "availability", nullable = false)
    private boolean availability = false;

    @Enumerated(EnumType.STRING)
    @Column(name = "product_type", nullable = false)
    private ProductType productType;
}

Также есть модель "предмет продукта", которая хранит ключ (123-123-123)

@Entity
public class ProductItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @NotBlank(message = "Название не может быть пустым")
    @Column(name = "title", length = 128, nullable = false)
    private String title;

    @NotBlank(message = "objectProduct не может быть пустым")
    @Column(length = 2048, nullable = false, name = "object_product")
    private String objectProduct;
}

Теперь главный вопрос как правильно их связать.

Как я понимаю надо связать продукт и "предмет продукта" связью OneToMany (один продукт много "предметов товара") и ManyToOne (Много "предметов товара" и один продукт), также надо привязать "предмет товара" к пользователю (Чтобы потом в профиле вывести товар, который он купил). Получается пользователь, который купил товар может получить "предмет товара", а который нет не имеет к нему доступ (то есть связи к нему нет) и при это мы не должны при вызове продукта получать "предмет товара" (который куплен). Как это реализовать, какие связи использовать и какие модели брать за главные???


Ответы (0 шт):