在EclipseLink中分离实体

时间:2018-05-15 15:18:12

标签: java jpa java-ee eclipselink detach

我在JPA 2.1 EclipseLink中分离实体时遇到问题。

我有一个JavaEE应用程序,其中包含一些将所有关系设置为延迟加载的实体。我在所有数据库查询中使用join fetch,以便仅获取我需要的对象。我使用Jackson(FasterXml)将对象转换为JSON(对于JAX-RS等)

每当我从数据库中选择任何实体时,我会在返回之前分离该实体,以避免在Jackson将该对象转换为JSON时在数据库上运行太多查询(因为此转换会调用正在转换的实体中的所有getter) 。

我的问题是分离不起作用,当我查看JPA日志时,我看到实体的所有成员都被转换并被数据库上的查询加载。当Jackson将对象转换为JSON时会发生这种情况,我的猜测是因为Jackson在转换对象时调用了getter。为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:0)

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

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

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