Bonjour à tous,
j'aimerais savoir si on peut utiliser hibernate avec des tables qui n'ont pas de clé primaire?
Merci à tous.
Version imprimable
Bonjour à tous,
j'aimerais savoir si on peut utiliser hibernate avec des tables qui n'ont pas de clé primaire?
Merci à tous.
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!
C'est possible mais découragé:
http://www.hibernate.org/hib_docs/v3...on-compositeid
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:
J'obtiens une erreur du genre :Code:
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(); } }
Et voici le contenu de mon fichier Personne.hbm,Code:
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
Code:
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:
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
Tu utilises quelle version d'Hibernate, car ton mapping est déclaré en 2.0 ?
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.
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.
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...
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?
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 :
En fait, le changement s'est opéré au niveau du tag <generator class="vm" /> . Voici le nouveau fichier :Code:
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>
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:
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>
Merci!Code:
1
2 Personne pers = (Personne)session.load(Personne.class, valeur_Column_Nom);