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 :

Merge renvoi des id null


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut Merge renvoi des id null
    Quand je fais un merge sur un objet avec un Id simple pas de soucis (l objet n existe pas en DB et n est pas deja attache). Generator=assigned

    Les memes conditions avec un composite-id me renvoi un objet aux ids=null

    Pourquoi ?

  2. #2
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Bonjour,
    faut montrer un peu de code.

    Cordialement,
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                       "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- Generated May 10, 2011 1:14:11 PM by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping>
    	<class name="com.amadeus.sep.lsr.refautomation.reference_bo.CityName"
    		table="TP_CityName">
     
    		<composite-id>
    			<key-property name="languageCode" column="LanguageCode" type="java.lang.String"></key-property>
    			<key-property name="cityCode" column="CityCode" type="java.lang.String"></key-property>
    			<generator class="assigned"></generator>
    		</composite-id>
     
    		<property column="CityName" generated="never"
    			lazy="false" name="cityName" />
     
    	</class>
    </hibernate-mapping>
    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
     
     
    public class CityName extends Entity implements Serializable{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = -1053883640497293572L;
     
    	private String languageCode;
     
    	private String cityCode;
     
    	private String cityName;
     
    	//Internal usage
    	private Boolean isAirport;
     
    	//Internal usage
    	private String relatedCityCode;
     
    	public CityName(){
    		super.setIdFieldsName("cityCode","languageCode");
    		super.setComparedFieldsName("cityName");
    	}
     
    	public String getRelatedCityCode() {
    		return relatedCityCode;
    	}
     
    	public void setRelatedCityCode(String relatedCityCode) {
    		this.relatedCityCode = relatedCityCode;
    	}
     
    	public Boolean getIsAirport() {
    		return isAirport;
    	}
     
    	public void setIsAirport(Boolean isAirport) {
    		this.isAirport = isAirport;
    	}
     
    	public String getLanguageCode() {
    		return languageCode;
    	}
     
    	public void setLanguageCode(String languageCode) {
    		this.languageCode = languageCode;
    	}
     
    	public String getCityCode() {
    		return cityCode;
    	}
     
    	public void setCityCode(String cityCode) {
    		this.cityCode = cityCode;
    	}
     
    	public String getCityName() {
    		return cityName;
    	}
     
    	public void setCityName(String cityName) {
    		this.cityName = cityName;
    	}
     
    	public String toString(){
    		return "CityName: "+cityCode+" - "+languageCode;
    	}
    }
    on niveau DAO (le merge pour des raisons de robustesse):
    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
     
    /**
             * Save or Update the entity
             */
    	public T makePersistent(T entity) throws HibernateException {
     
    		T mergedEntity=null;
    		try {
    			this.beginTransaction();
    			 mergedEntity=(T)this.openSession().merge(entity);
    			this.openSession().saveOrUpdate(mergedEntity);
    		} catch (HibernateException e) {
    			this.handleHibernateException(e);
    			throw e;
    		}
    		return entity;
    	}
    L'objet mergedEntity a des valeurs de Id null pour le composite ci dessus décrit

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    et il avait un id avant le merge?

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut
    oui oui, il y a bien un id avant le merge

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Je ne vois pas trop l'utilité du merge suivi du saveorupdate...
    Et en plus dans une session différente ? Puisque tu as deux openSession consécutifs...

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut
    le openSession renvoi la session courante si deja ouverte (donc c est la meme).

    Le merge sert a synchroniser un objet avec le cache si besoin. J ai besoin de cette assurance pour ma part.

    Tout le probleme reste dans la premiere ligne: mergedEntity a des id=null

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Je sais bien à quoi sert le merge, mais il ne nécessite pas de saveOrUpdate.

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut
    apres la synchronization je fais un saveOrUpdate pour persister l objet en DB (c est le but finale)

    Ce que fait pas le merge.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Ben justement si, le merge est censé sauvegarder tes modifs en base.
    Et même t'en créer un s'il n'existe pas.

  11. #11
    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 Alec6 Voir le message
    Ce que fait pas le merge.
    sans commit de la transaction cela paraît peu probabale en effet.

    (et votre makePersistent renvoit toujours le paramètre pas le résultat du merge, ce qui rend son résultat totalement inutile...)

  12. #12
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut
    Ah oui, effectivement le saveOrUpdate fait doublon (exacte aussi pour le mergedEntity qui n'est pas renvoyé). Je croyais qu'il ne servait qu'à synchroniser le cache.

    Le commit et fait ailleurs (transaction longue)

    mais en debug mergedEntity à des id=null pour des clefs composites

    ce qui reste mon problème.

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    en debug? Il faut passer par les getters / setters pour vérifier l'id. Hibernate peux faire du lazy loading sur les attributs.

Discussions similaires

  1. somme des champs null
    Par s.rais dans le forum Access
    Réponses: 4
    Dernier message: 09/02/2006, 10h05
  2. [C#] [WinForms] Renvoi des erreurs...
    Par omlip dans le forum Windows Forms
    Réponses: 7
    Dernier message: 08/12/2004, 18h12
  3. requette qui renvoi des ligne double
    Par fehmitn dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/09/2004, 23h36
  4. [html:text][indexed]Valeurs des liste null...
    Par thibaut dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 08/09/2004, 10h36
  5. Réponses: 5
    Dernier message: 11/12/2003, 15h45

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