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 延迟初始化的主要内容,如果未能解决你的问题,请参考以下文章
延迟初始化中的 双重检查模式 和 延迟占位类模式 你都用对了吗?