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 sans clé primaire


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 70
    Par défaut Hibernate sans clé primaire
    Bonjour à tous,
    j'aimerais savoir si on peut utiliser hibernate avec des tables qui n'ont pas de clé primaire?

    Merci à tous.

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 70
    Par défaut
    En lisant les docs et des livres sur hibernate, je ne trouve toujours pas une réponse à ma question. En fait dans tous les exemples, toutes les tables ont une clé primaire. Donc je suppose qu'on ne peut pas utiliser hibernate sans clé primaire. Est-vraie ?

    Merci de votre réponse car je fais une étude sur les frameworks que je vais utiliser pour mon projet. L'un de mes objectifs était d'utiliser hibernate mais si cette contrainte de clé primaire s'avère vraie, je l'ai dans l'os car il n'est pas question de touchée aux tables de la base qui existent depuis longtemps et qui sont utilisées par d'autres apllications.

    J'attends vos réponses!

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    C'est tout à fait possible, la contrainte étant qu'il va utiliser un pojo qui n'a qu'une propriété id avec tous les champs liés à id.
    (J'ai déjà utilisé, ça fonctionne)
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 70
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    C'est tout à fait possible, la contrainte étant qu'il va utiliser un pojo qui n'a qu'une propriété id avec tous les champs liés à id.
    (J'ai déjà utilisé, ça fonctionne)
    A+
    Merci de vos réponses,
    mais je ne comprends pas trop ce que tu veux dire OButterlin. Peux tu me montrer à quoi ressemblera mon pojo? Par exemple si j'ai une table nommée Personne avec 3 champs nom (integer), prenom(string) et adresse (string).

    Je fais une démo avec Mysql :
    Dans un premier temps, je définis la table sans clé primaire. Je fais une classe test:

    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
     
    public class Test {
     
    	public static void main(String[] args)throws HibernateException {
     
    		Session session = HibernateUtil.currentSession();
    		Transaction tx = session.beginTransaction();
     
    		Personne personne = new Personne();
    		personne.setAdresse("R.A.S");
    		personne.setPrenom("toto");
    		session.save(personne);
    		tx.commit();
     
    		System.out.println("it works");
     
    		List list = session.find("from Personne");
    		Iterator it = list.iterator();
    		while(it.hasNext())
    		{
    			Personne utilisat = (Personne)it.next();
    		        System.out.println(utilisat.getNom());
    		        System.out.println(utilisat.getAdresse());
    		        System.out.println(utilisat.getPrenom());
    		}
     
    		HibernateUtil.closeSession();
    	}
     
    }
    J'obtiens une erreur du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    GRAVE: Error parsing XML: XML InputStream(29) The content of element type "class" must match "(meta*,(cache|jcs-cache)?,(id|composite-id),discriminator?,(version|timestamp)?,(property|many-to-one|one-to-one|component|dynamic-component|any|map|set|list|bag|idbag|array|primitive-array)*,(subclass*|joined-subclass*))".
    Exception in thread "main" java.lang.ExceptionInInitializerError
    	at Test.main(Test.java:13)
    Caused by: java.lang.RuntimeException: Problème de configuration : Error reading resource: Personne.hbm
    	at com.test.hibernate.HibernateUtil.<clinit>(HibernateUtil.java:16)
    	... 1 more
    Caused by: net.sf.hibernate.MappingException: Error reading resource: Personne.hbm
    Et voici le contenu de mon fichier Personne.hbm,
    Code xml : 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
     
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
     
    <hibernate-mapping package="com.yaya.hibernate">
    	<class name="Personne" table="personne">
    		<property
    			column="adresse"
    			length="15"
    			name="Adresse"
    			not-null="true"
    			type="string"
    		 />
    		<property
    			column="prenom"
    			length="20"
    			name="Prenom"
    			not-null="true"
    			type="string"
    		 />
    		<property
    			column="nom"
    			length="20"
    			name="Nom"
    			not-null="true"
    			type="integer"
    		 />
    	</class>
    </hibernate-mapping>

    Ensuite je modifie la table en mettant comme clé primaire nom (qui est en fait un integer). Alors comme par maggie, tout marche.
    Voici le contenu de mon nouveau fichier Personne.hbm:
    Code xml : 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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
     
    <hibernate-mapping package="com.yaya.hibernate">
    	<class name="Personne" table="personne">
    		<id
    			column="nom"
    			name="Nom"
    			type="integer"
    		>
    			<generator class="vm" />
    		</id>
    		<property
    			column="adresse"
    			length="15"
    			name="Adresse"
    			not-null="true"
    			type="string"
    		 />
    		<property
    			column="prenom"
    			length="20"
    			name="Prenom"
    			not-null="true"
    			type="string"
    		 />
    	</class>
    </hibernate-mapping>

    Donc je reintère ma question, est-ce possible de faire mapper les tables qui n'ont pas de clé primaire? Apparemment la réponse est oui pour vous. Mais après cette petite démo, je ne sais pas quoi penser. Pouvez vous me détailler un peu plus s'il vous plait, comment est-ce possible?

    Merci

  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
    Tu utilises quelle version d'Hibernate, car ton mapping est déclaré en 2.0 ?

  7. #7
    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
    D'après la dtd :
    http://hibernate.sourceforge.net/hib...apping-3.0.dtd

    et si je ne dis pas de connerie, il faut soit un id ou un compsite-id pour que le mapping soit valide.

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 70
    Par défaut
    J'ai utilisé hibernate 2 pour la démo. Existe t-il une différence sur ce sujet avec hibernate 3?

    D'après ce que tu dis, il faut bien un id, donc il faut bien une clé primaire?

    Merci.

  9. #9
    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
    La version 2 est vieille, autant utiliser la 3.
    Je ne connais pas la différence sur ce sujet.

    Ce qui me chagrine, c'est qu'effectivement, on peut avoir des tables sans clé primaire. Etrange...

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 70
    Par défaut
    As tu un exemple de fichier de mapping ou tu mappes une classe qui n'a pas de clé primaire?

    Est-ce qu'un index ou un champ unique dans table peut résoudre le problème?

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 70
    Par défaut
    Merci à tous,
    je viens de trouver la solution à mon problème. Effectivement, on peut utiliser hibernate sans clé primaire. En lisant attentivement la documentation de référence, j'ai eu une idée :
    Dans ma démo (table sans clé primaire), j'avais ceci comme fichier de mapping de Personne :
    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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
     
    <hibernate-mapping package="com.test.hibernate">
    	<class name="Personne" table="personne">
    		<id
    			column="nom"
    			name="Nom"
    			type="integer"
    		>
    			<generator class="vm" />
    		</id>
    		<property
    			column="adresse"
    			length="15"
    			name="Adresse"
    			not-null="true"
    			type="string"
    		 />
    		<property
    			column="prenom"
    			length="20"
    			name="Prenom"
    			not-null="true"
    			type="string"
    		 />
    	</class>
    </hibernate-mapping>
    En fait, le changement s'est opéré au niveau du tag <generator class="vm" /> . Voici le nouveau fichier :
    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
    
    <hibernate-mapping package="com.test.hibernate">
    	<class name="Personne" table="personne">
    		<id
    			column="nom"
    			name="Nom"
    			type="integer"
    		>
    			<generator class="assigned" />
    		</id>
    		<property
    			column="adresse"
    			length="15"
    			name="Adresse"
    			not-null="true"
    			type="string"
    		 />
    		<property
    			column="prenom"
    			length="20"
    			name="Prenom"
    			not-null="true"
    			type="string"
    		 />
    	</class>
    </hibernate-mapping>
    Je remplace vm par assigned. Et ça marche. Donc, lorsque la table n'a pas de clé primaire, le tag <generator .. > n'est pas indispensable car par defaut, il est à "assigned" . Mais le tag <id .....> </id> est obligatoire car hibernate se sert de ce tag pour rechercher (loader vos objets). Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Personne pers = (Personne)session.load(Personne.class, valeur_Column_Nom);
    Merci!

Discussions similaires

  1. Utiliser Hibernate sans clé primaire
    Par bruno.getJava() dans le forum Hibernate
    Réponses: 10
    Dernier message: 04/01/2011, 12h44
  2. Suppression doublon sans clé primaire
    Par qbihlmaier dans le forum Access
    Réponses: 6
    Dernier message: 21/03/2007, 11h53
  3. Différence de tables sans clé primaire
    Par Nicola dans le forum Access
    Réponses: 2
    Dernier message: 19/09/2006, 18h22
  4. Mapper une table sans clé primaire
    Par rosros dans le forum Hibernate
    Réponses: 4
    Dernier message: 14/09/2006, 16h16
  5. [Hibernate] Mapper une table sans clé primaire
    Par neuromencien dans le forum Hibernate
    Réponses: 4
    Dernier message: 13/06/2006, 18h05

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