簡體   English   中英

Hibernate:findAll 方法中的多對一獲取問題

[英]Hibernate: Many-to-One fetching issues in findAll method

在獲取具有多對一關系的對象列表時,我在使用 Hibernate 時遇到了問題。 您可以在下面找到實體和存儲庫文件。 你可以看到 Portofolio 對象有一個基准,它是一個 Portfolio 本身。

實體

@Entity
//@NamedEntityGraph(name = "Portfolio.benchmark", attributeNodes = @NamedAttributeNode("benchmark"))
@Table(name = "PORTFOLIOS")
public class Portfolio {

    ...

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "BENCHMARK_ID", insertable = false, updatable = false)
    private Portfolio benchmark;

    @Column(name = "BENCHMARK_ID")
    private Long benchmarkId;

    ....

}

存儲庫

@Repository
public interface PortfolioRepository extends CrudRepository<Portfolio, Long> {

    //@EntityGraph(value = "Portfolio.benchmark", type = EntityGraph.EntityGraphType.LOAD)
    //@Query("select portfolio from Portfolio portfolio left join fetch portfolio.benchmark where upper(portfolio.userName) = upper(:userName) ")
    List<Portfolio> findAllByUserNameIgnoreCase(String userName);

}

注釋代碼是我之前嘗試過但沒有奏效的方法。

情景

我有 3 個具有以下 ID 的投資組合; 比方說:1, 2, 3

投資組合 1 以投資組合 ID 2 作為基准,投資組合 2 以投資組合 ID 3 作為基准。

在執行存儲庫方法findAllByUserNameIgnoreCase ,我需要有一個該用戶的投資組合列表,以及每個基准的信息。

Portfolio 1 的信息已正確加載,但對於 porfolio 2,未加載基准。

這是響應的表示形式:

(Portfolio@20661) = {portfolioId=1, benchmarkId=2, benchmark@20680 = {portfolioId=2, benchmarkId=3, benchmark = null}}
(Portfolio@20680) = Portfolio{portfolioId=2, benchmarkId=3, benchmark = null}
(Portfolio@20698) = Portfolio{portfolioId=3, benchmarkId=null, benchmark = null}

可以看到,投資組合2的Java對象引用為20680,在投資組合1的benchmark屬性中也是一樣的,是正確的。

我不明白,為什么對於 Portfolio 1,獲取了基准關系,對於 Portfolio 2,卻沒有獲取基准關系。

我嘗試配置EntityGraph但它沒有任何效果。

我究竟做錯了什么? 調用findAll方法時如何解決所有基准參考?

我發現了問題,通常是在屏幕和椅子之間。

問題不在實體也不在存儲庫中。 它是一個映射到 DTO 的映射器,它正確地設置了與 null 的關系。

對此我深表歉意,非常感謝您對我的問題的關注。

干杯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM