gpt4 book ai didi

java - 如何合并具有空列表的实体?

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:44 25 4
gpt4 key购买 nike

我有一个 @Entity,其 Set 默认为 null。当最初创建实体或在 @Transactional 方法中获取实体时更新实体时,一切正常。

但是:当我尝试合并一个分离的实体时,我收到了 HibernateException,即使我根本没有接触子 Set:

@Entity
public class MyEntity {
@OneToMany(mappedBy = "myEntity", cascade = CascadeType.ALL, orphanRemoval = true)
@OnDelete(action = OnDeleteAction.CASCADE)
private Set<ChildEntity> child = null; //by default

public Set<ChildEntity> getChild() {
if (child == null) {
child = new LinkedHashSet<>();
}
return child;
}
}

我可以保存实体而无需初始化子列表:

@Transactional
public MyEntity create() {
MyEntity entity = new MyEntity();
//set some params (but not the child object)
dao.save(entity);
return entity; //OK though child=null
}

但是以下合并失败:

MyEntity entity = service.create(); //see above
rsp = runLongTask();
updateSomeParams(entity, rsp); //not touching child
dao.merge(entity); //throws HibernateException

结果:

Caused by: org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: MyEntity.child
at org.hibernate.engine.internal.Collections.processDereferencedCollection(Collections.java:114) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.engine.internal.Collections.processUnreachableCollection(Collections.java:67) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.AbstractFlushingEventListener.flushCollections(AbstractFlushingEventListener.java:258) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:103) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:55) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ~[spring-orm-4.2.6.RELEASE.jar:4.2.6.RELEASE]
... 33 more

为什么我无法将实体与 null 列表合并?如何防止异常发生?

最佳答案

自从您创建一个新的子项 (child = new LinkedHashSet<>();) 后,每次 child 为 null 时,您可以在创建方法中尝试以下操作

@Transactional
public MyEntity create() {
MyEntity entity = new MyEntity();
//set some params (but not the child object)
entity.getChild().clear(); //Remove all of the elements from this set
dao.save(entity);
return entity; //OK though child=null
}

基本上,如果您不打算设置集合,请从集合中删除所有元素

关于java - 如何合并具有空列表的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37563166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com