1

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

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

使用 Spring 5.1.3、Spring JPA 2.2、Hibernate 5.4.19

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

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

任何帮助将不胜感激。

4

1 回答 1

0

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

话虽如此,我认为这是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

于 2020-10-26T08:55:00.970 回答