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 :

Clé primaire composée + @ManyToOne = Erreur


Sujet :

Hibernate Java

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut Clé primaire composée + @ManyToOne = Erreur
    Bonjour à tous,

    J'essaye en vain de mapper une clé primaire composée contenant à la fois un "int" et une entité.
    J'ai 2 entités : SystemSelection correspond à un SystemInfo et à un id de Plan (cf. Schema bdd en PJ). Je souhaite sélectionner un SystemSelection à partir de l'id du SystemInfo.
    Voici ma classe SystemSelection
    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
    @Entity
    @Table(name="systemSelection")
    @IdClass(SystemSelectionKey.class)
    public class SystemSelection implements Serializable {
         /**
          * The generated serial version id
          */
         private static final long serialVersionUID = -5714390642967962267L;
     
         @Id @Column(name="plan_id")
         private int planId = 0;
     
         @Id @ManyToOne @JoinColumn(name="system_id")
         private SystemInfo systemInfo = null;
     
         @Column(name="is_visible")
         private boolean isVisible = true;
         //...
    }
    Puis ma classe SystemInfo :
    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
    @Entity
    @Table(name="systemInfo")
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public class SystemInfo {
         /**
          * 
          */
         private static final long serialVersionUID = -2606211766798365116L;
     
         @Id @Column @GeneratedValue(strategy=GenerationType.AUTO)
         private int id = 0;
     
         @Column
         private String name = "";
     
         @Column
         private String description = "";
     
         @Column(name="planmanager_id")
         private Integer planManagerId = 0;
         //...
    }
    Et enfin ma classe SystemSelectionKey :
    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
    @Embeddable
    public class SystemSelectionKey implements Serializable {
         /**
          * 
          */
         private static final long serialVersionUID = -7081405104395508365L;
     
         private SystemInfo systemInfo = null;
         private int planId = 0;
     
         public int getPlanId() {
              return planId;
         }
         public SystemInfo getSystem() {
              return systemInfo;
         }
         public void setPlanId(int planId) {
              this.planId = planId;
         }
         public void setSystem(SystemInfo system) {
              this.systemInfo = system;
         }
         /* (non-Javadoc)
          * @see java.lang.Object#hashCode()
          */
         @Override
         public int hashCode() {
              final int prime = 31;
              int result = 1;
              result = prime * result + planId;
              result = prime * result
                        + ((systemInfo == null) ? 0 : systemInfo.hashCode());
              return result;
         }
         /* (non-Javadoc)
          * @see java.lang.Object#equals(java.lang.Object)
          */
         @Override
         public boolean equals(Object obj) {
              if (this == obj)
                   return true;
              if (obj == null)
                   return false;
              if (getClass() != obj.getClass())
                   return false;
              SystemSelectionKey other = (SystemSelectionKey) obj;
              if (planId != other.planId)
                   return false;
              if (systemInfo == null) {
                   if (other.systemInfo != null)
                        return false;
              } else if (!systemInfo.equals(other.systemInfo))
                   return false;
              return true;
         }
    }
    La "compilation" semble bien se dérouler, mais lorsque je fais ma requête la trace est bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select <liste_des_champs>
    from system this_ inner join systemInfo systeminfo3_ on this_.system_id=systeminfo3_.id 
    where systeminfo1_.id=?
    Cette requête provoque sans grande surprise l'erreur suivante :
    Champ 'systeminfo1_.id' inconnu dans where clause
    Sans grande surprise puisque l'alias "systeminfo1_" n'est pas définit dans la requête.

    Voici ma méthode DAO (j'utilise Spring et HibernateDaoSupport) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public SystemSelection selectSystemSelection(int id) {
         DetachedCriteria criteria = 
              DetachedCriteria.forClass(SystemSelection.class)
                   .createAlias("systemInfo", "systemInfo")
                   .add(Restrictions.eq("systemInfo.id", id))
                   .setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY);
     
         return DataAccessUtils.singleResult(getHibernateTemplate().findByCriteria(criteria));
    }
    Une idée d'où vient le problème ?
    Images attachées Images attachées  

Discussions similaires

  1. [Oracle] modification d'une clé primaire composée
    Par petburn dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2006, 15h58
  2. [clé primaire composée] Champ NULL
    Par hair_peace dans le forum Oracle
    Réponses: 11
    Dernier message: 13/12/2005, 16h09
  3. Réponses: 2
    Dernier message: 26/10/2005, 19h57
  4. Foreign key sur clé primaire composée
    Par mona dans le forum Oracle
    Réponses: 6
    Dernier message: 13/10/2005, 22h36
  5. clé primaire composée de 2 clés étrangères
    Par Tigresse dans le forum Installation
    Réponses: 5
    Dernier message: 28/07/2003, 14h38

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