0
votes

Comment résoudre l'organisation ORG.Hibernate.TransientObjectException: Objet Références d'une instance transitoire non enregistrée

J'ai deux entités Batchfcm code> et fcmtopics code>. Un fcmtopic peut appartenir à de nombreux Batchfcm, il a donc une relation @manytoone code>. J'essaie de sauvegarder le Batchfcm mais sa ne pas être sauvée.

J'ai déjà essayé de mettre p> xxx pré>

i même essayé même cascadetype.all code>. Mais ce n'est pas ma condition. La table FCMTopics aura des données déjà insérées, je dois en choisir un et définir dans la base de données BatchFCM. P>

J'ai essayé le @Transient code> Annotation, cela a fonctionné mais le fcmtopie La colonne reste toujours nulle. Je veux la colonne avec l'identifiant de fcmtopics dedans. Le transitoire Arrêtez de mapper le champ FCMTopics dans des données JSON lorsque récupéré à partir d'un contrôleur. Mais je veux le récupérer. P>

Voici mes entités P>

Batchfcm P> blockQuote> xxx pré>

fcmtopics p> blockQuote> xxx pré>

lorsque j'utilise cascadeType code> i obtenir une exception de contrainteViolation avec la clé en double, je sais que c'est due au unique = true . Ci-dessous mon service P>

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);


0 commentaires

3 Réponses :


0
votes

Un problème que je vois ici est qu'il manque l'annotation @ID dans les deux entités. Cela peut arriver, que même votre sujet existe déjà dans votre dB, Hibernate ne voit pas l'identifiant et pense qu'il s'agit d'une nouvelle entrée, qui doit être insérée. Essayez d'ajouter les champs d'identification de vos entités.


2 commentaires

L'annotation d'identification est présente dans la abstraction


Utilisez-vous une annotation @TransActional sur votre méthode?



0
votes

signifie que vous oubliez d'enregistrer l'état de l'objet


1 commentaires

J'ai essayé d'utiliser cascadetype.persist ou cascadeetype.all mais en raison du unique = true une contrainteViolationException. Cela fait sauver l'instance, ne le fait pas?



1
votes

Veuillez définir la version dans la table de base de données, car Hibernate tente de mettre à jour la propriété transitoire sur la base de la version.


1 commentaires

Oui, ma version était NULL, puis je l'ai changé 0, puis cela a fonctionné.