Error using EntityHome.update with selectOneMenu and selectManyListbox
m4darasz May 5, 2008 11:10 PMHello!
I'm getting an error while trying to update an entity through EntityHome using a JSF form containing selectOneMenu and selectManyListbox.
The error:
sourceId=modositProjekt:pdolgozo[severity=(ERROR 2), summary=(value is not valid), detail=(value is not valid)] sourceId=modositProjekt:pvezeto[severity=(ERROR 2), summary=(value is not valid), detail=(value is not valid)]
Sorry for the Hungarian variable/entity names, I hope you will get it. The main idea that there are two entities: Project (Projekt) and Worker (Dolgozo). Each Project has a leader and several team members (tagok) which are Worker (Dolgozo) objects. I would like to select the leader with a selectOneMenu and the team members with the selectManyListbox. Right now, the edit form gets the data but I unable the make updates because of the error.
JSF form:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
template="layout/template.xhtml">
<ui:define name="body">
<h2>Projekt modositasa</h2>
<h:messages globalOnly="true" styleClass="message"/>
<h:form id="modositProjekt">
<table border="0">
<s:validateAll>
<tr>
<td>Projekt vezeto</td>
<td>
<h:selectOneMenu value="#{projektHome.instance.vezeto}" id="pvezeto">
<s:selectItems value="#{projektvezetok}" var="pvezeto" label="#{pvezeto.username}" />
<s:convertEntity/>
</h:selectOneMenu>
</td>
</tr>
<tr>
<td>Projekttagok</td>
<td>
<h:selectManyListbox value="#{projektHome.instance.tagok}" id="pdolgozo">
<s:selectItems value="#{projektdolgozok}" var="pdolgozo" label="#{pdolgozo.username}" />
<s:convertEntity/>
</h:selectManyListbox>
</td>
</tr>
</s:validateAll>
</table>
<div class="actionButtons">
<h:commandButton id="modisitProjekt" value="Modositas"
action="#{projektHome.update}"/>
</div>
</h:form>
</ui:define>
</ui:composition>Dolgozo class:
@Entity
@Name("dolgozo")
@Table(name="dolgozok")
public class Dolgozo implements Serializable {
private static final long serialVersionUID = 1310777667340045513L;
@Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id;
private Long kulsoid;
private String username;
private String jelszo;
private Byte rang;
// konstruktor
public Dolgozo() {}
public Dolgozo(Long id)
{
this.id = id;
}
// equals, hash override
@Override public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Dolgozo other = (Dolgozo) obj;
if (id != other.id)
return false;
return true;
}
@Override
public int hashCode() {
final long PRIME = 31;
long result = 1;
result = PRIME * result + this.id;
return (int)result;
}
// getter/setter
...
}
Projekt class:
@Entity
@Name("projekt")
@Table(name="projektek")
public class Projekt implements Serializable {
private static final long serialVersionUID = -4958586845730005066L;
@Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id;
@Length(max=40) private String nev;
private String leiras;
@ManyToOne private Dolgozo vezeto;
@ManyToMany(targetEntity = Dolgozo.class, fetch = FetchType.LAZY)
private List<Dolgozo> tagok;
@OneToMany(mappedBy="projekt", targetEntity = Feladat.class,
fetch = FetchType.LAZY)
private List<Feladat> feladatok;
private Date kezdet;
private Date tervvege;
private Date becsultvege;
private Long bekerkoltseg;
private Long tervbevetel;
// konstruktor
public Projekt() {}
public Projekt(Long id, String nev, String leiras, Dolgozo vezeto,
List<Dolgozo> tagok, Date kezdet, Date tervvege, Date becsultvege,
Long bekerkoltseg, Long tervbevetel, List<Feladat> feladatok)
{
this.id = id;
this.nev = nev;
this.leiras = leiras;
this.vezeto = vezeto;
this.tagok = tagok;
this.feladatok = feladatok;
this.kezdet = kezdet;
this.tervvege = tervvege;
this.becsultvege = becsultvege;
this.bekerkoltseg = bekerkoltseg;
this.tervbevetel = tervbevetel;
}
// equalsm hash override
@Override public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Projekt other = (Projekt) obj;
if (id != other.id)
return false;
return true;
}
@Override
public int hashCode() {
final long PRIME = 31;
long result = 1;
result = PRIME * result + this.id;
return (int)result;
}
// getter/setter
...
}ProjektHome:
@Name("projektHome")
public class ProjektHome extends EntityHome<Projekt>
{
@RequestParameter
Long projektId;
@Override
public Object getId()
{
if (projektId==null)
{
return super.getId();
}
else
{
return projektId;
}
}
@Override @Begin
public void create() {
super.create();
}
}When I was doing the new project
form I got the very same error. That time the solution was to add an equals and hash override to the Dolgozok class. There's a similarity with the two problems but I don't know how to solve this one.
Any ideas? Thanks!