【发布时间】:2017-06-05 09:48:26
【问题描述】:
目前我们在尝试更新不是拥有方的集合(关系)时遇到Spring Data JPA + Spring Data REST(Hibernate 作为JPA 实现)的问题(一个众所周知的问题)。
映射如下:
@Entity(name = Product.NAME)
public class Product {
...
@OneToMany(mappedBy = "baseProduct", fetch = FetchType.LAZY, targetEntity = Variant.class)
List<Variant> getVariants() {
...
在另一个变体方面:
@Entity(name = Variant.NAME)
public class Variant extends Product {
...
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Product.class)
@JoinColumn(name = "baseproduct_id", referencedColumnName = "id")
Product getBaseProduct() {
...
}
如果您仅使用 Spring Data JPA,则 Java 方面的一切都是 good,但是如果您想通过更新其变体集合来更新“产品”并发送PATCH 对 https://localhost:8112/storefront/rest/product/21394435410197232 的请求仅包含新集合的有效负载(3 项中有 2 项):
{"variants":["22801810293768080","22801810293768096"]}
我没有得到任何例外或任何东西,但由于拥有方是另一方,所以没有任何东西被持久化,我又得到了旧的 3 items。
我know我可以通过设置来解决这个问题
@JoinColumn(name = "baseproduct_id", referencedColumnName = "id")
在双方上,不要在任何地方使用mappedBy,但是我听说有一个性能影响,我不确定它有多大(我们有100多个具有@OneToMany的实体)我想知道通过@PreUpdate listener 或其他方式是否有更好的解决方法?
【问题讨论】:
-
您找到答案了吗?我有这个确切的问题,我如何从非所有者方面更新关联?
-
如下所述,如果它是双向的,那么您需要更新双方。
标签: java spring hibernate jpa spring-data-jpa