Есть ли способ отфильтровать мягко удаленную ассоциацию «многие ко многим» с использованием @OneToMany
и @ManyToOne
через промежуточный объект (таблицу сопоставления)?
product
и product_option_group
находятся в отношении N:M. Я реализую мягкое удаление, используя столбец disabled_datetime
, и хочу отфильтровать набор ProductOptionGroup
из объекта Product
. В этом сообщении для этого используются @ManyToMany
и @Where
. Я последовал за ним, и это сработало (отфильтрованы отключенные product_option_group
). Обратите внимание @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_group
. Как это решить?