Почему мои данные связаны с неправильным столбцом в mysql дБ? - PullRequest
0 голосов
/ 17 марта 2020

У меня есть две таблицы, связанные с отношением «многие ко многим» с использованием составного ключа:

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. Любой вид подсказки, где я мог бы испортить, был бы признателен.

1 Ответ

1 голос
/ 17 марта 2020

Вам необходимо исправить mappedBy = "user" в Product сущности. Это должно быть "product", например:

@OneToMany(
            mappedBy = "product",
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    private List<UserProduct> userProducts = new ArrayList<>();

Также проверьте, правильно ли вы указали @JoinColumn в UserProductId (к сожалению, вы не указали код для этого вопроса).

...