Obter valor do SelectOneMenu SIMPLES (RESOLVIDO)

Amigos, preciso obter o valor de um selectOneMenu da minha pagina XHTM, infelizmente nao estou conseguindo.
Meu selectOneMenu é carregado com algumas informacoes do banco de dados.

image

Abaixo minha pagina xhtml

<p:outputLabel value="Marca" for="marca" />
	<p:selectOneMenu id="marca" value="#{cadastroClienteBean.veiculo.marca}">
		<f:selectItem itemLabel="Selecione a marca" />
		<f:selectItems value="#{cadastroVeiculoBean.listaMarca}" var="marca" itemValue="#{marca}" itemLabel="#{marca.marca}"/>
	</p:selectOneMenu>

Minha entidade Veiculo

private Marca marca;

	@Column(length = 40)
	public Marca getMarca() {
		return marca;
	}

	public void setMarca(Marca marca) {
		this.marca = marca;
	}

Minha classe marca, pois as marcas podem ser inseridas em outra pagina, e listadas no SelectOneMenu

public class Marca implements Serializable {
	
	private String marca;

	@Column(length = 100)
	public String getMarca() {
		return marca;
	}

Meu Converter.

@FacesConverter(forClass = Marca.class)
public class MarcaConverter implements Converter {

	// @Inject
	private Marcas marcas;

	public MarcaConverter() {
		marcas = CDIServiceLocator.getBean(Marcas.class);
	}

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		Marca retorno = null;

		if (value != null) {
			Long id = new Long(value);
			retorno = marcas.porId(id);
		}

		return retorno;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		if (value != null) {
			Marca agenda = (Marca) value;
			return agenda.getId() == null ? null : agenda.getId().toString();
		}

		return "";
	}

}

Entretanto quando tento persistir os dados, ele me da esse erro na pagina.
image

Alguem poderia me dar uma ajuda?

Você sobrescreveu equals e hashCode?

Opa, obrigado por me responder amigo, consegui jogar o valor do meu SelectOneMenu pra uma variavel.

<p:outputLabel value="Marca" for="marca" />
		<p:selectOneMenu id="marca" value="#{cadastroClienteBean.marcaSelecionada}">
			<f:selectItem itemLabel="Selecione a marca" />
			<f:selectItems value="#{cadastroVeiculoBean.listaMarca}" var="marca" itemValue="#{marca}" itemLabel="#{marca.marca}"/>
		</p:selectOneMenu>

Agora estou conseguindo obter o valor em um system.out.printLn normalmente, porem quando atribuo essa variável a minha variavel da entidade veiculo, ele continua nao salvando corretamente.

public class CadastroClienteBean implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private Marca marcaSelecionada;  //JOGUEI PARA ESSA VARIAVEL

        private Veiculo veiculo;


	public void salvar() {

		veiculo.setMarca(getMarcaSelecionada()); //aqui eu jogo o valor da variavel que obtive no selectOneMenu para o campo marca.

		cadastrarCarro();
		this.cadastroClienteService.salvar(this.cliente);

		FacesUtil.addInforMessage("Cadastro Salvo com sucesso!");
	}

No meu banco de dados ele salva assim. Mesmo nao dando nenhum erro. e mesmo eu jogando o valor da variavel seleccionada pra minha entidade de veiculo.

image

O tipo da sua variavel é byte mesmo?

nao nao, ele e do tipo Marca.

estou mapeando ela assim.

public class Veiculo implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;
	private Marca marca;


	@Column(length = 40)
	public Marca getMarca() {
		return marca;
	}

	public void setMarca(Marca marca) {
		this.marca = marca;
	}
.....

E a classe Marca.

public class Marca implements Serializable {


	private static final long serialVersionUID = 1L;
	
	private String marca;
	
	@Column(length = 100)
	public String getMarca() {
		return marca;
	}

	public void setMarca(String marca) {
		this.marca = marca;
	}

Esse é meu Bean, Vou colocar ele todo aqui, que talvez voce identifique alguma coisa que eu nao consegui.

@Named
@ViewScoped
public class CadastroClienteBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private Cliente cliente;

	private Veiculo veiculo;

	private Marca marcaSelecionada;

	@Inject
	private CadastroClienteService cadastroClienteService;

	public CadastroClienteBean() {
		limpar();
	}

	public void limpar() {
		cliente = new Cliente();
		this.veiculo = new Veiculo();

	}

	public void cadastrarCarro() {
		this.veiculo.setCliente(cliente);
		this.cliente.getVeiculo().add(this.veiculo);

	}

	public void salvar() {
		
		System.err.println("marca selecionada" + marcaSelecionada.getMarca());
		cadastrarCarro();
		this.cadastroClienteService.salvar(this.cliente);

		FacesUtil.addInforMessage("Cadastro Salvo com sucesso!");

	}
	
	// carrega o ennum de tipo (FISICA/ JURIDICA)
	public TipoPessoa[] getTipoPessoa() {
		return TipoPessoa.values();
	}

	public Cliente getCliente() {
		return cliente;
	}

	public Veiculo getVeiculo() {
		return veiculo;
	}

	public void setVeiculo(Veiculo veiculo) {
		this.veiculo = veiculo;
	}

	public Marca getMarcaSelecionada() {
		return marcaSelecionada;
	}

	public void setMarcaSelecionada(Marca marcaSelecionada) {
		this.marcaSelecionada = marcaSelecionada;
	}

}

O erro esta ai

Você tem que informar o relacionamento entre as classes, no caso o relacionamento seria Muitos para um, ou seja, muitos carros podem ter uma só marca e uma marca pode ter vários carros.

Troque a sua anotação por @ManyToOne

Certissimo Mike, muito obrigado parceiro. Ainda estou iniciando no quesito Hibernate. Grato

att.

1 curtida