Dúvida - Converter - JSF - Primefaces

Olá, estou tentando fazer um selectOneMenu usando primefaces e jsf porém não estou conseguindo salvar o produto que depende da marca. Dá um erro como se o objeto não fosse encontrado ou nulo, porém no form aparece as marcas cadastradas. Acredito que o problema está com o converter.

Entidade Produto:

@Entity
@Table(name = “produto”)
public class Produto implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_PRODUTO")
@SequenceGenerator(name = "SEQ_PRODUTO", sequenceName = "SEQ_PRODUTO")
@Column(name = "produto_id")
private Long id;
@Column(name = "produto_descricao", nullable = false)
private String descricaoProduto;
@Column(name = "produto_valor_custo", nullable = false)
private BigDecimal valorCusto;
@Column(name = "prod_valor_venda", nullable = false)
private BigDecimal valorVenda;
@Column(name = "produto_qt_estoque", nullable = false)
private BigDecimal quantidadeEstoque;
@ManyToOne
@JoinColumn(name = "categoria_produto_id", referencedColumnName = "categoria_produto_id", nullable = false, foreignKey = @ForeignKey(name = "FK_PRODUTO_CATEGORIA"))
private CategoriaProduto categoriaProduto;
@ManyToOne
@JoinColumn(name = "marca_id", referencedColumnName = "marca_id", nullable = false, foreignKey = @ForeignKey(name = "FK_PRODUTO_MARCA"))
private Marca marca;

Form:

            <p:outputLabel for="marca" value="Marca: " />
            <p:selectOneMenu id="marca" 
                             value="#{marcaControle.entidade}" 
                             filter="true" 
                             filterMatchMode="startsWith"
                             converter="#{marcaControle.converter().getAsString()}"
                             >
                <f:selectItem itemLabel="Selecione a Marca" itemValue="" />
                <f:selectItems value="#{marcaControle.listar}" 
                               var="marc" 
                               itemValue="#{marc.id}" 
                               itemLabel="#{marc.descricaoMarca}" />
            </p:selectOneMenu>

Marca Controle:

@Named
@ViewScoped
public class MarcaControle extends AbstractControle<Marca> implements Serializable{

    @Inject
    private MarcaFacade marcaFacade;
    
    public MarcaControle() {
        super(Marca.class);
    }

    @Override
    public AbstractFacade getFacade() {
        return marcaFacade;
    }
    
    public List<Marca> marcaLikeDescricao(String query){
        return marcaFacade.marcaLikeDescricao(query);
    }
  
}

Marca Facade:

public class MarcaFacade extends AbstractFacade<Marca> implements Serializable{

    @Inject
    private EntityManager em;
    
    public MarcaFacade() {
        super(Marca.class);
    }

    @Override
    public EntityManager getEm() {
        return em;
    }
    
    public List<Marca> marcaLikeDescricao(String query){
        Query q = em.createQuery("FROM marca AS m "
           + "WHERE LOWER(m.descricaoMarca) LIKE ('%"+query.toLowerCase()+"%') OR "
           + "LOWER(m.marca_id) LIKE ('%"+query.toLowerCase()+"%') "
           + "ORDER BY m.descricaoMarca");
        return q.setMaxResults(20).getResultList();
    }
    
}

Converter Generico:

public class ConverterGenerico implements Converter {

    private final AbstractFacade abstractFacade;

    public ConverterGenerico(AbstractFacade abstractFacade) {
        this.abstractFacade = abstractFacade;
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return abstractFacade.pesquisarId(Long.valueOf(value));
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return value.toString();
    }

}

Alguém sabe me explicar o porquer ?

no itemValue do f:selectItem eu passo o proprio objeto

Ex:

<p:outputLabel value="Fornecedor:" for="fornecedorProduto"></p:outputLabel>
					<p:selectOneMenu id="fornecedorProduto" value="#{produtoBean.produto.fornecedor}" converter="fornecedorConverter">
						<f:selectItems value="#{produtoBean.fornecedores}" var="f" itemLabel="#{f.nome}" itemValue="#{f}" ></f:selectItems>
					</p:selectOneMenu>
					<p:message for="fornecedorProduto"></p:message>

No Converter eu basicamente uso o entitymanager.find para trazer o objeto e só, bem simples
Você não postou o que o pesquisarId faz…

Sobreescreve o equals e hashCode da sua classe também

Use o Omnifaces, ele já faz a conversão, ai vc só aponta ele no seu selectOneMenu

ex.
<p:selectOneMenu id=“marca"
value=”#{marcaControle.entidade}“
filter=“true"
filterMatchMode=“startsWith"
converter=“omnifaces.SelectItemsConverter”
>
<f:selectItem itemLabel=“Selecione a Marca” itemValue=”” />
<f:selectItems value=”#{marcaControle.listar}“
var=“marc"
itemValue=”#{marc.id}“
itemLabel=”#{marc.descricaoMarca}” />
</p:selectOneMenu>

muito simples.

caso vc use maven, é só add no POM a dependencia do Omnifaces

	<dependency>
		<groupId>org.omnifaces</groupId>
		<artifactId>omnifaces</artifactId>
		<version>1.11</version>
	</dependency>