#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?