Bom dia Alisson. Não estou usando CDI ainda.
Meu p:selectOneMenu (errei o título desse post colocando h:selectOneMenu):
<p:outputLabel value="Selecione a Empresa:" for="empresa" />
<p:selectOneMenu converter="generic"
value="#{projetoBean.projeto.empresa}" id="empresa">
<f:selectItems value="#{projetoBean.empresas}" var="o"
itemLabel="#{o.razaoSocial}" itemValue="#{o}"
converter="generic" />
</p:selectOneMenu>
Classe Empresa (somente com os métodos reescritos):
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are
// not set
if (!(object instanceof Empresa)) {
System.out.println("Não é instância de EMPRESA");
return false;
}
Empresa other = (Empresa) object;
if ((this.id == null && other.id != null)
|| (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.eyeq.pivot4j.analytics.entity.Empresa[id=" + id + "]";
}
Meu conversor:
@FacesConverter(forClass=Empresa.class, value = "generic")
public class EmpresaConverter implements Converter {
public Object getAsObject(FacesContext ctx, UIComponent component, String string) {
if (string == null) {
System.out.println("string = null");
return null;
}
DAO<Empresa> empresaDao = new DAO<Empresa>(Empresa.class);
Empresa empresa = null;
if ((string != null) && (!string.equals(""))) {
empresa = empresaDao.buscaPorId(Integer.valueOf(string));
}
return empresa;
}
public String getAsString(FacesContext context, UIComponent component,
Object value) {
if (value != null) {
Empresa cat = (Empresa) value;
return String.valueOf(cat.getId());
}
return null;
}
protected void addAttribute(UIComponent component, SampleEntity o) {
String key = o.getId().toString(); // codigo da empresa como chave neste
// caso
this.getAttributesFrom(component).put(key, o);
}
protected Map<String, Object> getAttributesFrom(UIComponent component) {
return component.getAttributes();
}
}
Por fim, o erro que estou recebendo quando seleciono uma empresa no p:selectOneMenu e clico para gravar:
mar 15, 2017 9:03:56 AM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
GRAVE: javax.faces.el.EvaluationException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.adv.martinelli.Comprov.modelo.Empresa