hibernate - 无法让 FetchType.EAGER 与 @ElementCollection 一起使用
问题描述
我在变量上有以下注释:
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "question_translation",
foreignKey = @ForeignKey(value = ConstraintMode.CONSTRAINT, name = "fk_question_translation_question"),
joinColumns = @JoinColumn(name = "question_id"))
@MapKeyColumn(name = "language", nullable = false)
@MapKeyEnumerated(EnumType.STRING)
@Column(name = "translation", nullable = false)
private Map<Language, String> translations;
当我在translations.get(Language.EN)
外面做时,@Transactional
我得到:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
版本:
spring boot: <version>2.0.3.RELEASE</version>
<hibernate.version>5.2.17.Final</hibernate.version>
<hibernate-jpa-2.1-api.version>1.0.2.Final</hibernate-jpa-2.1-api.version>
我错过了什么?
编辑:
进一步搜索后,我认为问题是因为我使用 spring-data 及其存储库......他们似乎忽略了 fetch 类型......
解决方案
我知道出了什么问题:spring-data 会忽略获取类型,直到您在存储库中的方法和实体上都指定了 @EntityGraph 注释。
该死的部分是您不能覆盖 JpaRepository 中的方法并将@EntityGraph 添加到它,因为它被忽略了。
您需要在存储库中编写自己的方法...例如:
@EntityGraph(value = "graphNameDefinedOnEntity", type = EntityGraph.EntityGraphType.LOAD)
QuestionEntity getById(Long id);
这与getOne(Long id)
提供的JpaRepository
. 非常混乱。所以最好只命名它并使用注释getByIdEagerlyLoaded
自己编写查询@Query
推荐阅读
- ios - 在 WKWebview 中突出显示文本
- reactjs - 多选不起作用,只给出最后点击的值
- javascript - 使用 Jackson ObjectMapper 将 Java HashMap 序列化为 JSON
- sql-server - SQL Server 将如何执行这个 WITH 子句
- html - 链接到 bootstrap 4 modal nav 的部分
- javascript - 如何为多次加载的 React Native 应用程序强制正常日志记录?
- php - 如何在 PHP 扩展中的 PHP 请求之间共享 C++ 静态变量
- pandas - 如何绘制只有工作日的时间序列而不在缺失的日期之间跳转
- javascript - 如何在不分叉的情况下重用现有的 Web UI 项目?
- c# - .NET Web API BadRequest() 方法是否等同于 Request.CreateErrorResponse(...)