【发布时间】:2021-09-02 22:09:15
【问题描述】:
有没有办法使用@OneToMany 和@ManyToOne 在中间实体(映射表)中过滤软删除的多对多关联?
product 和 product_option_group 是 N:M 关系。我正在使用disabled_datetime 列实现软删除,并希望从Product 实体中过滤ProductOptionGroup 的集合。 This post 正在使用 @ManyToMany 和 @Where 来实现这一点。我跟着它工作了(禁用product_option_groups 从product.getProductOptionGroups() 中过滤)。请注意 @Where 上的 ProductOptionGroup 类。
// `product` <-> `product-product_option_group` <-> `product_option_group`
@Entity
@Table(name = "product")
public class Product implements Serializable {
...
@ManyToMany
@JoinTable(name = "product-product_option_group",
joinColumns = @JoinColumn(name = "product_id"),
inverseJoinColumns = @JoinColumn(name = "product_option_group_id"))
private final Set<ProductOptionGroup> productOptionGroups = new HashSet<>();
...
}
@Entity
@Table(name = "product_option_group")
@Where(clause = "disabled_datetime is null")
public class ProductOptionGroup implements Serializable {
...
@Column(name = "disabled_datetime")
private ZonedDateTime disabledDatetime;
...
}
但我想将@OneToMany 用于product-product_option_group 表,就像这样。
@Entity
@Table(name = "product")
public class Product implements Serializable {
...
@OneToMany(mappedBy = "id.product")
private final Set<ProductProductOptionGroup> productProductOptionGroups = new HashSet<>();
...
}
@Entity
@Table(name = "`product-product_option_group`")
public class ProductProductOptionGroup implements Serializable {
@EmbeddedId
private final ProductProductOptionGroupId id = new ProductProductOptionGroupId();
...
}
@Embeddable
public class ProductProductOptionGroupId implements Serializable {
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "product_id", referencedColumnName = "id")
private Product product;
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "product_option_group_id", referencedColumnName = "id")
@Where(clause = "disabled_datetime is null")
private ProductOptionGroup productOptionGroup;
}
@Entity
@Table(name = "product_option_group")
@Where(clause = "disabled_datetime is null")
public class ProductOptionGroup implements Serializable {
...
}
但是@Where 注释将不再起作用,因此禁用的product_option_groups 也从product.getProductProductOptionGroups().stream().map(o -> o.getId().getProductOptionGroup().collect(Collectors.toList()) 中选择。如何解决?
【问题讨论】:
标签: spring-boot hibernate jpa spring-data-jpa soft-delete