[英]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.