【发布时间】:2018-10-25 12:00:39
【问题描述】:
我在 JPA 2.1 EclipseLink 中分离实体时遇到问题。
我有一个 JavaEE 应用程序,其中一些实体的所有关系都设置为延迟加载。我在所有数据库查询中使用 join fetch 以便仅获取我需要的对象。我使用 Jackson (FasterXml) 将对象转换为 JSON(用于 JAX-RS 等)
每当我从数据库中选择任何实体时,我都会在返回之前分离该实体,以避免在 Jackson 将该对象转换为 JSON 时在数据库上运行太多查询(因为此转换调用了正在转换的实体中的所有 getter) .
我的问题是分离不起作用,当我查看 JPA 日志时,我看到实体的所有成员都被转换并被数据库上的查询加载。当 Jackson 将对象转换为 JSON 时会发生这种情况,我的猜测是这是因为 Jackson 在转换对象时调用了 getter。为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
未获取的惰性属性与 null 不同,因此如果您在上下文之外访问它们,则会出现异常。 EclipseLink 将允许在上下文中获取属性,因此您将希望实现自己的访问器方法来检查是否获取了延迟属性以供 Jackson 使用,或者读取 java 对象而不是包装实体杰克逊使用的数据。见wiki.eclipse.org/EclipseLink/UserGuide/JPA/…
-
@Chris 实现我自己的访问器方法是什么意思?你的意思是在getter中检查属性是否是惰性的?另外我知道我可以选择 POJO,这将完全防止这个问题,但我不喜欢这个解决方案,所以我把它作为最后的手段。一些查询获取具有许多属性的对象并使用连接获取,因此如果我使用 new 运算符进行选择会很麻烦并且看起来令人不安
-
@Chris 我认为这是 EclipseLink 的一个严重缺陷。如果他们没有给我们提供分离实体的方法,那么他们必须至少提供一个“xx.xxx.EnableAutoFetching”属性来控制它。
标签: java jpa jakarta-ee eclipselink detach