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 :

Dupliquer des données [Mapping]


Sujet :

Hibernate Java

Vue hybride

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 Dupliquer des données
    Bonjour à tous,

    J'ai 3 classes : System, RequirementDetails et Compliance. (Un "requirement" référence 0 ou plusieurs "Compliance" et est stocké dans un "System" - comme une arborescence de fichiers).

    Dans ma base de données, j'ai 1 table "system", 1 table "requirement", une table "compliance", et une table de jointure "requirement_compliance"

    Je veux pouvoir dupliquer tous les systems, requirements et compliances...

    Ça duplique tout mes enregistrements (avec des nouveaux ids, les liens mis à jours, etc...).
    Sauf que ! Sauf que en plus de me dupliquer mes enregistrement, le lien entre Requirement et Compliance est supprimé de la table de jointure. Et voici ce que je trouve dans les logs :
    Hibernate: delete from requirement_compliance where requirement_id=?
    Quelqu'un c'est à quoi c'est dû ? J'ai cette erreur depuis que j'ai ajouté la table de jointure. Avant ça le lien entre requirement et compliance été matérialisé par compliance.requirement_id...

    Voici comment je procède pour dupliquer mes objets (et les sous objets) : je fais un select puis, pour chaque objet de la liste de résultat, je supprime l'objet du cache hibernate (evict()) et je met l'id à 0. Et ainsi de suite pour chaque sous-objet. Example :
    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
    for (RequirementDetails requirement : planSystem.getRequirementsList()) {
    	// Clear from cache
    	this.getHibernateTemplate().evict(requirement);
     
    	// Set the requirement id to 0
    	requirement.setId(0);
     
    	// Link with the "To" planversion
    	requirement.setPlanVersion(planVersionTo);
     
    	for (Compliance compliance : requirement.getCompliancesList()) {
    		// Clear from cache
    		this.getHibernateTemplate().evict(compliance);
     
    		// Set the compliance id to 0
    		compliance.setId(0);
     
    		// Link with the current requirementDetails
    		requirement.addCompliance(compliance);
     
    	}// End For "compliance"
     
    } // End For "requirement"
    Cette solution me permet de garder les liens entre les objets dupliqués...

    Voici le mapping pour ma classe RequirementDetails :
    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="requirementdetails")
    public class RequirementDetails extends AbstractRequirement {
     
    	private static final long serialVersionUID = 6902845569210970629L;
     
    	//@OneToMany(
    		/*mappedBy="requirement",*/
    	@ManyToMany(
    		fetch=FetchType.EAGER,
    		cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    	@JoinTable(
    		name="requirement_compliance", 
    		joinColumns={@JoinColumn(name="requirement_id")},
    		inverseJoinColumns={@JoinColumn(name="compliance_id")}
    	)
    	@OrderBy("moc")
    	private Set<Compliance> compliancesList = new HashSet<Compliance>();
    	//...(
    et celui de compliance :
    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
    @MappedSuperclass
    public abstract class AbstractCompliance {
    	@Id
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int id = 0;
     
    	@OneToOne
    	@JoinColumn(name="moc_id")
    	@OrderBy("name ASC")
    	private Moc moc = null;
     
    	@OneToOne(
    		cascade={
    			CascadeType.MERGE, CascadeType.PERSIST, 
    			CascadeType.REFRESH
    		}
    	)
     
    	//...

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    essayez de retirer requirement.addCompliance(compliance);, après tout vos compliances sont déjà dans requirement.

    A part ça, je ne pense pas que hibernate aie été prévu pour ce genre d'usage. Je préfèrerais utiliser un appel à clone() moi pour avoir un objet tout propre.

  3. #3
    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
    J'ai essayé votre solution en me disant que effectivement c'est plus propre.
    Le problème c'est que j'ai des collections de type PersistentSet dans mes objets. Comment les cloner ?

    Sinon une idée pour mon problème initial ?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    vous les remplacez par des hashset ou autre dans le nouvel objet. Hibernante se contente de l'interface Set, pex importe ce qu'il y a derrière.

  5. #5
    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
    Je vais essayer ça. Mais est-ce que je ne risque pas de perdre les fonctionnalités "orphean removal" et autres en perdant le PersistanceSet ?

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Pour le Set courant, si. Mais a priori (j'ai survolé le thread), ce que vous voulez faire c'est créer un nouvel objet ; pas besoin d'avoir un historique dans ce cas !
    De toute façon, quand l'objet sera sauvegardé, à la recharge il y aura de toute façon un nouveau PersistentSet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Macro pour dupliquer des données
    Par sophang dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 10/10/2014, 17h32
  2. Dupliquer des données de fichier vers fichier
    Par lololebricoleur dans le forum HyperFileSQL
    Réponses: 7
    Dernier message: 28/02/2012, 21h53
  3. Dupliquer des données avec une moyenne
    Par debutant_sql dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/12/2011, 16h47
  4. Réponses: 1
    Dernier message: 13/12/2010, 14h31
  5. dupliquer des données en personnalisant
    Par Invité dans le forum Requêtes
    Réponses: 6
    Dernier message: 14/11/2006, 15h55

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