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 :

Problème d'ajout d'objet avec clé étrangère


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut Problème d'ajout d'objet avec clé étrangère
    Bonjour,


    J'ai un problème, je crois comprendre son origine mais je ne sais pas vraiment quelle est la solution à mettre en place, c'est pourquoi je me tourne vers vous.

    En fait, j'ai un objet Dossier qui contient une collection d'élément Document.
    J'utilise les annotations CollectionsOfElments car avec les annotations OneToMany cela ne fonctionnait pas.

    Du coup actuellement, j'ai ceci :

    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
     
    @Entity
    public class Dossier implements Serializable {
    ...
    	@CollectionOfElements
    	@JoinTable(name = "dossier_document_join", joinColumns = @JoinColumn(name = "file"))	
    	private List<Document> documents;
    ...
     
     
    @Entity
    public class Document implements Serializable{
    	@Id
    	private String file;
     
    	@CollectionOfElements
    	@JoinTable(name = "document_properties_join")
    	private List<String> properties;
     
    	public String getFile() {
    		return file;
    	}
     
    	public void setFile(String file) {
    		this.file = file;
    	}
     
    	public List<String> getProperties() {
    		return properties;
    	}
     
    	public void setProperties(List<String> properties) {
    		this.properties = properties;
    	}
     
    }
    Hors, lorsque je veux ajouter un objet Document à mon Dossier, j'ai une erreur telle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ERROR JDBCExceptionReporter:101 - ERREUR: une instruction insert ou update sur la table « dossier_document_join » viole la contrainte de clé
    étrangère « fk53b74f5ae92397f4 »
      Détail*: La clé (documents_file)=(data/dossiers/1/documents/Hiver.jpg) n'est pas présente dans la table « document ».
    14:55:23,576 ERROR AbstractFlushingEventListener:324 - Could not synchronize database state with session
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    ...
    Je pense que cela vient du fait que l'objet Document n'est pas encore enregistré en base lorsque je demande à l'ajouter pour l'objet Document. Aussi je voulais savoir comment fait on pour préciser que l'objet Document dépend entièrement de l'objet Dossier. Sans lui, il n'a pas lieu d'exister... ?

    Ou alors, peu être cela bien d'autre part ?

    Je vous remercie d'avance.

  2. #2
    Membre habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    Il faut rajouter l'attribut cascade et le qualifier en fonction de ce que tu cherches à obtenir.
    C'est le chapitre persistance transitive dans la documentation d'Hibernate:
    http://www.hibernate.org/hib_docs/v3...ate-transitive

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Ben en fait, je viens de modifier ma classe, et puis, je m'aperçois que tout se sauve, par contre, lorsque je supprime un document de ma liste et que je sauve à nouveau, celui ci n'est pas détruit en base ?
    Comment faut il faire pour dire que si il est n'est plus attaché à l'objet il doit être détruit. Je croyais que cela se faisait automatiquement avec Cascade= ALL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	@CollectionOfElements
    	@JoinTable(name = "dossier_document_join", joinColumns = @JoinColumn(name = "file"))	
    	@Cascade(value = CascadeType.ALL)
    	private List<Document> documents;

    Et dans ma class Document :
    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
     
    @Entity
    public class Document implements Serializable{
    	@Id
    	private String file;
     
    	@Cascade(value=CascadeType.ALL)
    	@CollectionOfElements
    	@JoinTable(name="document_properties_join", joinColumns = @JoinColumn(name = "propriete"))
    	private List<Propriete> properties;
     
    	@Override
    	public boolean equals(Object obj) {
    		if (obj instanceof Document) {
    			Document obDoc = (Document) obj;
    			return obDoc.getFile().equals(getFile());
    		}
    		return false;
    	}
    ...

  4. #4
    Membre habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    La documentation hibernate dit ceci:
    En outre, une simple référence à un enfant d'un parent persistant aura pour conséquence la sauvegarde/mise à jour de l'enfant. Cette métaphore est cependant incomplète. Un enfant qui devient non référencé par son parent n'est pas automatiquement supprimée, excepté dans le cas d'une association <one-to-many> mappée avec cascade="delete-orphan"
    Essaye avec cascade="all,delete-orphan"

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Comment tu fais pour annoter plusieurs type de cascade ?

    @Cascade(value = CascadeType.DELETE_ORPHAN, CascadeType.ALL)

    Ceci par exemple n'est pas possible ...

  6. #6
    Membre habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    Je préfère les fichiers de mapping aux annotations, cela me permet de garder une couche d'objets métiers indépendante de la persistance.
    Je ne sais donc pas comment faire pour annoter plusieurs type de cascade.

    Par contre j'ai trouvé ça sur le net, à essayer: (tiens nous au courant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Oui c'est cela !
    Donc, je teste... Mais mon document reste toujours en base...
    En fait, je fais juste une remove de mon document dans la liste... Pensant que si la liste ne le contient plus, il sera détruit ensuite...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Bonjour à nouveau
    En fait, pour l'ajout et la sauvegarde d'objet dans la base, tout se passe bien avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @OneToMany(fetch = FetchType.EAGER)
    	@Cascade(value = { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    	private List<Document> documents;
    Cependant, si jamais je supprime l'objet qui contient cette donnée membre de la base, et que je tente de le resauver par la suite, j'ai un problème :
    Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

    Je ne comprends pas pourquoi, mes sessions et transactions sont correctement ouverte et fermée à chaque appel d'une demande d'action dans la base grâce au mécanisme des intercepteurs.
    De plus, c'est bien saveOrUpdate que j'utilise pour sauver à nouveaux mon objet.
    En fait, pour clarifier un peu plus, j'ai un fichier xml dans lequel je sauve mes objects persitants, puis je les supprime effectivement de ma base pour voir si le fait de réimporter les objets ensuite fonctionne... Mais cela ne marche pas ...?
    Auriez vous une idée de l'origine de ce problème ?

Discussions similaires

  1. Problème dans noms d'objets avec espaces
    Par Macadoshis dans le forum Débuter
    Réponses: 1
    Dernier message: 14/05/2010, 18h10
  2. Ajout d'objet avec FileSystemAccessRule
    Par Zhamy dans le forum C#
    Réponses: 2
    Dernier message: 11/05/2010, 13h26
  3. Problème de type d'objet avec xmlbeans
    Par nicocolt dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 31/08/2009, 16h10
  4. Criteria ajout d'objets avec une jointure
    Par Sniper37 dans le forum Hibernate
    Réponses: 11
    Dernier message: 09/06/2008, 17h15
  5. [IE]Problème d'ajout de contenu avec innerHTML
    Par Pollux dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 09/06/2006, 13h27

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