Hibernate:由于集合的标识符为空,在entityManager.merge()上断言失败

问题描述 投票:0回答:1

我正在使用 Java 中的 Hibernate 进行工作,并遇到了与entityManager.merge() 操作相关的问题。我有以下实体类:

@Entity
@Table(name="manufacturingitem")
public class ManufacturingItem extends AbstractDocumentItem {

    private long parentId;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "parentId")
    private List<ManufacturingItem> subItems = new ArrayList<>();
}

parentId 的主要用例是为我的库存管理系统中的制造项目建立递归物料清单。

当我尝试使用entityManager.persist()添加ManufacturingItem时,它按预期工作并且该项目被保存到数据库中。但是,当我尝试使用entityManager.merge()时,遇到以下错误:

发生断言失败(这可能表明 Hibernate 中存在错误,但更可能是由于会话的不安全使用):org.hibernate.AssertionFailure:角色集合的空标识符(document.disposal.manufacturing.model.ManufacturingItem。子项目) org.hibernate.AssertionFailure:角色集合的空标识符(document.disposal.manufacturing.model.ManufacturingItem.subItems) 在 org.hibernate.engine.spi.CollectionKey.(CollectionKey.java:47) 在 org.hibernate.engine.spi.CollectionKey.(CollectionKey.java:32) 在 org.hibernate.event.internal.WrapVisitor.processArrayOrNewCollection(WrapVisitor.java:126) 在 org.hibernate.event.internal.WrapVisitor.processCollection(WrapVisitor.java:74) 在 org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:92) 在 org.hibernate.event.internal.WrapVisitor.processValue(WrapVisitor.java:161) 在 org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:53) 在 org.hibernate.event.internal.AbstractSaveEventListener.visitCollectionsBeforeSave(AbstractSaveEventListener.java:404) 在 org.hibernate.event.internal.AbstractSaveEventListener.cloneAndSubstituteValues(AbstractSaveEventListener.java:329) 在 org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:278) 在 org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:180) 在 org.hibernate.event.internal.AbstractSaveEventListener.saveWithGenerateId(AbstractSaveEventListener.java:140) 在 org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:314) 在 org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:233) 在org.hibernate.event.internal.DefaultMergeEventListener.merge(DefaultMergeEventListener.java:152) 在org.hibernate.event.internal.DefaultMergeEventListener.doMerge(DefaultMergeEventListener.java:142) 在org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:122) 在 org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:138) 在 org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:869) 在 org.hibernate.internal.SessionImpl.merge(SessionImpl.java:840) 在 org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:253) 在 org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:243) 在 org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:513) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:434) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220) 在 org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:547) 在 org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:477) 在 org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:437) 在 org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220) 在 org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153) 在org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:571) 在org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:354) 在org.hibernate.event.internal.DefaultMergeEventListener.merge(DefaultMergeEventListener.java:149) 在org.hibernate.event.internal.DefaultMergeEventListener.doMerge(DefaultMergeEventListener.java:142) 在org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:122) 在 org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:80) 在org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) 在 org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:848) 在 org.hibernate.internal.SessionImpl.merge(SessionImpl.java:834)

从错误消息来看,似乎存在与具有空标识符的 subItems 集合相关的问题。但是,我不确定如何解决这个问题。

我尝试更改FetchType和cascadeType。

有人遇到过类似的问题,或者对可能导致此错误的原因以及如何解决有任何见解吗?

java hibernate entitymanager
1个回答
0
投票

您找到解决方案了吗?有任何更新吗?

© www.soinside.com 2019 - 2024. All rights reserved.