many to many, added element gets removed
ben_utzer Aug 11, 2009 4:13 PMHi,
I cannot manage to update a Set of a many-to-many relation given the code below. The problem is that while the selected gruppe is added to the gruppen-Set on the update model phase it somehow gets lost when personHome.update() is called. This is happening during a long-running conversation.
The jUnit-test-method below executes without failure.
What am I missing here? Any help how to best deal with this situation would be appreciated.
Thanks,
Ben
Person.xhtml:
...
<s:fragment rendered="#{!personHome.edit}">
<div>Klasse</div>
<div>#{personHome.instance.schulklasseGruppe}</div>
</s:fragment>
<s:fragment rendered="#{personHome.edit}">
<label>Klasse</label>
<h:selectOneMenu value="#{personHome.instance.schulklasseGruppe}">
<s:selectItems var="gruppe" value="#{schulklasseGruppenQuery.dataModel}" label="#{gruppe.kennung}">
</s:selectItems>
<s:convertEntity />
</h:selectOneMenu>
</s:fragment>
...
<h:commandButton action="#{personHome.update}" value="Update" />
...Person.java (personHome.instance):
@Entity
public class Person implements Serializable {
...
@Transient
private Gruppe schulklasseGruppe;
@ManyToMany()
@JoinTable(name = "gruppe_person", joinColumns = @JoinColumn(name = "person_id"), inverseJoinColumns = @JoinColumn(name = "gruppe_id"))
private Set<Gruppe> gruppen = new HashSet<Gruppe>();
public Gruppe getSchulklasseGruppe() {
if(this.schulklasseGruppe == null && !this.gruppen.isEmpty()) {
for (Gruppe gruppe : this.gruppen) {
if(Boolean.TRUE.equals(gruppe.getGruppentyp().getSchulklasse())) {
this.schulklasseGruppe = gruppe;
}
}
}
return schulklasseGruppe;
}
public void setSchulklasseGruppe(Gruppe schulklasseGruppe) {
if(!this.gruppen.isEmpty()) {
Gruppe toRemove = null;
for (Gruppe gruppe : this.gruppen) {
if(Boolean.TRUE.equals(gruppe.getGruppentyp().getSchulklasse())) {
toRemove = gruppe;
}
}
if(toRemove != null) {
this.gruppen.remove(toRemove);
toRemove.getPersonen().remove(this);
}
}
if(schulklasseGruppe != null) {
this.gruppen.add(schulklasseGruppe);
schulklasseGruppe.getPersonen().add(this);
}
this.schulklasseGruppe = schulklasseGruppe;
}
...
}
Gruppe.java
@Entity
public class Gruppe implements Serializable {
private String bezeichnung;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "gruppentyp_id")
private Gruppentyp gruppentyp;
@Id
@Column(name = "gruppe_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToMany(mappedBy = "gruppen")
private Set<Person> personen = new HashSet<Person>();
...
}
jUnit-Test:
@Test
public void testSetSchulklasseGruppe() {
EntityManager em = getEntityManagerFactory().createEntityManager();
em.getTransaction().begin();
Person p = em.find(Person.class, new Integer(4218));
int anzahlGruppen = p.getGruppen().size();
Gruppe schulklasseGruppe = em.find(Gruppe.class, 13);
p.setSchulklasseGruppe(schulklasseGruppe);
em.flush();
em.getTransaction().commit();
p = em.find(Person.class, new Integer(4218));
assertEquals(anzahlGruppen + 1, p.getGruppen().size());
em.close();
}