У меня есть объекты A -> C <- B, в типичном соотношении MxN, где C имеют составной PK. Проблема в том, что независимо от определенного @BatchSize код: </p>
repository.findAllById(aIds).forEach(e->e.getCs().stream().map(f->f.getPk().getB()).collect(Collectors.toList()));
будет весело go в дБ для каждой отдельной ассоциации. (приведенный выше код иллюстративный, может содержать опечатку; пожалуйста, просто учтите, что при каждом совпадении e
происходит совпадение, но да, при преобразовании используются потоки). Это почему? cs
равно oneToMany
, таким образом, ленив, и указано @BatchSize
. Все A
экземпляры загружаются перед любым доступом к ленивым ассоциациям. Таким образом, в момент первого доступа должны быть видимые кандидаты для пакетной загрузки, однако он загружается 1 на 1.
Что может быть не так?
внутри A:
@BatchSize(size = 500)
@Setter(AccessLevel.NONE)
@Builder.Default
@OneToMany(mappedBy = "a", orphanRemoval = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JsonManagedReference
private List<C> cs = new LinkedList<>();
внутри C:
@EmbeddedId
private PK pk;
@ManyToOne
@JoinColumn(name = "a")
@MapsId("a")
@EqualsAndHashCode.Exclude
@JsonBackReference
@Type(type="uuid-char")
private A a;
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
@Embeddable
@EqualsAndHashCode
public static class PK implements Serializable {
@Type(type="uuid-char")
private UUID a;
private String b;
}