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:
@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 :
Code:
result = session.createSQLQuery( "select DISTINCT parcel.*, parcel_cstm.* from parcel, parcel_cstm
where parcel_cstm.id_c = parcel.id").addEntity(Parcel.class).list();
É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:
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)
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 ?
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 !