JPA вставить в большое ManyToMany - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть эти 2 сущности (магазины и продукты). У меня уже есть продукты, и я хочу назначить их в магазин, проблема в том, что в магазине может быть тысячи продуктов, и мне нужно «вставить в» сохранить продукты в памяти, а затем сохранить магазин с набором продуктов. Это заставляет меня иметь StackOverflowError и супер неэффективно.

Есть ли способ сделать что-то вроде этого?

insert into product_store (product_id, store_id) VALUES (:productIds, :storeId)

Entities:

@Entity
@Table(name = "stores")
data class Store(@Id
                 @GeneratedValue(strategy = GenerationType.IDENTITY)
                 val id: Long = 0,
                 @Column
                 val name: String,
                 @Column
                 val street: String,
                 @Column
                 val streetNumber: String,
                 @Column
                 val postalCode: Int,
                 @Column
                 val city: String,
                 @Column
                 val state: String,
                 @Column
                 val latitude: Double,
                 @Column
                 val longitude: Double,
                 @ManyToMany(fetch = FetchType.LAZY)
                 @JoinTable(name = "product_store",
                         joinColumns = [JoinColumn(name = "store_id")],
                         inverseJoinColumns = [JoinColumn(name = "product_id")])
                 val products: Set<Product>

) : DateAudit()

Product Entity:

@Entity
@Table(name = "products")
data class Product(@Id
                   @GeneratedValue(strategy = GenerationType.IDENTITY)
                   val id: Long = 0,
                   @Column(nullable = false)
                   val codeBar: String,
                   @Column(nullable = false)
                   val name: String,
                   @Column(columnDefinition = "text")
                   val description: String,
                   @Column(columnDefinition = "text")
                   val ingredients: String?,
                   val picture: String,
                   @OneToMany(fetch = FetchType.EAGER, cascade = [CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH])
                   val nutriments: Set<Nutriment>,
                   @ManyToOne(fetch = FetchType.EAGER)
                   @JoinColumn(name = "brand_id")
                   val brand: Brand,
                   @ManyToMany(fetch = FetchType.EAGER, cascade = [CascadeType.MERGE])
                   @JoinTable(name = "product_category",
                           joinColumns = [JoinColumn(name = "product_id")],
                           inverseJoinColumns = [JoinColumn(name = "category_id")])
                   val categories: Set<Category>
) : DateAudit()

1 Ответ

0 голосов
/ 07 февраля 2020

Исправлено вот так

@Modifying
    @Query("INSERT INTO product_store (product_id, store_id) " +
            "(SELECT p.id, s.id FROM products p, stores s WHERE p.market_id IN (:productMarketIds) AND s.id = :storeId)", nativeQuery = true)
    fun saveProductsToStoreByProductMarketIds(storeId: Long, productMarketIds: Set<String>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...