【问题标题】:Detaching Entities in EclipseLink在 EclipseLink 中分离实体
【发布时间】: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


【解决方案1】:

Detach for EclipseLink 被认为仅用于停止跟踪更改,出于性能原因将其从 EM 中拉出。根据 JPA 规范访问未获取的属性会导致异常;早期似乎没有用户真正要求的东西,因此没有实施该行为。如果您想要这种行为,请提出要求。

任何人都可以在其访问器中检查惰性属性的获取状态并引发应用程序异常。这将需要修改 EclipseLink 通过编织生成的增强型 Java 代码以访问惰性属性。

另一种解决方案可能是使用constructor query。构造函数查询不是返回托管实体对象,而是将选择值传递给 java 构造函数,因此只包括在查询中获取的数据。这些对象不是实体,因此是完全分离的,可以构建任何 java 对象,甚至是现有的 Entity 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2023-04-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    相关资源
    最近更新 更多