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.