Org.hibernate.PersistentObjectException: отдельный объект, переданный для сохранения при использовании hashMap для сохранения объектов

У меня есть класс Notification, который содержит объект messengerData:

public class Notification{

    @OneToOne(mappedBy = "messengerDataId")
    private MessengerData messengerData;
    ...
}

Класс MessengerData содержит карту ресурсов, это означает, что данные messengerdata содержат пары из них, поэтому я использую отношение один ко многим:

public class MessengerData{

        @OneToOne(mappedBy = "messengerData")
        private Notification notification;

        @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE },
                 fetch = FetchType.EAGER)
        @Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DETACH })
        @JoinTable(name = HemisTablesNames.MESSENGER_RESOURCES, joinColumns = @JoinColumn(name = "idResource"),
                 inverseJoinColumns = @JoinColumn(name = "messengerDataId"))

        private Map<String, Resource> resources = new HashMap<String, Resource>();
        ...

Класс Resource содержит карту <String, NotificationTextData>:

    @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE },
        fetch = FetchType.EAGER)
@Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DETACH })
@JoinTable(name = HemisTablesNames.MESSENGER_NOTIF_TEXT_DATA, joinColumns = @JoinColumn(name = "idNTD"),
        inverseJoinColumns = @JoinColumn(name = "idResource"))
private Map<String, NotificationTextData> textDatas;

Вот как я сохраняю объект:

EntityManager.persist(notification);
EntityManager.commitTransaction();

Моя проблема в том, что я получаю это исключение:

Couldn't save notification : org.hibernate.PersistentObjectException: detached entity passed to persist: com.ubiant.hemis.type.Notification

Может ли кто-нибудь помочь мне с этим?

Добавьте код, в котором вы сохраняете объект

Nikolai Shevchenko 26.09.2018 19:02

Я редактирую свой пост и добавляю, как я сохраняю объект, но не думаю, что эта проблема связана с этим.

Aymen Ragoubi 27.09.2018 10:40

Аймен, объект, который вы пытаетесь сохранить (notification), откуда он взят?

Nikolai Shevchenko 27.09.2018 11:05

это объект Notification, который я создаю при получении запроса на новое уведомление, которое я получаю как объект json.

Aymen Ragoubi 27.09.2018 11:30

Если вы отправляете уведомление создать экземпляр, вы не можете использовать persist, потому что созданный объект не привязан к сеансу гибернации. Вы должны использовать merge вместо persist. Подробности здесь: stackoverflow.com/a/13837495/2224047

Nikolai Shevchenko 27.09.2018 11:40

Я не думаю, что проблема в том, что, поскольку я не касаюсь объекта сохранения кода в БД, это настолько сложный код, и он работает некоторое время, я считаю, что проблема возникает из-за аннотации, когда я использую Map

Aymen Ragoubi 27.09.2018 11:43

В прошлый раз я опубликовал еще один пост, который лучше объясняет, чем я хочу заниматься, [stackoverflow.com/questions/52364780/…

Aymen Ragoubi 27.09.2018 11:45

@Nikolay Наконец, с помощью слияния разрешите мою проблему, отправьте ответ, чтобы я мог его принять.

Aymen Ragoubi 27.09.2018 15:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
109
2

Ответы 2

попробуйте использовать что-то вроде этого:

@ElementCollection(targetClass = String.class)
@CollectionTable(name = "MAP")
@MapKeyColumn(name = "key")
@Column(name = "value")
private Map<String, String> map;

Вы пытаетесь сохранить объект без каких-либо ссылок. Может в этом твоя проблема.

это не помогает.

Aymen Ragoubi 27.09.2018 10:41

Если вы отправляете уведомление создать экземпляр, вы не можете использовать persist, потому что созданный объект не привязан к сеансу гибернации. Вы должны использовать merge вместо persist

Другие вопросы по теме