Составление связей моделей в 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 (Много "предметов товара" и один продукт), также надо привязать "предмет товара" к пользователю (Чтобы потом в профиле вывести товар, который он купил). Получается пользователь, который купил товар может получить "предмет товара", а который нет не имеет к нему доступ (то есть связи к нему нет) и при это мы не должны при вызове продукта получать "предмет товара" (который куплен). Как это реализовать, какие связи использовать и какие модели брать за главные???