objet référence une instance transitoire non sauvegardée: enregistrez l'instance transitoire avant de la rincer
J'ai deux entités: PlayerProfileEntity & UserInfoEntity
J'ai une jointure sur userInfoEntity & PlaterProfileEntity et l'enregistrement de mon dossier dans la base de données comme ceci:
Session session = sessionFactory.openSession();
Transaction tr = session.beginTransaction();
Criteria crit = session.createCriteria(PlayerProfileEntity.class);
player.setUserId(new UserInfoEntity());
player.getUserId().setAddress(user.getUserId().getAddress());
session.save(player);
tr.commit();
J'ai utilisé cette assosiation dans mon PlayerProfileEntity classe
@ManyToOne (fetch = FetchType.LAZY)
@Cascade({CascadeType.REFRESH})
@JoinColumn(name="userid")
J'obtiens cette erreur:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.shared.entity.UserInfoEntity
Remarque : Si j'utilise CascadeType.Tous, j'ai cette erreur:
Cannot add or update a child row: a foreign key constraint fails
Une idée de comment puis-je résoudre ce
Grâce
source d'informationauteur user1226162
Vous devez vous connecter pour publier un commentaire.
La
TransientObjectException
vient à chaque fois que vous essayez d'enregistrer l'Objet sans enregistrer les Jointures appropriées.Vous devez enregistrer leUserInfoEntity
d'abord et ensuite, vous pouvez enregistrer votrePlayerInfoEntity
classe.En utilisant ce que vous assignez particulier
UserInfoEntity
àPlayerInfoEntity
. MaisUserInfoEntity
n'a pas d'ID. Comment à la fois être substitués ? C'est pourquoi, l'exception est à venir.Espère que ça vous aidera.
Vous devez utiliser le CascadeType.PERSISTENT ou CascadeType.TOUS les
J'ai rencontré la même erreur que tout à l'heure, lorsque vous tentez de stocker un objet non enregistrées qui avait attribué l'ID de la Session#méthode save (). Je pense que le problème pourrait être que votre non enregistrées objet graphique a déjà été donné un id (qui est quelque chose que l'économiser, la méthode tente de le faire), et ce en quelque sorte bousille la cascade de la sauvegarde-de la méthode. Essayez d'utiliser la Session#persist() au lieu de cela, cascade doit travailler avec ce, même si l'objet a déjà été attribué un id.
Bien,
J'avais simmilar problème et ce que j'ai fait était
Cela a fonctionné pour moi.
Il obtient le transitoire de l'objet et expulse ou les fusionne.
Maintenant utiliser la commande enregistrer ou mettre à jour la méthode pour enregistrer votre nouvel objet.