Bonjour,
J'effectue comme travail pour mes cours une appli web de gestion de projet basé sur les EJB3 (donc sur "hibernate anotations" 3.1 beta 5).
A l'état actuel, c'est presque fonctionnel, cependant j'ai un problème bizarre de mapping... dans certains cas, quand je demande une collection de tâches à un objet projet (cf. le diagramme UML et le code plus bas), la collection retournée contient plusieurs foix le même objet tâche (pourtant dans la base de donnée, la table tache est correcte:elle ne contient pas plusieurs fois la même tâche)
En fait, si une tâche possède 2 changement de status, elle sera présente 2 fois dans la collection, etc...
Cela me fait penser à un "produit cartésien", que obtien quand on oublie une condition lors de la jointure de table en SQL...
Comme je suis débutant dans le domaine de java, et encore plus dans le domaine d'hibernate, je me demandais si quelqu'un pourrait jetter un coup d'oeuil à mes relations et me dire ce qu'il en pense. Parce qu'il me semble avoir fait ça correctement d'après la doc... je suis perdu.
Diagramme des relations qui posent problème :
le code des beans :
Code:
@Entity
@Table(name = "PROJET")
public class Project implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name = "";
private Collection<Task> tasks = new ArrayList<Task>();
//private Collection<EtatChange> etatsChange = new ArrayList<EtatChange>();
public Project() {
}
public Project(String nom) {
this.name = nom;
}
@Id(generate = GeneratorType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String nom) {
this.name = nom;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "project")
public Collection<Task> getTasks() {
return tasks;
}
public void setTasks(Collection<Task> taches) {
this.tasks = taches;
}
}
@Entity
@Table(name = "TACHE")
public class Task implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private Project project;
private Collection<StateChange> statesChange = new ArrayList<StateChange>();
public Task() {
}
@Id(generate = GeneratorType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String nom) {
this.name = nom;
}
@ManyToOne
public Project getProject() {
return project;
}
public void setProject(Project projet) {
this.project = projet;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "task")
public Collection<StateChange> getStatesChange() {
return statesChange;
}
public void setStatesChange(Collection<StateChange> statutsChange) {
this.statesChange = statutsChange;
}
}
@Entity
@Table(name = "STATUTCHANGE")
public class StateChange implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private int id;
private Date dateChange;
private Task task;
private State state;
public StateChange() {
}
@Id(generate = GeneratorType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getDateChange() {
return dateChange;
}
public void setDateChange(Date dateChange) {
this.dateChange = dateChange;
}
@ManyToOne
public State getState() {
return state;
}
public void setState(State statutTache) {
this.state = statutTache;
}
@ManyToOne
public Task getTask() {
return this.task;
}
public void setTask(Task tache) {
this.task = tache;
}
}
@Entity
@Table(name = "STATUTTACHE")
public class State implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private boolean open;
public State() {
}
public State(String nom) {
this.setName(nom);
}
@Id(generate = GeneratorType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String nom) {
this.name = nom;
}
public boolean isOpen() {
return open;
}
public void setOpen(boolean open) {
this.open = open;
}
}