即使对于FETCHMODE.JOIN,Hibernate也会生成多个选择查询

时间:2014-08-05 11:08:45

标签: hibernate jpa fetch

我根据提供的父ID获取多个选择查询(' 1'用于父级和' n'选择查询n个子记录),同时获取子父级实体。

为了解决这个问题,我将@Fetch(FetchMode.JOIN)放在父实体和子实体上。但这没有任何帮助。我使用的父(MessageDetails)和子(MessageHits)实体如下所示

 @Entity
    @Table(name = "Scantit_msg_dtls")
    public class ScanitMessageDetails implements DomainObject{
 private String icgreference;
 private Long messageId;
private Set<ScanitMessageHit> scanitMessageHits = new HashSet<ScanitMessageHit>();

     @Id
@Column(name = "ICGREFERENCE")
public String getIcgreference() {
    return icgreference;
}

        @Column(name = "PK_MRS_MESSAGE")
    public Long getMessageId() {
        return messageId;
    }

@OneToMany(mappedBy="scanitMessageDetails", orphanRemoval = true, 
    cascade = { javax.persistence.CascadeType.ALL }, fetch=FetchType.EAGER)

        @Fetch(FetchMode.JOIN)
    public Set<ScanitMessageHit> getScanitMessageHits() {
        return scanitMessageHits;
    }

     }

并且子实体是

@Entity
@Table(name = "Scanit_msg_hit")

public class ScanitMessageHit implements DomainObject {

    private static final long serialVersionUID = 1L;
    private Long hitId;
private ScanitMessageDetails scanitMessageDetails;

@Id
    @Column(name = "PK_MRS_HIT")
    public Long getHitId() {
        return hitId;
    }

    public void setHitId(Long hitId) {
        this.hitId = hitId;
    }

    @ManyToOne(cascade = { javax.persistence.CascadeType.ALL }, fetch=FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    @JoinColumn(name="FK_MRS_MESSAGE",referencedColumnName="PK_MRS_MESSAGE")
    public ScanitMessageDetails getScanitMessageDetails() {
        return scanitMessageDetails;
    }

    public void setScanitMessageDetails(ScanitMessageDetails scanitMessageDetails) {
        this.scanitMessageDetails = scanitMessageDetails;
}
}

虽然我正在使用连接提取策略,但在获取数据时仍然会获得多个(n + 1)个选择查询。这妨碍了应用程序的性能。

如果我在这里犯了任何错误,或者有任何其他方法可以解决这个问题,那么我会非常抱歉。 真的很感激,如果你能帮助我,那就提前了

仙人

1 个答案:

答案 0 :(得分:4)

您可以在从ScanitMessageHit类中删除提取策略后尝试相同的操作 请删除 fetch = FetchType.EAGER 希望完全有效。 请更改您的映射如下。

@OneToMany(mappedBy="scanitMessageDetails", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<ScanitMessageHit> getScanitMessageHits() {
    return scanitMessageHits;
}

@ManyToOne
@JoinColumn(name="FK_MRS_MESSAGE",referencedColumnName="PK_MRS_MESSAGE")
    public ScanitMessageDetails getScanitMessageDetails() {
    return scanitMessageDetails;
}