当前位置: 首页 > 面试题库 >

在JPA惰性列表上流

单于奇略
2023-03-14
问题内容

我的JPA实体具有如下列表:

@OneToMany(mappedBy = "scadaElement", orphanRemoval = true)
private List<ElementParameter> elementParameters;

和地图形式ElementParameter

@ManyToOne
@JoinColumn(name = "SCADAELEMENT_ID")
ScadaElement scadaElement;

当我获得带有elementParameters列表的实体并在其上执行流时,即使我使用.size()触发列表,但是当我使用for循环执行相同操作时,它也无济于事。

System.out.println("elements size: " + s.getElementParameters().size());
s.getElementParameters()
            .stream()
            .forEach(
                    a -> { 
                        System.out.println("elementId: " + a.getId());
                    }
            );

有什么解决方案可以使该流工作?我使用html" target="_blank">eclipselink作为JPA提供程序。


问题答案:

显然,您是指此问题。这些使用从实际实现(此处Vector)继承的反模式的懒惰列表无法适应基类的发展。请注意,取决于如何实现反模式,有两种可能的结果

  • 如果延迟填充的列表在第一次使用时填充自身(继承状态的术语),则在首次访问触发器属性后,新的继承方法将开始工作
  • 但是,如果列表覆盖了所有访问器方法以强制委派给另一个实现,而又不更新基类的状态,则即使已填充列表(从列表中填充),未被覆盖的基类的方法也将永远无法开始工作。子类的观点)

显然,第二种情况适用于您。触发列表填充不会使继承的forEach方法起作用。请注意,此处通过配置关闭惰性填充可能是更简单的解决方案。

对我而言,最干净的解决方案是,如果现在IndirectList继承AbstractListCollection Collection
API并遵循Collection
API标准,则将近二十年Vector(我应该提一下JPA实际上是多少?)。不幸的是,开发人员并没有走这条路。相反,通过创建另一个从该类继承的类来最大化反模式,该类已经从非继承设计类继承而来。该类重写Java
8中引入的方法,并且可能在下一Java版本中获得另一个子类。


因此,好消息是,开发者希望每一个List是一个Vector没有拿定主意,但坏消息是这是行不通的,因为有时候,你会不会使用JPA
2.6得到扩展的Java 8特定版本。但显然,JPA 2.7可以使用。

因此,您可以得出一些替代解决方案:

  • 关闭懒惰的人群
  • 坚持使用Java 7
  • 等待JPA 2.7
  • 刚才复制的集合,例如
    List<ElementParameter> workList=new ArrayList<>(elementParameters);
    workList将支持所有采集与流操作


 类似资料:
  • 我有一个简单的查询很好地工作了一段时间,现在我将代码中的一些内容改为: (hibernate.cfg.xml) 和以下代码: 提交后,result对象不会加载列表(即从开始) 如果我执行在提交前,它会保持加载状态,而且,如果我使用它工作得很好。(但这不是它应该如何工作(让它在使用时打开并加载),createAlias应该一如既往地正常工作) 看起来DetachedCriteria的createAl

  • 问题内容: 我想创建自己的集合,该集合具有python list的所有属性,并且还知道如何将自身保存到数据库中或从数据库中加载。我也想使负载隐式和惰性,因为在列表创建时它不会发生,而是等到第一次使用时才发生。 有没有一种单一的方法,我可以覆盖上加载任何列表属性(如第一次使用清单,,而不必重写他们… …等)? 问题答案: 不,没有。

  • 问题内容: 好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用惰性初始化(这很明显)。因此,请想象以下类: 在我的主类中,我将未初始化的具有“ type”属性的人称为“波纹管”: 因此,我从数据库中获得了一个简单的Person对象,并在控制台上打印了person类型。在这一刻,代理CGLIB可以发挥作用,并且可以发挥作用,一切正常。 但是,我在这里提出我的问题: 1-当我请

  • 当然,这些列表有setter和getter。现在我想实现以用户身份不参加这些事件的可能性。因此,我尝试了以下方法: 我得到的例外情况如下: 尽管我使用了一些方法来确保执行惰性提取:

  • 我谷歌了很多,这是真的奇怪的Spring Boot(最新版本)可能没有懒惰加载是不工作的。以下是我的代码片段: 我的资源: 我的服务: 编辑2: 对于规范构建,我有: