Я пытался просмотреть почти 10 предложенных постов, прежде чем публиковать этот вопрос, но ни один из них не касался этого же запроса.
У меня есть однонаправленная ассоциация ManyToOne, от объекта Address до объекта Country.Я использую управляемый приложением Entity Manager, базу данных H2 Hibernate 5.3 (только с аннотациями JPA).
Из множества сущностей в моем графе объектов ниже приведены три соответствующие сущности, о которых идет речь.
public class Address {
@Id
@GeneratedValue
private long id;
.....
......
......
@ManyToOne(optional = false, cascade = {CascadeType.PERSIST})
@JoinColumn(name="COUNTRY_ID")
private Country country;
}
public class Country {
@Id
private int id;
.....
......
......
@ManyToOne(cascade = {CascadeType.PERSIST})
public Continent continent;
}
Entity
@Table(name = "CONTINENTS")
public class Continent {
@Id
private int id;
.....
......
......
}
@Entity
public class Person {
@Id
@GeneratedValue
private long id;
.....
......
......
@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.DETACH})
private Address permanentAddress;
}
Я создал список «временных объектов персоны», затем установил один и тот же «временный объект адреса» в некоторых персонах.
Я фактически создал много «временных объектов адреса» и добавил один «временный объект страны»ко всем объектам Address.
Но когда я пытаюсь сохранить свой граф объектов, я получаю следующую ошибку.
javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.mps.jpa.entities.Country#0]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:123)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:831)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:791)
at org.hibernate.engine.spi.CascadingActions$7.cascade(CascadingActions.java:298)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:490)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:415)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:216)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:149)
at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:428)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:266)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:196)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:139)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:192)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:824)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:791)
at org.hibernate.engine.spi.CascadingActions$7.cascade(CascadingActions.java:298)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:490)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:415)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:216)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:149)
at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:428)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:266)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:196)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:139)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:192)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:62)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:800)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:785)
at com.mps.jpa.App.lambda$0(App.java:21)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at com.mps.jpa.App.main(App.java:21)
Jul 07, 2019 12:28:05 PM org.hibernate.tool.schema.internal.SchemaDropperImpl$DelayedDropActionImpl perform
INFO: HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down'