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 :

Doublons en base de données


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3
    Par défaut Doublons en base de données
    Bonjour,

    Je suis actuellement en train de me former sur les EJB3. J'utilise un serveur Jboss 4.0

    Je réalise une application ou un auteur écrit des livres et un livre peut être écrit par plusieurs auteurs. J'ai réaliser une classe Livre ainsi qu'une classe Auteur ou l'on trouve une liste de livre.

    J'ai crée :
    • 2 auteurs : auteur1 et auteur2
    • 2 livres : livre1 et livre2
    • l'auteur 1 écrit le livre 1 et le livre 2
    • l'auteur 2 écrit le livre 2


    Lorsque je persiste mes deux auteurs (et uniquement mes auteurs), je me retrouve avec le livre 2 en doublon dans la base. J'utilise des mises à jour en cascade. Toutefois, je ne comprends pas pourquoi je retrouve deux fois dans la base une occurrence du même objet avec des identifiant différents.

    Existe il une solution permettant de palier ce problème ?

    Merci par avance

    Laurent



    Vous trouverez ci-dessous des éléments de mon code :

    ----- Classe Auteur -----

    Code Java : 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
    @Entity
    public class Auteur implements Serializable {
     
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int id = 0;
    	private String nom = "";
    	@OneToMany(cascade=CascadeType.ALL)
    	private Collection<Livre> lstLivre = new ArrayList<Livre>();
     
     
    	public Auteur(String nom) {
    		super();
    		this.id = 0;
    		this.nom = nom;
    	}
     
     
    	public Auteur() {
    		super();
    		this.id = 0;
    		this.nom = "";
    	}
     
     
    	/* get et set */	
    }
    ----- Classe Livre -----

    Code Java : 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
    @Entity
    public class Livre implements Serializable {
     
     
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int id;
    	private String titre = "";
     
    	public Livre(String nom) {
    		super();
    		this.id = 0;
    		this.titre = nom;
    	}
     
    	public Livre() {
    		super();
    		this.id = 0;
    		this.titre = "";
    	}
     
     
    	/* get et set */
    }
    ----- Client -----

    Code Java : 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
    public class Client {
     
    	public static void main(String[] args) throws Exception {
     
    		Context ctx = new InitialContext();
    		ContratRemote p = (ContratRemote) ctx.lookup("ContratBean/remote");			
     
    		Livre l1 = new Livre("livre 1");
    		Livre l2 = new Livre("livre 2");
     
    		Auteur a1 = new Auteur("auteur 1");
    		Auteur a2 = new Auteur("auteur 2");
     
    		a1.addLivre(l1);
    		a1.addLivre(l2);
    		a2.addLivre(l2);
     
    		p.recAuteur(a1);
    		p.recAuteur(a2);		
    	}

    ----- Base de données -----


    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
    mysql> select * from Livre;
     
    +----+---------+
     
    | id | titre   |
     
    +----+---------+
     
    |  1 | livre 1 | 
     
    |  2 | livre 2 | 
     
    |  3 | livre 2 | 
     
    +----+---------+
     
    3 rows in set (0.00 sec)

    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
    mysql> select * from Auteur;
     
    +----+----------+
     
    | id | nom      |
     
    +----+----------+
     
    |  1 | auteur 1 | 
     
    |  2 | auteur 2 | 
     
    +----+----------+
     
    2 rows in set (0.02 sec)

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    p.recAuteur(a1);
    p.recAuteur(a2);

    Tu fais ta sauvegarde en 2 appels au serveur. Le problème est que lors du deuxième appel, le serveur ne sait pas que livre2 est la même instance que celui passé lors du 1er appel.

    Pour résoudre le problème il faut soit que tu récupère l'indentifiant généré pour livre2 lors du premier appel, soit que tu fasse la sauvegarde en une seule opération.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3
    Par défaut
    Merci pour la réponse.

    Réaliser l'opération de sauvegarde en une seule opération n'est pas toujours possible, car je souhaitais sauvegarder les informations au fur et à mesure qu'elles étaient données par l'utilisateur à travers une interface web.

    Je vais quand même faire quelques test sur le sujet pour voir si je peux adapter mon projet.

    Pour la deuxieme solution, je ne comprends pas bien la marche à suivre. Cela signifit il qu'il faille gérer les cascades à la main ?

    Laurent

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/11/2014, 20h15
  2. [AC-2003] erreur doublon dans base de données sans trouver les données
    Par warrios dans le forum Access
    Réponses: 3
    Dernier message: 04/11/2014, 18h19
  3. Eviter les doublons de base de données
    Par Oneor dans le forum Access
    Réponses: 15
    Dernier message: 17/06/2014, 16h55
  4. [QtSql] Eviter doublons dans base de données
    Par joh_77 dans le forum PyQt
    Réponses: 3
    Dernier message: 27/03/2014, 15h10
  5. VB6 : Base de Données / Doublon
    Par pecunia dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/01/2006, 20h46

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