【问题标题】:Spring Data JPA + Bytecode EnhancementSpring Data JPA + 字节码增强
【发布时间】:2020-10-24 22:54:55
【问题描述】:

是否可以使用在父实体类中使用 @LazyToOne 、 @LazyGroup 设置为惰性并启用字节码增强的 JPA 接口(实体图)急切地加载 @*ToOne 属性?我正在尝试使用实体图急切地加载此类属性,但是当查询父实体时,它正在为此类 @*ToOne 属性触发另一个查询。

尝试使用另一种方法来覆盖实体类中的静态提取类型,包括添加了字节码增强功能的 @LazyToOne。

使用 Spring 5.1.3、Spring JPA 2.2、Hibernate 5.4.19

更新:数据 JPA 正在按预期工作,我可以看到我试图急切地获取的属性的连接,但是这些惰性属性没有被连接查询响应初始化,并且休眠导致每个查询都引用了已注释的属性使用 @LazyToOneOption.NO_PROXY 并且已经在我的存储库中使用实体图急切地获取。

我如何避免第二次选择,因为我急切地从 JPA 存储库中的实体图中获取了该数据??

任何帮助将不胜感激。

【问题讨论】:

  • 你可能想看看hibernate的FetchProfile。
  • @Grim 请阅读更新。

标签: spring hibernate jpa entitygraph byte-code-enhancement


【解决方案1】:

实体图就像 Hibernate 提取配置文件一样适用,无论您在关联上有什么注释。如果没有,则可能是 Spring Data 甚至 Hibernate 中存在错误。最好创建一个新的 JIRA issue 并使用 test case 重现问题。

话虽如此,我认为这是Blaze-Persistence Entity Views 的完美用例。

我创建了该库以允许在 JPA 模型和自定义接口或抽象类定义模型之间轻松映射,例如 Spring Data Projections on steroids。这个想法是您按照自己喜欢的方式定义目标结构(域模型),并通过 JPQL 表达式将属性(getter)映射到实体模型。

使用 Blaze-Persistence Entity-Views 的示例 DTO 模型可能如下所示:

@EntityView(User.class)
public interface UserDto {
    @IdMapping
    Long getId();
    String getName();
    Set<RoleDto> getRoles();

    @EntityView(Role.class)
    interface RoleDto {
        @IdMapping
        Long getId();
        String getName();
    }

    // Other mappings
}

查询是将实体视图应用于查询的问题,最简单的就是通过 id 进行查询。

UserDto a = entityViewManager.find(entityManager, UserDto.class, id);

Spring Data 集成让您可以像使用 Spring Data Projections 一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

【讨论】:

  • 不确定你的设置是什么,但如果实体已经作为代理与实体管理器关联,加入获取它或使用实体图对你没有帮助,就像 Hibernate 当前所做的那样不合并状态。
猜你喜欢
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 2017-07-17
  • 1970-01-01
相关资源
最近更新 更多