JPA/Гибернация нескольких представлений одной и той же сущности (OneToMany)

#java #spring-boot #hibernate #jpa

Вопрос:

Я использую SpringBoot с режимом гибернации 5.4.32.

У меня есть две сущности.

powwowjournalentryобъектность

 @Entity @Table(name = "powwowjournalentry")   @Id  @Column(name = "unique_reference")  private String uniqueReference;   @OneToMany(cascade={CascadeType.ALL}, mappedBy="powWowJournalEntryObject", fetch=FetchType.EAGER)  private Setlt;PowWowSourceDocumentEntitygt; sourceDocumentList = new HashSetlt;gt;();  

powwowsourcedocumentity Документальное подтверждение

 @Entity @Table(name = "powwowsourcedocument") public class PowWowSourceDocumentEntity {   @Id  @Column(name = "doc_id")  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long docId;   @ManyToOne  @JoinColumn(name="journal_id", nullable=false)  @OnDelete(action = OnDeleteAction.CASCADE)  private PowWowJournalEntryObjectEntity powWowJournalEntryObject;  

Как вы можете видеть, объект powwowjournalentryobject может иметь множество объектов PowWowSourceDocumentEntity.

Когда я выполняю следующий код:

 public PowWowJournalEntryObjectEntity save(@ModelAttribute PowWowJournalEntryObjectEntity entity) {  entity.setCreateDate(new Date());   // if there are already documents, use the docIds of the existing invoices so that it updates them  Setlt;PowWowSourceDocumentEntitygt; sourceDocumentList = entity.getSourceDocumentList();  if (sourceDocumentList != null amp;amp; !sourceDocumentList.isEmpty()) {  Listlt;PowWowSourceDocumentEntitygt; existingSourceDocumentEntities = sourceDocumentDao.findByUniqueReference(entity.getUniqueReference());  for (PowWowSourceDocumentEntity existingSourceDocumentEntity : existingSourceDocumentEntities) {  for (PowWowSourceDocumentEntity sourceDocumentEntity : sourceDocumentList) {  if (existingSourceDocumentEntity.getFileName().equals(sourceDocumentEntity.getFileName()) amp;amp; existingSourceDocumentEntity.getType().equals(sourceDocumentEntity.getType())) {  sourceDocumentEntity.setDocId(existingSourceDocumentEntity.getDocId());  }  }  }  }   entityManager.clear();  //entityManager.merge(entity);   PowWowJournalEntryObjectEntity entitySaved = journalEntryRepository.save(entity);   return entitySaved; }  

Он получает следующее исключение:

java.lang.Исключение IllegalStateException: Несколько представлений одной и той же сущности [com.clubtravel.powwow.entities.Powwowsourcedocumentity#19233] объединяются. Отдельно: [com.clubtravel.powwow.сущности.powwowsourcedocumentity@7b2930f4]; Отдельно: [com.clubtravel.powwow.сущности.PowWowSourceDocumentEntity@154b5576] в org.hibernate.event.internal.EntityCopyNotAllowedObserver.entityCopyDetected(EntityCopyNotAllowedObserver.java:45) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.hibernate.event.internal.MergeContext.put(MergeContext.java:245) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.событие.внутреннее.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:322) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.событие.внутреннее.DefaultMergeEventListener.OnMerge(DefaultMergeEventListener.java:172) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.событие.служба.внутренняя.Список событий energroupimpl.fireEventOnEachListener(список событий energroupimpl.java:110) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.спящий режим.внутренний.SessionImpl.fireMerge(SessionImpl.java:813) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.internal.SessionImpl.merge(SessionImpl.java:786) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.engine.spi.каскадные действия$6.каскад(каскадные действия.java:261) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.engine.internal.Cascade.cascadeToOne(Каскад.java:499) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.спящий режим.двигатель.внутренний.Каскад.Каскадная ассоциация(Cascade.java:423) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.hibernate.engine.internal.Каскад.Каскадные свойства(Cascade.java:220) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.hibernate.engine.internal.Cascade.cascadeCollectionЭлементы(Cascade.java:532) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.engine.internal.Каскад.Каскадная коллекция(Cascade.java:463) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.спящий режим.двигатель.внутренний.Каскад.Каскадная ассоциация(Cascade.java:426) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.hibernate.engine.internal.Каскад.Каскадные свойства(Cascade.java:220) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.hibernate.engine.internal.Каскад.каскад(Cascade.java:153) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.hibernate.событие.внутреннее.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:519) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.спящий режим.событие.внутреннее.DefaultMergeEventListener.Сущность обнаружена(DefaultMergeEventListener.java:346) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.event.internal.DefaultMergeEventListener.OnMerge(DefaultMergeEventListener.java:172) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.событие.внутреннее.DefaultMergeEventListener.OnMerge(DefaultMergeEventListener.java:70) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.спящий режим.событие.служба.внутренняя.Список событий energroupimpl.fireEventOnEachListener(список событий energroupimpl.java:99) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:793) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final] в организации.hibernate.internal.SessionImpl.слияния(SessionImpl.в Java:780) ~[гибернации-ядро-5.4.32.Финал.баночка:5.4.32.Финал] в Java.база с JDK.внутренние.отражения.NativeMethodAccessorImpl.invoke0(собственный метод) ~[На:На] в Java.база с JDK.внутренние.отражения.NativeMethodAccessorImpl.командлет Invoke(NativeMethodAccessorImpl.Ява:62) ~[На:На] в Java.база/jdk.внутренний.отражение.Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:43) ~[na:na] в java.base/java.lang.reflect.Метод.вызов(Метод.java:566) ~[na:na]

I believe this happens when an entity is saved with the same values but a different hashcode.

Question

How do I resolve this?