子对象中的数据重复

时间:2019-03-21 15:25:16

标签: hibernate spring-boot spring-data-jpa

我将spring boot 2.1与spring数据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

我尝试了不一样的情况

我的ID为1的工厂

有3台机器和3封电子邮件

我没有为工厂装载3台机器和3封电子邮件,而是9台机器。在数据库中只有3。

这就像笛卡尔积一样。

任何想法

1 个答案:

答案 0 :(得分:0)

您刚刚遇到了Hibernate或任何JPA的<p-accordion [multiple]="true"> <p-accordionTab header="Accordion Tab 1" [selected]="true"> <ul> <li>Colors</li> <li>Cities</li> <li>Facility</li> <li>Hobbies</li> </ul> </p-accordionTab> <p-accordionTab header="Accordion Tab 2" [selected]="true"> <ul> <li>Students</li> </ul> </p-accordionTab> <p-accordionTab header="Accordion Tab 3" [selected]="true"> <ul> <li>Music</li> </ul> </p-accordionTab> </p-accordion> 问题。是的,您是对的,您看到的是MultipleBagFetch的结果,但这与往常一样。关于SO的讨论也更多。要解决您的问题,您可以使用以下三种选择:

a)将抓取操作分成两个JOIN查询

Cartesian Product

b)使用特定于Hibernate的解决方案:

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

OR

@LazyCollection(LazyCollectionOption.FALSE)

Reference