-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: JPA + Hibernate + ManyToMany problème @MapKey
PostPosted: Mon Nov 21, 2011 7:07 am 
Newbie

Joined: Mon Nov 21, 2011 7:00 am
Posts: 4
Bonjour à tous !

En lisant le livre d'Anthony PATRICIO : Java Persistence et Hibernate, je suis tombé sur une gestion d'une association ManyToMany qui correspond à mon besoin, c'est à dire :
- avec des champs supplémentaires dans la table d'association.
- l'association entre la table mère et la table d'association est une composition.

La voici l'exemple du livre :
Code:

[Coach]<> ----> *[Season]* ----> [Team]

// Coach.java
@Entity
public class Coach {
   @Id
   @GeneratedValue
   private int id;

   @ManyToMany
   @MapKey
   private Map<Season,Team> teams = new HashMap<Season,Team>();

   private String name;

   public int getId() {
      return id;
   }

   public void setId(int id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public Map<Season, Team> getTeams() {
      return teams;
   }

   public void setTeams(Map<Season, Team> teams) {
      this.teams = teams;
   }
}

// Season.java
@Embeddable
public class Season {
   private Date startDate;
   private Date endDate;
   public Date getStartDate() {
      return startDate;
   }
   public void setStartDate(Date startDate) {
      this.startDate = startDate;
   }
   public Date getEndDate() {
      return endDate;
   }
   public void setEndDate(Date endDate) {
      this.endDate = endDate;
   }
}

// Team.java
@Entity
public class Team {
   @Id
   @GeneratedValue
   private int id;

   private String name;

   public int getId() {
      return id;
   }

   public void setId(int id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}


L'exemple du livre (extrait du code source ci-dessus ou téléchargeable ici http://www.editions-eyrolles.com/Livre/9782212122596/java-persistence-et-hibernate est un projet Eclipse avec Embedded JBoss.
Cette exemple fonctionne parfaitement dans cet environnement.

Mais dans les environnements suivants :
- JBoss AS 5.0.1 et EJB3 (en mode TransactionManagementType.BEAN ou TransactionManagementType.CONTAINER)
- Spring pour la l'injection de dépendance et la gestion des transactions

Au moment ou j'appel la fonction getKey() (dans la transaction) de la propriété "private Map<Season,Team> teams" :

Code:
   [...]
   for (Entry<Season, Team> entry : coach.getTeams().entrySet()) {
      System.out.println(entry.getValue().getName());
      System.out.println(entry.getKey().getStartDate());
      System.out.println(entry.getKey().getEndDate());
   }
   [...]


j'ai l'erreur suivante :

Code:

java.lang.ClassCastException: java.lang.Long cannot be cast to com.et.Season


Si quelqu'un comprend le problème...

Merci.


Top
 Profile  
 
 Post subject: Re: JPA + Hibernate + ManyToMany problème @MapKey [Résolu]
PostPosted: Tue Nov 22, 2011 9:38 am 
Newbie

Joined: Mon Nov 21, 2011 7:00 am
Posts: 4
Bonjour à tous !

J'ai finalement réglé mon problème.
En fait, l'annotation @MapKey décrite dans le livre d'Anthony PATRICIO est celle d'Hibernate alors que j'utilise celle de JPA 2 ! Une erreur de débutant !
Cette annotation Hibernate est aujourd'hui dépréciée, et est remplacée par l'annotation @MapKeyColumn dans JPA 2.
Tout fonctionne correctement maintenant.

D'autre part comme la table Season est la clé dans la Map, j'ai du redéfinir les fonctions equals() et hash().
J'ai aussi ajouté le champs "private int teamKey;" dans la table Season que fonctions equals() et hash() prennent en compte.
Pour réinitialiser ce champs j'ai ajouté addTeam() dnas la classe Coach :
Code:
public void addTeam(Date startDate, Date endDate, Team team) {
   Season season = new Season();

   season.setStartDate(startDate);
   season.setEndDate(endDate);
   season.setTeamKey(team.getId());
   teams.put(season, team);
}


De cette manière je peut avoir plusieurs Season de même date pour le même Coach. Ça peut paraître idiot dans cet exemple mais dans mon cas d'utilisation ça a tout son sens.

Merci.

Alexandre.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.