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 annotations pour cas spécial


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Par défaut Hibernate annotations pour cas spécial
    Hello,

    Je n'arrive pas à trouver les annotations qui conviendrait pour le cas suivant :
    - j'ai une table avec 2 enregistrements : objets A (id 1) et B (id 2)
    - j'ai une table de lien qui détermine quelle est la relation entre les objets (colonne ID_PRIMAIRE et colonne ID_SECONDAIRE)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    table_objet
    ID
    -----
    1
    2
     
    table_objet_lien
    ID_PRIMAIRE  | ID_SECONDAIRE
    -----------------------------
    1                 | 2
    Je ne peux pas changer le modèle existant.
    La relation est one-to-one : un objet a une relation. je suis bloqué sur l'annotation, dans l'entité objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @OneToOne( fetch = FetchType.LAZY, optional=true)
    @JoinColumn(name="ID_PRIMAIRE") ou @JoinColumn(name="ID_SECONDAIRE")
    private LienObjetEntity lienObjetEntity;
    car la relation se fait soit sur le champ ID_PRIMAIRE soit sur ID_SECONDAIRE !
    Merci pour toute suggestion !

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Si vous ne pouvez pas modifier la définition des tables vous ne pourrez pas avoir de "LienObjetEntity" en tant qu'entité sans définir une PK composée sur les 2 champs : une @Entity doit toujours avoir un champ @Id.
    Dans ce cas, un ObjetEntity sans secondaire s'exprime par l'absence de LienObjetEntity.

    Dans ce cas de figure, vous êtes exactement dans une situation similaire au ManyToMany avec entité d'intersection, sujet qui a déjà été abordé dans ces forums.


    Une autre solution est cependant possible sans modifier la définition des tables, en faisant de la table "table_objet_lien" une "secondary table" de la "table_objet" : dans ce cas le lien OneToOne entre l'@Id de ObjetEntity et id_primaire de "table_objet" sera implicite à la déclaration SecondaryTable, et il ne vous reste plus qu'à faire le lien sur "id_secondaire"
    Dans ce cas, un ObjetEntity sans secondaire s'exprime par un id_secondaire NULL.

    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="table_objet")
    @SecondaryTable(name="table_objet_lien", pkJoinColumns=@PrimaryKeyJoinColumn(name="id_primaire")))
    public class ObjetEntity {
     
    @Id
    @Column(name="objet_id")
    Long id ;
     
    @ManyToOne
    @JoinColumn(name="id_secondaire", table="table_objet_lien")
    ObjetEntity mySecondary ;
     
    @OneToMany(mappedBy="mySecondary")
    List<ObjetEntity> myPrimaries ;
    }
    (…même si myPrimaries ne contiendra jamais d'une seule entité si un objet n'est jamais le "secondaire" que d'un seul "primaire"… et que le @ManyToOne cache en pratique un one-to-one.)

    et notez que si cela convient mieux à votre "use case" vous pouvez très bien faire le @PrimaryKeyJoinColumn sur "id_secondaire" et inversez la sémantique de tous les liens… : à vous de voir en fonction de la manière dont la structure de données est manipulée.

  3. #3
    Membre confirmé Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Par défaut
    Merci pour votre réponse détaillée.

    Je ne suis pas sur de comprendre un point : quand dans mon cas je vais récupérer l'entité ID2, et son entité lien_objet, id_primaire=1 et id_secondaire=2.
    Il n'y aura pas de valeur nulle.

    Je ne pense pas que votre solution couvre mon cas ?

    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par rgomes Voir le message
    Merci pour votre réponse détaillée.

    Je ne suis pas sur de comprendre un point : quand dans mon cas je vais récupérer l'entité ID2, et son entité lien_objet, id_primaire=1 et id_secondaire=2.
    Il n'y aura pas de valeur nulle.

    Je ne pense pas que votre solution couvre mon cas ?

    Merci
    Avec la méthode de la @SecondaryTable, vous avez toujours autant de table_objet_lien que de table_objet donc il y aura aussi un record (2,NULL) dans table_objet_lien.

    Dans le premier cas - le pseudo ManyToMany - non, il y aura exactement les mêmes records que dans votre explication.

Discussions similaires

  1. mapping hibernate -> annotation, cas de l'héritage d'id
    Par tchize_ dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/03/2009, 10h12
  2. Problème pour initialiser Hibernate Annotations
    Par ygrim dans le forum Hibernate
    Réponses: 7
    Dernier message: 22/02/2008, 18h38
  3. Annotations - Un cas d'application pour la désérialisation avec XStream
    Par bobuse dans le forum Persistance des données
    Réponses: 3
    Dernier message: 04/07/2007, 12h35
  4. [XSLT][JSP] solution technique pour cas typique
    Par Alix_10 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 04/09/2006, 13h09
  5. Réponses: 2
    Dernier message: 05/01/2004, 11h23

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