IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

[EJB3] [JPA] TransientObjectException


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Par défaut [EJB3] [JPA] TransientObjectException
    bonjour a tous ,
    voila j'ai un petit probleme avec les annotations JPA dans les EJB3.
    ce que cherche a faire c'est une realtion many to one et one to many entre une entité personne et une entité ville
    Une ville pouvant contenir plusieurs personnes et une personne ne pouvant appartenir a une seule ville .


    j'ai donc defini mes relations de la maniere suivante :
    person :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    @Entity
    @Name("person")
    @Table(name="Person")
    public class Person implements Serializable {
     
      private long id;
      private String name;
      private int age;
      private String email;   
      private String comment;
      private Ville ville;
     
    [...] getter and setters[/...]
     
      @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
      @JoinColumn(name = "villeId") 
      public Ville getVille() { return ville; }
      public void setVille(Ville ville) {
        this.ville = ville;
      }
     
    }
    et ville :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    @Entity
    @Name("ville")
    @Table(name="Ville")
    public class Ville implements Serializable {
     
      private long id;
      private String name;
      private int cp ;
      private String comment;
      private Collection<Person> listePersons;
     
    [...] getter and setters[/...]
     
    @OneToMany(fetch = FetchType.LAZY, mappedBy="ville")
    public Collection<Person> getPersons()
    {
       return listePersons;
    }
     
    public void setPersons(Collection<Person> listePersons)
    {
       this.listePersons = listePersons;
    }
     
     
    }
    ce que je cherche a faire dans cette application c'est de creer une personne , remplir quelque attribut et pouvoir lui affecter une ville présente en base de donnée

    Lorsque j'esaie de faire persiter l'entité person et , si dans le Many To One de Person je ne definis pas l'attribut Cascade.PERSIST , j'ai une erreur de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    11:25:50,620 WARN  [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeCompletion - failed for com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple@170bdf7
    java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.evolutis.person.Person.ville -> com.evolutis.ville.Ville
    ce que j'ai compris c'est que JPA cherche a faire persisté la ville, ce que je ne veut pas puique cette ville est deja en base.

    Si je definis Cascade.PERSIST alors tout se passe bien mais il essaie de dupliquer la ville qui existe deja.

    quelqu'un aurait une idée ?

    merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par peuhhh Voir le message
    bonjour a tous ,


    ce que je cherche a faire dans cette application c'est de creer une personne , remplir quelque attribut et pouvoir lui affecter une ville présente en base de donnée

    Lorsque j'esaie de faire persiter l'entité person et , si dans le Many To One de Person je ne definis pas l'attribut Cascade.PERSIST , j'ai une erreur de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    11:25:50,620 WARN  [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeCompletion - failed for com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple@170bdf7
    java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.evolutis.person.Person.ville -> com.evolutis.ville.Ville
    ce que j'ai compris c'est que JPA cherche a faire persisté la ville, ce que je ne veut pas puique cette ville est deja en base.

    Si je definis Cascade.PERSIST alors tout se passe bien mais il essaie de dupliquer la ville qui existe deja.

    quelqu'un aurait une idée ?

    merci d'avance
    s'il y a tentative de persister la ville, c'est que vous l'avez créée dans l'application (via un new… ) au lieu de la lire de la DB…

    il faut assigner à l'entité "personne" une instance de "ville" qui provient d'un "fetch" … sinon évidemment la couche persistence pensera qu'il s'agit d'une nouvelle…

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Par défaut
    Bonjour et merci de votre réponse ,

    en fait je ne créer pas d'instance ville via un new , je vais réelement chercher cette entitée en base de donnée, de manière pratique je rentre un code postal, permettant de retrouver une occurance correspondante.

    ensuite l'objet ville créé (par un find, a noter que j'utilise le framework seam egalement), je l'affecte a mon objet person et je tente de faire persister l'objet person .
    par quelquechose de la sorte J'ai lu que dans le cycle de vie des Bean entité, certains objets pouvait passer a un état transient, je ne sais pas pourquoi dans mon application, mais il semblerait que Ville passe dans cet etat. peut etre un changement de contexte ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par peuhhh Voir le message
    Bonjour et merci de votre réponse ,

    en fait je ne créer pas d'instance ville via un new , je vais réelement chercher cette entitée en base de donnée, de manière pratique je rentre un code postal, permettant de retrouver une occurance correspondante.

    ensuite l'objet ville créé (par un find, a noter que j'utilise le framework seam egalement), je l'affecte a mon objet person et je tente de faire persister l'objet person .
    par quelquechose de la sorte J'ai lu que dans le cycle de vie des Bean entité, certains objets pouvait passer a un état transient, je ne sais pas pourquoi dans mon application, mais il semblerait que Ville passe dans cet etat. peut etre un changement de contexte ?
    possible en effet si vous lisez la "ville" dans une transaction et que vous persistez la "personne" dans une autre...
    (voir la doc du "merge")

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Par défaut
    Bonjour,
    j'ai réussi a résoudre le problème en utilisant le mécanisme de conversation de Seam.
    J'ai annoté la première méthode qui récupere l'entité ville avec @begin, et la méthode qui se charge de faire persister la personne lié a cette ville avec @End. dans ce cas précis l'objet Ville semble etre gardé dans le contexte de conversation en temp qu'objet détaché et non trnasient , ce qui me permet de résoudre mon problème.

    Je ne suis pas sur que cette méthode soit très 'propre', mais elle a l'avantage de marcher. Dans l'esprit Seam , les actions que j'enchaine rentrent dans le concept d'une conversation.
    Je vais tagger cette discussion comme résolue, tout en gardant à l'esprit : " comment aurais-je résolu ce problème sans Seam ..?"

    merci JeitEmgie pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/05/2012, 21h17
  2. rapport entre EJB3 / JPA
    Par identifiant_bidon dans le forum Persistance des données
    Réponses: 2
    Dernier message: 25/04/2010, 23h05
  3. Réponses: 0
    Dernier message: 25/08/2009, 16h38
  4. question projet jsf+ejb3+jpa
    Par MattA184575 dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 20/01/2009, 22h28
  5. Code Source - JEE5 (JSF, EJB3, JPA)
    Par 17mounir dans le forum JSF
    Réponses: 4
    Dernier message: 17/04/2008, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo