Проект JavaSE JPA сохраняется на объекте ManyToOne, который выдает «значение идентичного идентификатора, уже связанное в сеансе» - PullRequest
0 голосов
/ 07 июля 2019

Я пытался просмотреть почти 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'
...