Bonjour à tous !
Je suis débutant en Hibernate et je rencontre quelques soucis dans son utilisation. J'espère que vous saurez m'aider :-)
Voici mon problème :
J'ai une base de données contenant plusieurs tables dont 2 en relations l'une à l'autre :
parcel(id, champ1, champ2,...) et parcel_cstm(id_c, champs_cstm1, champ_cstm2). parcel_cstm est en fait un "prolongement" de la table parcel, les champs cstm auraient pu être directement dans la table parcel mais il est impossible de toucher à la table parcel, on passe donc par une nouvelle table dont la liaison est fait par id_c (parcel.id = parcel_cstm.id_c)
Je tiens à préciser que je NE PEUX PAS MODIFIER cette architecture !
Mon souci est que je voudrais mapper ces 2 tables dans une seule classe java Parcel qui aurait les attributs champ1, champ2, champ_cstm1 et champ_cstm2.
Quelles annotations dois-je mettre dans ma classe pour réaliser un tel mapping ?
Je vous pose cette question car c'est un travail que j'ai repris et qui ne fonctionne pas complétement. Voici ce qui a été fait:
La classe Parcel a été mappé de cette manière :
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 @Entity @Table (name="parcel") public class Parcel implements Serializable { @Id @Column private String id; @Column private int champ1; @Column private int champ2; @Column private String champ_cstm1; @Column private String champ_cstm2; ...
Ensuite pour récupérer la liste des parcel en base on exécute cette requête :
Étrangement (?) je récupère bien ma liste de parcel avec les champs normaux et les champs cstm dans le même objet MAIS j'ai besoin de faire un session.refresh() sur chaque objet car ils peuvent être modifié à la volée (par un autre programme) et donc parfois les résultats ne sont pas "à jour". Or ce refresh ne fonctionne pas ! J'obtiens l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 result = session.createSQLQuery( "select DISTINCT parcel.*, parcel_cstm.* from parcel, parcel_cstm where parcel_cstm.id_c = parcel.id").addEntity(Parcel.class).list();
Avez-vous une idée du problème? Pourquoi le refresh retourne t-il cette erreur alors que la requête fonctionne bien si je ne le met pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ATTENTION: SQL Error: 1054, SQLState: 42S22 19 janv. 2012 11:29:17 org.slf4j.impl.JCLLoggerAdapter error GRAVE: Unknown column 'parcel0_.champ_cstm1' in 'field list' 19 janv. 2012 11:29:17 com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException GRAVE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container org.hibernate.exception.SQLGrammarException: could not execute query at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.loader.Loader.doList(Loader.java:2235) ... Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'parcel0_.champ_cstm1' in 'field list' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
Désolé pour le pavé, mais comme je sais que vous n'avez pas de boule de cristal j’essaie de bien exposer mon problème :p
Merci d'avance pour votre aide,
@ bientôt !
Partager