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

Hibernate Java Discussion :

org.hibernate.PersistentObjectException: detached entity passed to persist:


Sujet :

Hibernate Java

  1. #1
    Membre averti Avatar de mouss4rs
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    884
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 884
    Points : 355
    Points
    355
    Par défaut org.hibernate.PersistentObjectException: detached entity passed to persist:
    Bonsoir a tous,

    J'ai une erreur de ce type depuis un long moment et je ne sais pas d'ou cela peut venir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: ModeleMD.Patient
    	at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:630)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:219)
    	at ControlleurMD.Schema.main(Schema.java:49)
    Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: ModeleMD.Patient
    	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:79)
    	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
    	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
    	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
    	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:213)
    	... 1 more
    Je tente d'inserer les valeurs dans la table avec comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
    		EntityManager em = emf.createEntityManager();
    		em.getTransaction().begin();
     
    		Patient p1 = new Patient(1, "zimboumboum", "tralala", "2 rue des aubepines", 92600, "Asnieres sur seine", "0142425637", "z.tralala@hotmail.fr", "doc richard", 2, "à suivre semestriellement");
     
    p1.add(m1);
    em.persist(p1);
    em.getTransaction().commit();
    em.close();
    emf.close();
    Le fait est que ca me rajoute les tables dans la base de donnée sans l'enregistrement.
    J'utilise Derby comme BDD.
    j'ai changé de bdd en utilisant PostegreSQL= tjrs la meme erreur, a savoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    detached entity passed to persist: ModeleMD.Mesure
    J'ai chercher partout sur internet j'ai pas trouvé de solutions.
    Si quelqu'un peut m'aider ?

    merci

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par mouss4rs Voir le message
    Bonsoir a tous,

    J'ai une erreur de ce type depuis un long moment et je ne sais pas d'ou cela peut venir.


    Je tente d'inserer les valeurs dans la table avec comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    p1.add(m1);
    em.persist(p1);
    em.getTransaction().commit();
    em.close();
    emf.close();
    Le fait est que ca me rajoute les tables dans la base de donnée sans l'enregistrement.
    J'utilise Derby comme BDD.
    j'ai changé de bdd en utilisant PostegreSQL= tjrs la meme erreur, a savoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    detached entity passed to persist: ModeleMD.Mesure
    J'ai chercher partout sur internet j'ai pas trouvé de solutions.
    Si quelqu'un peut m'aider ?

    merci
    vérifiez si vous avez défini (correctement) le cascading de persistence sur la relation OneToMany (supposée) entre la classe de p1 et celle de m1, (et éventuellement toutes celles que vous ne montrez pas ici…)

    si ajouter em.persist(m1); résoud le problème cela sera l'indication que le cascading n'est pas correct par rapport à l'usage que vous voulez en faire…

  3. #3
    Membre averti Avatar de mouss4rs
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    884
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 884
    Points : 355
    Points
    355
    Par défaut
    Bonjour,

    voici la definition de mes classes:

    Classe Patient : un patient peut avoir une ou plusieur(s) mesure(s)

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    @Entity
    @Table(name="Patient")
    public class Patient implements Serializable{
    	
    	@Id
    	@Column
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int ref;
    	//@Column (name="ref", unique=true, nullable=false, length=4, insertable=false, updatable=false)
    	private String nom;
    	private String prenom;
    	private String adresse;
    	private int cp;
    	private String ville;
    	private String telephone;
    	private String email;
    	private String suivi_par;
    	private int type_diabete;
    	private String diagnostic;
    	
    	@OneToMany(mappedBy = "patient", cascade = { CascadeType.ALL })
    	@JoinColumn(name="patient_id")
    	private List<Mesure> mesures;
    	//ou Map ou Set peu importe
    	
    	
    	// constructor from super-class
    	public Patient() {
    		super();
    		this.init();
    		// TODO Auto-generated constructor stub
    	}
    	
    	//constructors using fields 
    	public Patient(String nom, String prenom, String adresse, int cp,
    			String ville, String telephone, String email, String suivi_par,
    			int type_diabete, String diagnostic) {
    		super();
    		this.nom = nom;
    		this.prenom = prenom;
    		this.adresse = adresse;
    		this.cp = cp;
    		this.ville = ville;
    		this.telephone = telephone;
    		this.email = email;
    		this.suivi_par = suivi_par;
    		this.type_diabete = type_diabete;
    		this.diagnostic = diagnostic;
    		this.init();
    	}
    
    	//getters and setters
    	public int getRef() {
    		return ref;
    	}
    
    	public void setRef(int ref) {
    		this.ref = ref;
    	}
    ....
    public List<Mesure> getMesures() {
    		return mesures;
    	}
    
    	public void setMesures(List<Mesure> mesures) {
    		this.mesures = mesures;
    	}
    	
    	public void init(){
    		mesures= new ArrayList<Mesure>();
    	}
    	
    	public void add(Mesure nouvelle){
    		mesures.add(nouvelle);
    	}
    Classe Mesure: une mesure correspond à un et un seul patient.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    @Entity
    @Table(name="Mesure")
    public class Mesure {
     
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int idMesure;
     
    	@Column(name="mesure_id")
    	private String dat;
    	private String heure;
    	private double glycemie;
     
    	@ManyToOne(fetch=FetchType.LAZY)
    	@JoinColumn(name = "patient_id", nullable = false)
    	private Patient patient;
     
     
    	//constructor from super-class
    	public Mesure() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
     
    	//constructors using fields
    	public Mesure(int idMesure, String dat, String heure, double glycemie) {
    		super();
    		this.idMesure = idMesure;
    		this.dat = dat;
    		this.heure = heure;
    		this.glycemie = glycemie;
    	}
     
    //getters and setters
    	public int getIdMesure() {
    		return idMesure;
    	}
    	public void setIdMesure(int idMesure) {
    		this.idMesure = idMesure;
    	}
     
    ....
    Ai-je répondu à vos consignes ?

    merci

  4. #4
    Membre averti Avatar de mouss4rs
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    884
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 884
    Points : 355
    Points
    355
    Par défaut
    je n'ai plus cette erreur.

    j'ai enlever le "cascade = { CascadeType.ALL })" dans le OneToMany concernant ma classe Patient et cela me rajoute l'enregistrement.

    Cependant, cela ne me rajoute pas la mesure qui correspond au patient et j'ai ma table mesure vide .

    Quelqu'un a t-il une solution?

    merci

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 83
    Points
    83
    Par défaut
    Dans la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Patient p1 = new Patient(1, "zimboumboum", "tralala", "2 rue des aubepines", 92600, "Asnieres sur seine", "0142425637", "z.tralala@hotmail.fr", "doc richard", 2, "à suivre semestriellement");
    le premier paramètre passé au constructeur ne serait il pas l'Id ??? quelle est ta stratégie de génération de cet ID ? si c'est un truc style sequence, Ca ne m'etonnerait pas que ton pb vienne de là.


    Citation Envoyé par mouss4rs Voir le message
    je n'ai plus cette erreur.

    j'ai enlever le "cascade = { CascadeType.ALL })" dans le OneToMany concernant ma classe Patient et cela me rajoute l'enregistrement.

    Cependant, cela ne me rajoute pas la mesure qui correspond au patient et j'ai ma table mesure vide .

    Quelqu'un a t-il une solution?

    merci

  6. #6
    Membre averti Avatar de mouss4rs
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    884
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 884
    Points : 355
    Points
    355
    Par défaut
    pb résolu ! merci

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 12
    Points : 18
    Points
    18
    Par défaut Arg
    Et comment as-tu résolu cette erreur ? j'ai le même soucis : un objet A qui contient une liste d'objet B, quand je fais une insertion soit ça ajoute l'objet A sans la liste des B soit ça plante...

    HELP !

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    voici un exemple qui fonctionne avec Commande contient n ligne de commande

    voici le code qui rend persistant une commande en insertion comme en maj c'est le meme code :

    public Commande save(Commande commande) {
    try {
    EntityManagerFactory emf = Persistence
    .createEntityManagerFactory("FermlandPersistenceUnit");
    EntityManager em = emf.createEntityManager();

    em.getTransaction().begin();
    System.out.println("-------------------------------------->"+commande.getLignes().size() + " no commande :"+commande.getId());

    Commande c = em.merge(commande);
    System.out.println("apres -------------------------------------->"+c.getLignes().size() + " no commande :"+c.getId());

    em.getTransaction().commit();
    em.close();
    return c;
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();

    }
    return null;
    }
    Commande.java

    LigneCommande.java

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    ce qui important dans d'indiquer dans l'objet commande
    est l'annotation suivante :
    @OneToMany(cascade={ CascadeType.MERGE}, mappedBy="commande")
    public List<LigneCommande> getLignes() {
    if (this.lignes == null) {
    this.lignes = new ArrayList<LigneCommande>();
    }
    return lignes;
    }

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut A l'insertion de Patient, il ne faut pas forcer l'id...
    en effet, le champ identifiant de Patient (ref) est annoté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @GeneratedValue(strategy=GenerationType.AUTO)
    A l'insertion dans la base, il faut faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Patient p1 = new Patient(null, "zimboumboum", ...
    et cela fonctionnera.

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

Discussions similaires

  1. [Hibernate] Detached entity passed to persist
    Par lotfi-g dans le forum Hibernate
    Réponses: 2
    Dernier message: 27/04/2018, 16h30
  2. Réponses: 6
    Dernier message: 15/03/2012, 17h28
  3. Réponses: 0
    Dernier message: 12/08/2011, 13h28
  4. Réponses: 1
    Dernier message: 14/07/2009, 00h24
  5. [EJB3 Entity] detached entity passed to persist
    Par maysam dans le forum Java EE
    Réponses: 3
    Dernier message: 03/12/2008, 13h43

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