Дублирующиеся данные в дочернем объекте - PullRequest
0 голосов
/ 21 марта 2019

я использую весеннюю загрузку 2.1 с пружинными данными jpa и hibernate

@Entity
public class Factories{
    @Id
    @SequenceGenerator(name = "factories_id_seq", sequenceName = "factories_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "factories_id_seq")
    private Integer id;

    @OneToMany(mappedBy = "factory", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<Machines> machines = new ArrayList<>();

    @ElementCollection(fetch = FetchType.LAZY)
    private Set<String> emails = new HashSet<>();

}   

В моей машинной сущности у меня есть метод equals и hashCode.

Запрос выполнен

SELECT distinct f from Factories f "
        + "LEFT JOIN FETCH f.machines "
        + "Left JOIN FETCH f.emails "
        + "Left JOIN FETCH f.cities "
        + "where f.id=:id

Я пробовал с отчетливым и без

Моя фабрика с идентификатором 1

есть 3 машины и 3 электронных письма

Вместо загрузки фабрики с 3 машинами и 3 электронными письмами, я получаю 9 машин. В базе данных всего 3.

Это похоже на декартово произведение.

Любая идея

1 Ответ

0 голосов
/ 21 марта 2019

Вы только что решили проблему MultipleBagFetch с Hibernate или любым JPA.И да, вы правы, то, что вы видите, является результатом Cartesian Product, но это обычное дело.Есть больше сообщений на SO, обсуждающих то же самое.Чтобы решить вашу проблему, у вас есть 3 варианта:

a) Разделить выборку на два запроса JOIN

SELECT distinct f from Factories f "
        + "LEFT JOIN FETCH f.machines "
        + "Left JOIN FETCH f.cities "
        + "where f.id=:id

SELECT distinct f from Factories f "
        + "LEFT JOIN FETCH f.machines "
        + "Left JOIN FETCH f.emails "
        + "where f.id=:id

b) Использовать специальные решения Hibernate:

@LazyCollection(LazyCollectionOption.FALSE)

ИЛИ

@Fetch(value = FetchMode.SUBSELECT)

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...