我在获取具有manytone关系的对象列表时遇到了hibernate问题。您可以在下面找到实体和存储库文件。您可以看到portofolio对象有一个基准,它本身就是一个投资组合。
实体
@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
,我需要为该用户提供一个投资组合列表,其中包含每个基准的信息。
组合1的信息加载正确,但是对于组合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}
如我们所见,porfolio2有java对象引用20680。投资组合1的基准属性是相同的,是正确的。
我不明白,为什么对于投资组合1,基准关系被提取,对于投资组合2,基准关系不被提取。
我试图配置entitygraph,但没有任何效果。
我做错什么了?调用 findAll
方法?
1条答案
按热度按时间xxls0lw81#
我发现了问题,特别是在屏幕和椅子之间。
问题不在实体或存储库中。它是dto的Map器,在属性上设置了一个空的关系。
对此我很抱歉,非常感谢你对我问题的关注。
干杯