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

JPA Java Discussion :

[JPA / Hibernate / JUnit] Relation ManyToOne


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Par défaut [JPA / Hibernate / JUnit] Relation ManyToOne
    Bonsoir,

    je mets en place une architecture à base de Spring - JPA - Hibernate et j'ai probablement un cas d'école que je n'arrive pas à résoudre car je suis un débutant sur l'utilisation des ORM.

    Voici ma problématique :

    J'ai une entity qu'on va appeler "User" et une autre qu'on appellera "Right".
    En base, la table User a un login, un password mais surtout une clé étrangère pointant sur la table des droits Right.

    J'ai réalisé une génération automatique des entity via Hibernate Tools, j'ai donc "théoriquement" mes model, ma couche DAO et ma couche de Service.
    Je voudrais donc tester le service qui met à jour la liste des utilisateurs (ajout, suppression, selection...)

    Or, je suis totalement paumé avec ces histoires de relation...
    Si qqun pouvait me filer un coup de main, ou bien un lien avec un bon tuto, ca serait vraiment sympa.

    Voici un extrait de mon source :

    USER
    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
     
    @Entity
    @Table(name = "USER", uniqueConstraints = @UniqueConstraint(columnNames = "USR_LOGIN"))
    public class UserAccount implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@Column(name = "USR_ID")
    	@TableGenerator(name="appSeqStore", 
    		table="APP_SEQ_STORE", 
    		pkColumnName="AST_SEQ_NAME",
    		pkColumnValue = "USER.USR_ID", 
    		valueColumnName = "AST_SEQ_VALUE")
    	@GeneratedValue(strategy=GenerationType.TABLE, generator="appSeqStore")  	
    	private Integer id;
     
    	@ManyToOne(fetch = FetchType.LAZY)
    	@JoinColumn(name = "USR_RGT_ID", nullable = false)
    	private UserRight userRight;	
     
    	@Column(name = "USR_NAME", length = 50)
    	private String name;
     
    	@Column(name = "USR_LOGIN", unique = true, nullable = false, length = 20)
    	private String login;
     
    ....
     
    getter & setter
    RIGHT
    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
     
    @Entity
    @Table(name = "RIGHT", uniqueConstraints = @UniqueConstraint(columnNames = "RGT_RIGHTS"))
    public class UserRight implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@Column(name = "RGT_ID")
    	@TableGenerator(name="appSeqStore", 
    		table="APP_SEQ_STORE", 
    		pkColumnName="AST_SEQ_NAME",
    		pkColumnValue = "RIGHT.RGT_ID", 
    		valueColumnName = "AST_SEQ_VALUE")
    	@GeneratedValue(strategy=GenerationType.TABLE, generator="appSeqStore")  		
    	private Integer id;
     
    	@Column(name = "RGT_RIGHTS", unique = true, nullable = false, length = 20)
    	private String rights;
     
    	@Column(name = "RGT_COMMENTS", length = 4000)
    	private String comments;
     
    	@OneToMany(fetch = FetchType.LAZY, mappedBy = "UserRight")
    	private Set<UserAccount> users = new HashSet<UserAccount>(0);
    J'ai retouché un peu les class pour pouvoir gérer les ID avec une stratégie de gestion dans une table (je ne peux pas faire d'auto incrémentation).

    Par contre, j'ai du mal à comprendre comment je dois instancier mes objets dans mes tests unitaires. Je ne sais même pas si ces entités JPA sont fonctionnelles....

    Imaginons un cas simple : ma table RIGHT est déjà initialisée avec des droits ADMIN, REDACTEUR, CONSULTANT.

    Comment créer un nouvel utilisateur dans mon test JUnit ?
    Dois je utiliser la DAO pour faire un getByType afin de récupérer l'objet RIGHT que je veux affecter à mon USER ?

    Un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Test
    public void testAddUser() {
        UserRight userRight = userRightService.getByType("ADMIN");   
        UserAccount userAccount = userAccountService.add("my_user", userRight);
    }
    J'avoue que je trouve cela un peu lourd si c'est le cas.

    Un grand merci par avance à ceux qui pourront m'apporter qq réponses.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Par défaut
    Personne n'a d'avis sur le sujet ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Par défaut
    Toujours pas plus de gens motivés ?

    Par contre, à titre d"info pour ceux que cela intéresse, j'ai fait un test avec le code que j'ai mis dans mon 1er post.
    Ca fonctionne, mais je ne suis tjs pas plus avancé sur "les bonnes pratiques". Je ne sais pas si c'est la bonne chose à faire....c'est fonctionnel mais peut être impropre.

    J'ai beau lire des dizaines d'articles sur les JPA, j'ai un mal fou à comprendre quelle en est la mise en application propre dans une architecture avec Spring, et une implémentation Hibernate avec les dernieres versions des lib le tout en annotation.

  4. #4
    Membre très actif
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 354
    Billets dans le blog
    1
    Par défaut
    la réponse à la plupart de tes questions est dans la doc officiel sur le site springsource.

    t'en es ou t'as avancé?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 165
    Par défaut
    J'ai été obligé de revoir mes entités générées par Hibernate Tools.

    J'ai mis que les collections en lazy loading. J'ai été obligé de passer mon PersistenceContext en EXTENDED pour que cela fonctionne dans un test JUnit mais je doute que cela soit la bonne pratique et concernant les docs Spring, écoutes ca semble un casse tête pour tout le monde pour savoir comment faire du lazy loading via ajax proprement.....tout le monde cherche à savoir si l'entityManager est thread safe ou non, si il faut utiliser en webapp le fameux anti pattern OpenSessionInView etc etc....

    Bref j'ai un truc qui est "fonctionnel" mais peut être pas propre avec un gestion multi user.

  6. #6
    Membre très actif
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 354
    Billets dans le blog
    1
    Par défaut
    Salut désolé je suis pas repassé voir ta réponse
    Si ton problème c'est le test, alors tu peux mettre en place spring+jpa+dbunit tu aura un test fonctionnel
    Si il est question d'ajax la c'est un autre sujet qui a rapport a la sérialisation et la conversation avec le serveur sur un intervalle entre la requête et la session.
    http://blog.xebia.fr/2012/02/03/spri...sez-vos-tests/

    mais aussi http://www.springparlapratique.org/c...core-1.0.0.zip

    Sinon a propos de ta remarque sur le persistence contexte extended il me semble que c'est la bonne solution, pour avoir un session orm ouverte entre deux requetes http

Discussions similaires

  1. [Hibernate][Junit][Debutante] Problème de connection
    Par Lydiane dans le forum Hibernate
    Réponses: 2
    Dernier message: 01/10/2008, 15h56
  2. JPA / Hibernate.
    Par Ho(c)ine. dans le forum Persistance des données
    Réponses: 2
    Dernier message: 23/08/2007, 15h39
  3. [JPA] [EJB3] - Mapping et @ManyToOne erreur
    Par ®om dans le forum JPA
    Réponses: 29
    Dernier message: 04/03/2007, 23h31
  4. [Hibernate]Mapping relation one-to-one
    Par K-Kaï dans le forum Hibernate
    Réponses: 9
    Dernier message: 23/06/2006, 16h02

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