У меня есть две таблицы, связанные с отношением «многие ко многим» с использованием составного ключа:
Table1
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "user_name")
private String userName;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
private String password;
private String authorization;
@OneToMany(
mappedBy = "user",
cascade = CascadeType.ALL,
orphanRemoval = true
)
@JsonManagedReference
private List<UserProduct> userProducts = new ArrayList<>();
@OneToMany(
mappedBy = "user",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Orders> orders = new ArrayList<>();
Table2
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private int price;
private double mass;
private double alcohol;
private String picture;
private int amount;
@OneToMany(
mappedBy = "user",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<UserProduct> userProducts = new ArrayList<>();
@OneToMany(
mappedBy = "orders",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<OrderProduct> orderProducts = new ArrayList<>();
Таблица с составным ключом
@Entity
@Table(name = "user_product")
public class UserProduct {
@EmbeddedId
private UserProductId id;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("userId")
@JsonBackReference
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("productId")
private Product product;
@Column(name = "amount_of_new_products")
private int amountOfNewProducts;
Когда я выполняю вызов REST для таблицы UserProduct, чтобы я мог обновить значение продукта, используя эту полезную нагрузку:
{
"user": 4,
"product": 2,
"amountOfNewProducts": 32
}
он записывает информацию в зависимости от того, какой идентификатор пользователя, а не идентификатор продукта Для этой полезной нагрузки это будет записано так:
{
"id": 3,
"name": "Grimbergen Blanche",
"price": 132,
"mass": 0.33,
"alcohol": 6.0,
"picture": "https://i.imgur.com/qIq1OrC.png",
"amount": 502,
"userProducts": [],
"orderProducts": []
},
{
"id": 4,
"name": "Grimbergen Blonde",
"price": 132,
"mass": 0.33,
"alcohol": 6.7,
"picture": "https://i.imgur.com/OnioHd5.png",
"amount": 435,
"userProducts": [
{
"id": {
"productId": 2,
"userId": 4
},
"product": {
"id": 2,
"name": "Lav Premium",
"price": 73,
"mass": 0.33,
"alcohol": 4.9,
"picture": "https://i.imgur.com/T3gCAOE.png",
"amount": 1862,
"userProducts": [],
"orderProducts": []
},
"amountOfNewProducts": 32
}
],
"orderProducts": []
},
Так что, в принципе, даже если я передал 2 в качестве идентификатора продукта, информация будет записана в продукт с идентификатором 4 только потому, что идентификатор пользователя равен 4. Любой вид подсказки, где я мог бы испортить, был бы признателен.