避免在Eclipselink

时间:2016-11-03 17:18:52

标签: java jpa eclipselink

我在父母和孩子之间有一个简单的OneToMany关系。

父:

@OneToMany(mappedBy = "parent", orphanRemoval = true, cascade = CascadeType.ALL)
private List<Child> children = new ArrayList<>();

子:

@ManyToOne(optional = false)
@JoinColumn(name = "PARENT_ID", nullable = false)
private Parent parent;

因为父母可以拥有大量孩子,所以我想利用Lazy Instantiation of Indirect Collections

  

IndirectList和IndirectSet可以配置为在添加和删除列表时不从数据库中实例化列表。 IndirectList默认为此行为。当设置为true时,将设置与此TransparentIndirection关联的集合,以便不实例化添加和删除。 IndirectSet的此设置的弱点是,当未实例化集合时,如果添加了重复元素,则在提交时间之前不会检测到它。

由于OneToMany的默认FetchType是LAZY而我使用List for my Collection,因此从数据库加载父级会导致IndirectList用于关系。只要我向该父项添加另一个子项,我就可以看到执行该父项子项的选择查询。

如何更改? 我使用的是Eclipselink 2.6.4(org.eclipse.persistence:eclipselink:2.6.4)。

我还尝试使用DescriptorCustomizer在我的关系上调用org.eclipse.persistence.mappings.CollectionMapping.setUseLazyInstantiationForIndirectCollection(Boolean),但这似乎完全没有效果。

调试方法org.eclipse.persistence.indirection.IndirectList.add(E)后,我看到第206行的org.eclipse.persistence.indirection.IndirectList.shouldAvoidInstantiation()方法调用返回false,因为第1007行的org.eclipse.persistence.indirection.IndirectList._persistence_getPropertyChangeListener()返回null而null不是instanceof AttributeChangeListener。因此,关系将在第216行由org.eclipse.persistence.indirection.IndirectList.getDelegate()实例化。

对我而言,这似乎是一个错误,但我对此实现还不够了解。

1 个答案:

答案 0 :(得分:2)

在进行修改时,需要更改跟踪以支持不实例化延迟集合。使用编织时启用更改跟踪,如下所述:https://www.eclipse.org/eclipselink/documentation/2.5/concepts/app_dev007.htm