Saya memiliki dua tabel yang terhubung dengan banyak ke banyak hubungan menggunakan kunci komposit:

Tabel 1

    @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<>();

Meja 2

@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<>();

Tabel dengan kunci komposit

@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;

Ketika saya melakukan panggilan REST ke tabel UserProduct sehingga saya dapat memperbarui nilai produk menggunakan muatan ini:

{
    "user": 4,
    "product": 2,
    "amountOfNewProducts": 32
}

Itu menulis informasi tergantung pada apa id pengguna dan bukan id produk. Untuk payload ini akan ditulis seperti ini:

{
        "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": []
    },

Jadi pada dasarnya meskipun saya memasukkan 2 sebagai id produk, informasi akan ditulis dalam produk dengan id 4 hanya karena id pengguna adalah 4. Segala jenis petunjuk di mana saya mungkin mengacau akan dihargai.

0
aratata 17 Maret 2020, 22:01

1 menjawab

Jawaban Terbaik

Anda perlu memperbaiki mappedBy = "user" di entitas Product. Itu harus "product", seperti ini:

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

Periksa juga apakah Anda memiliki @JoinColumn yang benar di UserProductId (sayangnya, Anda tidak memasukkan kode untuk pertanyaan itu).

1
Dmitrii Bocharov 17 Maret 2020, 20:21