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 :

[Hibernate] Detached entity passed to persist


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 97
    Points : 52
    Points
    52
    Par défaut [Hibernate] Detached entity passed to persist
    Bonjour,

    Aprés avoir consulter vos remarques sur ce type de problémes et appliqué vos consignes je n'ai pas encore réussi a résoudre le probléme alors j'ai postulé cette erreur sur le forum.
    Je travaille sur un projet hibernate. J'arrive pas a ajouter plusieurs tuples dans ma table contact il m'ajoute seulement le premier enregistrement après il m'affiche cette erreur :detached entity passed to persist : Domain.Contact

    J'ai créé ma classe Contact avec les getter et les setter.
    J'ai créé un formulaire jsp qui renvoi les donné à une servlet cette dernier recupaire les données saisie et appelle la méthode Ajout de la classe DAOcontact pour l'ajout.

    voici le fichier de mapping de ma classe contact :
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 30 nov. 2010 20:53:56 by Hibernate Tools 3.3.0.GA -->
    <hibernate-mapping>
        <class name="domain.Contact" table="CONTACT" discriminator-value="CONTACT">
            <id name="id" type="int">
                <column name="ID_Contact" />
                <generator class="increment" />
            </id>
            <discriminator column="ENTREPRISE" type="string" />
            <property name="firstname" type="java.lang.String">
                <column name="FIRSTNAME" />
            </property>
            <property name="lastname" type="java.lang.String">
                <column name="LASTNAME" />
            </property>
            <property name="email" type="java.lang.String">
                <column name="EMAIL" />
            </property>
            <many-to-one name="adr" class="domain.Adresse" fetch="join" cascade="persist">
                <column name="ADR" />
            </many-to-one>
            <set name="phones" inverse="true" table="PHONENUMBER" cascade="persist">
                <key>
                    <column name="ID_Contact" />
                </key>
     
                <one-to-many class="domain.PhoneNumber" />
            </set>     
            <set name="books" inverse="true" table="CONTACT" cascade="persist">
                <key>
                    <column name="ID_Contact" />
                </key>
     
                <one-to-many class="domain.ContactGroup" />
            </set>
     
            <subclass name="domain.Entreprise" discriminator-value="ENTREPRISE" >
            <property name="numsiret" type="integer"/>
            </subclass>
     
     
     
     
    <!--        <joined-subclass name="domain.Entreprise" table="ENTREPRISE">-->
    <!--        	<key column="ID_Contact"/>-->
    <!--   			<property name="numsiret" column="Entreprise"/>-->
    <!--        </joined-subclass>-->
     
     
        </class>
    </hibernate-mapping>
    voici ma servlet NewCOntact :

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//String id1 = request.getParameter("id");
    		String nom1 = request.getParameter("nom");
    		String prenom1 = request.getParameter("prenom");
    		String email1 = request.getParameter("email");
     
    		String adr1=request.getParameter("adr");
    		String codp=request.getParameter("codepostal");
    		String ville=request.getParameter("ville");
    		String pays=request.getParameter("pays");
    		// creation de ladresse
    		System.out.println("adr " + adr1 + " codp " + codp + " ville " + ville + " pays " + pays);
    		Adresse adr=new Adresse();
    		adr.setCity(ville);
    		adr.setCountry(pays);
    		adr.setZip(codp);
    		adr.setStreet(adr1);
     
    		/*String a=request.getParameter("t");
    		String b=request.getParameter("to");
    		String c=request.getParameter("top");*/
     
    		String[] rsa = request.getParameterValues("t");
    		String scg="";
    		for(int i =0; i< rsa.length;i++){
    			if (!rsa[i].isEmpty())
    				scg = rsa[i]; 
    		}
    		//System.out.println(a + " a "  + b  + " b+" + c + " c");
    		System.out.println("cggggg"+scg);
    		/*if(a != null)
    			rsa=a;
    		if(b !=null)
    			rsa=b;
    		if( c != null)
    			rsa=c;*/
     
    		ContactGroup cg = new ContactGroup();
    		cg.setGroupName(scg);
     
     
     
     
     
    		String bur=request.getParameter("bur");
    		String dom=request.getParameter("dom");
    		String prive=request.getParameter("priv");
     
    		System.out.println(bur + " " + dom + " " + prive);
    		PhoneNumber p1 = new PhoneNumber();
    		PhoneNumber p2 = new PhoneNumber();
    		PhoneNumber p3 = new PhoneNumber();
     
    		Entreprise entr= new Entreprise(); 
     
    		Contact person = new Contact();
    		//System.out.println(person.getBooks().size());
    		if (!bur.isEmpty()){
    			p1.setPhoneKind("bureau");
    			p1.setPhoneNumber(bur);
    			p1.setContacts(person);
    			person.getPhones().add(p1);
    		}
    		if (!dom.isEmpty()){
    			p2.setPhoneKind("domicile");
    			p2.setPhoneNumber(dom);
    			p2.setContacts(person);
    			person.getPhones().add(p2);
    		}
    		if (!prive.isEmpty()){
    			p3.setPhoneKind("prive");
    			p3.setPhoneNumber(prive);
    			p3.setContacts(person);
    			person.getPhones().add(p3);
    		}
     
     
    		person.getBooks().add(cg);
    		person.setAdr(adr);
    		person.setNumsiret(11);
     
     
    		person.setFirstname(prenom1);
    		person.setEmail(email1);
    		person.setLastname(nom1);
     
    		//ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
    		ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    		DAOContact dao = (DAOContact)context.getBean("DAOContact");
     
     
    		//DAOContact dao= new DAOContact();
    		dao.addContact(person);
    voici la méthode ajoutContact dans la classe DAOCOntact qui prend en parametre un contact :
    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
     
    public void addContact(Contact con)
    Session session = null;
    		try
    		{
    			SessionFactory sessionf =Util.getInstance();
    			session = sessionf.openSession();
    			//begin a transaction
    			org.hibernate.Transaction tx = session.beginTransaction();
     
    			Contact contact = con;
    			session.persist(contact);
    			//session.save(contact); 
    			tx.commit();
    		}catch(Exception e){
    			System.out.println(e.getMessage());
    		}

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 97
    Points : 52
    Points
    52
    Par défaut une solution
    Je vois que personne n'as voulu s'insteréssé au problème bref voici une réponse.

    En effet, le problème vient du fais que j essaie de mettre en base de données un entity possedant déjà une clé primaire, alors que j ai indiqué qu'elle était automatiquement générée.

    Pour résoudre ce pb, soit il faut enlever la génération automatique des clé primaire donner les id manuellement, soit ne pas setter les id à la main, et donc l'enlever du constructeur.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2018
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par lotfi-g Voir le message
    Je vois que personne n'as voulu s'insteréssé au problème bref voici une réponse.

    En effet, le problème vient du fais que j essaie de mettre en base de données un entity possedant déjà une clé primaire, alors que j ai indiqué qu'elle était automatiquement générée.

    Pour résoudre ce pb, soit il faut enlever la génération automatique des clé primaire donner les id manuellement, soit ne pas setter les id à la main, et donc l'enlever du constructeur.
    Le message date mais le problème reste encore d'actualité. Déjà merci ça m'a débloqué, par ailleurs ce problème intervient souvent lors de boucle d'enregistrement avec la méthode create des Dao et par voie de conséquence dans les service car ces dernières renvoient l'ID créées par la base de donnée dans la l'instance de l'objet alors que ce n'est pas désiré ici .

    La solution que j'ai trouvée est simple il suffit de réinitialiser l'id en null à l'aide d'un setter à chaque itération de boucle, même si je pense que l'on peut empêcher le renvoi de l'Id vers java (un peut comme avec les fetchtype en Lazy) cette solution est extrêmement simple à implémenter et permet de conserver le renvoi au endroit ou ces dernier peuvent se révéler utiles.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/03/2012, 17h28
  2. Réponses: 0
    Dernier message: 12/08/2011, 13h28
  3. Réponses: 9
    Dernier message: 09/05/2011, 21h25
  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