Quarkus 延迟初始化

Posted

技术标签:

【中文标题】Quarkus 延迟初始化【英文标题】:Quarkus lazy initialize 【发布时间】:2020-10-08 14:23:12 【问题描述】:

每当我尝试使用 rest 方法返回所有记录时,我都会收到以下错误。

错误:

内部服务器错误 错误处理 e6059ae8-5970-4ac2-a1fa-7325768944bb-1, org.jboss.resteasy.spi.UnhandledException: javax.ws.rs.ProcessingException: RESTEASY008205: JSON Binding serialization error javax.json.bind.JsonbException: Unable to serialize property model.Board 中的“任务”

org.hibernate.LazyInitializationException: 无法执行请求的延迟初始化 [model.Board.task] - 没有会话并且设置不允许在会话之外加载

第一个模型

@Entity
public class Task

    @Id
    @Column(name = "TaskID")
    public Long taskId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "BoardID")
    public Board board;

    @Column(name = "Title")
    public String title;

    @Column(name = "Description", length = 1000)
    public String description;

第二个模型

@Entity
public class Board

    @Id
    @Column(name = "BoardID")
    public Long boardId;

    @OneToMany(mappedBy = "board")
    public List<Task> task = new ArrayList<>();;

    @Column(name = "Title")
    public String title;

    @Column(name = "Position")
    @NotNull
    public int position;

存储库:

@ApplicationScoped
@Transactional
public class BoardRepository implements PanacheRepository<Board> 

示例 REST 方法

@Transactional
@ApplicationScoped
public class ExampleResource 

    @Inject
    BoardRepository boardRepository;

    @Inject
    TaskRepository taskRepository;

    @GET
    @Transactional
    public List<Board> getAll() 
        return boardRepository.listAll();
    

【问题讨论】:

【参考方案1】:

问题是,在 JSON 序列化期间,它尝试序列化 task 列表,该列表具有对 Board 的反向引用,并且该图中的某些内容可能未初始化。此外,序列化可能会导致无法直接在 JSON 中建模的循环,因此您必须以某种方式解决此问题。

使用 @JsonIgnore 从 JSON 序列化中排除字段 使用 DTO,最好使用 Blaze-Persistence Entity-Views 以获得最佳性能,它具有 Quarkus integration,它只模拟您真正想要公开的状态子集

【讨论】:

以上是关于Quarkus 延迟初始化的主要内容,如果未能解决你的问题,请参考以下文章

延迟初始化中的 双重检查模式 和 延迟占位类模式 你都用对了吗?

延迟初始化

休眠延迟加载不适用于 Spring Boot => 无法延迟初始化角色集合无法初始化代理 - 无会话

多线程场景下延迟初始化的策略

双重检查锁定与延迟初始化

为啥 RelayCommands 通常使用延迟初始化?