Как разрешить исключение org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть две сущности BatchFcm и FcmTopics.Один FcmTopic может принадлежать многим BatchFcm, поэтому он имеет отношение @ManyToOne.Я пытаюсь сохранить пакетный файл, но он не сохраняется.

Я уже пытался поставить

@ManyToOne(cascade = CascadeType.PERSIST) 
FcmTopics fcmTopics

Я даже пытался CascadeType.ALL.Но это не мое требование.В таблицу fcmtopics уже будут вставлены данные, мне нужно выбрать их и установить в базе данных batchfcm.

Я пробовал аннотацию @Transient, она работала, но fcmTopics в столбце всегда остается нулевым.Я хочу столбец с идентификатором fcmtopics в нем.Th Transient перестает отображать поле fcmtopics в данные json при извлечении из контроллера.Но я хочу получить его.

Вот мои сущности

BatchFcm

@Entity
@Table(name = "batch_fcm")
@Getter
@Setter
@NoArgsConstructor
public class BatchFcm extends AbstractEntity {

    @ManyToOne
    private FCMTopics fcmTopics;

FcmTopics

@Entity
@Table(name = "fcm_topics")
@Getter
@Setter
public class FCMTopics extends AbstractEntity {

    @Column(unique = true)
    private String name;

    private String description;

    private FCMTopicStatus status;

Когда я использую CascadeType, я получаю исключение constraintViolation с дублирующим ключом, я знаю, что это связано с unique = true.Ниже мой сервис

BatchFcm fcmDetail;
if (adminFcmResource.getId() != null) {
            log.info("Updating bulk fcm log for batch id: {}, admin: {}", adminFcmResource.getId(), adminUser);
            fcmDetail = batchFcmRepository.findOne(adminFcmResource.getId());
            fcmDetail.setStatus(adminFcmResource.getStatus());
            fcmDetail.setCreatedBy(adminFcmResource.getAdminId());
            fcmDetail.setImagePath(adminFcmResource.getImagePath());
            fcmDetail.setLogo(adminFcmResource.getLogo());
            if (!InputUtil.isEmpty(adminFcmResource.getTopic())) {
                fcmDetail.setFcmTopics(fcmTopicsService.findByName(adminFcmResource.getTopic()));
            } else {
                fcmDetail.setCsvPath(adminFcmResource.getCsvPath());
            }
        } else {
            log.info("Adding bulk fcm log with csv path: {}, admin: {}", adminFcmResource.getCsvPath(), adminUser);
            fcmDetail = new BatchFcm(adminFcmResource.getTitle(),
                    adminFcmResource.getMessage(),
                    adminFcmResource.getImagePath(),
                    adminFcmResource.getAdminId(),
                    adminFcmResource.getExternalRedirectUrl());
            if (!InputUtil.isEmpty(adminFcmResource.getTopic())) {
                fcmDetail.setFcmTopics(fcmTopicsService.findByName(adminFcmResource.getTopic()));
            } else {
                fcmDetail.setCsvPath(adminFcmResource.getCsvPath());
            }
            fcmDetail.setLogo(adminFcmResource.getLogo());
            fcmDetail.setForScheduling(false);
        }
        fcmDetail.setFcmType(FCMTypes.OFFERS.ordinal());
        fcmDetail.setCreatedBy(AuthUtil.getCurrentUser().getId());
        batchFcmRepository.save(fcmDetail);

Хотя findByName имеет @Cacheable.Есть ли способ сохранить данные?а также сохранить идентификатор в столбце.Я сделал @JoinColumn(referencedColumnName = "id", name = "fcm_topics_id").

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

Пожалуйста, установите версию в таблице базы данных, так как hibernate пытается обновить временное свойство на основе версии.

0 голосов
/ 16 апреля 2019

означает, что вы забыли сохранить состояние объекта

0 голосов
/ 15 апреля 2019

Одна проблема, которую я вижу здесь, это то, что вы пропускаете аннотацию @id в обеих сущностях. Может случиться, что даже ваша тема уже существует в вашей БД, hibernate не видит идентификатор и думает, что это новая запись, которую необходимо вставить. Попробуйте добавить поля идентификатора в ваши сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...