[RESOLVIDO]Duvida com <h:selectOneMenu>

26 respostas
G

Galera estou com uma duvida cruel,
estou começando com jsf e hibernate e tenho um relacionamento OneToMany , no caso marca > produto
uma marca pode ter varios produtos e um produto uma unica marca,
no cadastro do produto queria pode mostrar as marcas ja cadastradas pra ele esta podendo escolher uma e relacionar ela com o produto
isso via <h:selectOneMenu> eu consigo listar as marcas nele so que nao consigo pegar o objeto (marca) que ele seliciono.
Alguem pode me dar uma luz

26 Respostas

T

Você precisa criar uma classe converter para sua entidade marca. Assim você consegue recuperar o objeto dentro do seu h:selectOneMenu.

J

Eu faço um array de selectedItem e coloco as marcas com o código e descrição nesse array e ao selecionar uma marca será atribuído o código da mesma.

G

galera mais não tenho nem ideia de como fazer isso
se vocês puderem me ajudar…

eu procurei alguns tópicos aki no forum mais estão muito confusos ou a pessoa não coloca o resultado dela,e na internet ta mais fda ainda

J

Segue exemplo abaixo:

Bean

public List<SelectItem> getMarcas() { this.marcas = new ArrayList<SelectItem>(); List<Marca> mar = marcaDAO.getMarcas(); this.marcas .add(new SelectItem(0, "Selecione")); for (Marca m : mar) { this.marcas .add(new SelectItem(m.getId(), m.getDescricao())); } return this.marcas ; }

XHTML

<h:outputText value="Marca" /> <h:selectOneMenu id="marca" value="#{bean.classe.marca.id}"> <f:selectItems value="#{bean.marcas}" /> </h:selectOneMenu>

G

mais nesse caso como vou faer o relacionamento
como vo atribuir o produto a esta marca ?
se puder postar o codigo deste bean completo vou agradecer.

G
private long id;
	private List<Marca> listamarca;
	private ArrayList<SelectItem> marca;
	private Produto produto;
	

	public List<SelectItem> getMarcas(){
		this.marca = new  ArrayList<SelectItem>();
		if (listamarca == null) {
			listamarca = (List<Marca>) new MarcaDao().listaMarca();
		}
		this.marca.add(new SelectItem(0,"Selecione"));
		for(Marca m:listamarca){
			this.marca.add(new SelectItem(m.getIdMarca(),m.getMarca()));
		}
		
		return this.marca;
	}

seria mais ou menos isso meu bean?

G

vish…
agora ele ta me retornando nulo
falando que meu objeto ta nulo
¬¬

J

Deve ter esquecido de “dar new” nele.

L

A lista de SelectItem so é Obrigatória no JSF1.2.
no JSF2 vc pode utilizar diretamente a lista do seu próprio objeto que seria o “Produto”.

Existem algumas maneiras de se fazer isto, mais pelo meu ponto de vista a mais correta seria a implementação de um converter.
Este converter serve para informar ao componente como ele deve escrever o seu item do combo na pagina e como ele deve realizar o caminho inverso (tornar aquela string em um objeto).

Pesquise por converter JSF no google que vc encontrara muito material.

abç

G

pesquisei mais nao axei nada muito didatico não
ainda to agarrado nsito

A

Olá pessoal, aproveitando o tópico

estou com uma duvida referente a um selectOneMenu tambem. Preciso realizar a seguinte função:

  • Tenho duas tabelas: Cliente e Atendimento (relacionamento 1xN)

  • O formulario que popula a tabela cliente, tem os dados: nome, endereço, bairro, cep, telefone, … (cadastro básico de clientes)
    Até aqui tudo bem cadastra, edita, consulta e exclui normalmente, a minha duvida começa agora:

  • No formulario para popular a tabela Atendimento tenho os seguintes inputText: Codigo, Cliente, Endereço, Bairro, Problema, Descrição.

  • Para o campo cliente, tenho um selectOneMenu que busca o nome do cliente na tabela Cliente (consigo fazer ate esse ponto)
    O que preciso fazer é, quando selecionar um cliente nesse selectOneMenu, sejam carregados os respectivos dados desse cliente nos campos Endereco e Bairro
    para que não seja necessário cadastrar os dados do cliente novamente. Após carregar esses dados, termino de preencher os dados Problema e Descrição e salvo nessa tabela Atendimento.

É possivel fazer isso? Eu sei que preciso relacionar as tabelas, o que já foi feito, porém nao sei qual seria o proximo passo para realizar essa tarefa.

Podem me dar uma ajuda?? Utilizo JSF2 + Primefaces 3.3 + Mysql 5 + Eclipse Helios.

Obrigado.

G

ninguem?
help galera

A

Geeh_All,

Qual a sua dúvida/problema neste momento? Dificuldade em conseguir montar um Converter, como sugerido pelo Lucas Abbatepaolo? Você procurou materiais/links? Teve dúvidas neles?

Ou você está com dificuldade em algum outro ponto? Neste caso, qual seria?

Lembre-se que o fórum não é para postar solução de problemas, e sim para te ajudar a resolvê-los.

ahdeerre,

Sim, é possível fazer isso. Procure exemplos de utilização de Ajax. O Showcase do Primefaces tem bosn exemplos.

G

Alys,

eis o meu bean

package visao;

import implementacoes.InterfaceBean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;

import org.primefaces.event.RowEditEvent;

import dao.MarcaDao;
import dao.ObjectDao;
import entidade.Marca;
import entidade.Produto;


/**
 * Bean da classe Produto responsavel por gerenciar os produtos na cama de visão
 * Como faz conexão com o banco e sai da JVM implementa Serializable.
 * implementa InterfaceBean que tem os metodos basicos dos Bean da aplicação(camada de visão)
 * @author Rangel
 * @version 1.0
 * @since 25/09/2012
 * @see implementacoes.InterfaceBean
 * @see java.lang.Object
 * @see java.io.Serializable
 */
@ManagedBean(name="produtobean")
@RequestScoped
public class ProdutoBean implements Serializable,InterfaceBean {

	/**
	 * numero gerado aleatoriamente pela Serializable 
	 * @serial serialVersionUID
	 */
	private static final long serialVersionUID = -9193715420049605319L;

	
	private long id;
	private List<Marca> listamarca;
	private ArrayList<SelectItem> marcas;
	private Produto produto ;
	private Marca marca;

	public List<SelectItem> getMarcas(){
			if (marcas == null) {
				
		
		this.marcas = new  ArrayList<SelectItem>();
		if (listamarca == null) {
			listamarca = (List<Marca>) new MarcaDao().listaMarca();
		}
		this.marcas.add(new SelectItem(0,"Selecione"));
		for(Marca m:listamarca){
			this.marcas.add(new SelectItem(m.getIdMarca(),m.getMarca()));
		}
		
			}
		return this.marcas;
	}
	public void setMarca(Marca marca) {
		this.marca = marca;
	}


	public Produto getProduto() {
		return produto;
	}


	public void setProduto(Produto produto) {
		this.produto = produto;
	}


	public ArrayList<SelectItem> getMarca() {
		return marcas;
	}


	public void setMarca(ArrayList<SelectItem> marca) {
		this.marcas = marca;
	}


	public List<Marca> getListamarca() {
		if (listamarca == null) {
			listamarca = (List<Marca>) new MarcaDao().listaMarca();
		}
		
		return this.listamarca;
	}
	
	public long getId() {
		return id;
	}


	public void setId(long id) {
		this.id = id;
	}


	public void setListamarca(List<Marca> listamarca) {
		this.listamarca = listamarca;
	}


	public List<Object> listarObject() {
		return null;
	}

	public Object prepararAdicionarObject() {
		produto = new Produto();
		return produto;
	}

	public void editObject(RowEditEvent event) {
		
	}

	public String deleteObject(RowEditEvent event) {
		return null;
	}

	public void saveObject() {
		ObjectDao dao = new ObjectDao();
		dao.save(produto);
	}

}

eis o meu converter

package implementacoes;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import dao.MarcaDao;
import entidade.Marca;

@FacesConverter(value="converterMarca")
public class ConverterMarca implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		if (value != null && !value.equals("")) {
		MarcaDao dao = new MarcaDao();
		return dao.find(Long.valueOf(value));
		}
		return null;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		if (value instanceof Marca) {
		Marca marca = (Marca) value;
		return String.valueOf(marca.getIdMarca());
		}
		return "";
	}

}

eis a minha view jsf

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui">

<h:head></h:head> 
<h:body> 
<h:form id="teste">
<p:commandLink value="Novo Livro"
					actionListener="#{produtobean.prepararAdicionarObject()}"
					onclick="adicionarUsuario.show()" />
					</h:form>
<p:dialog header="Cadastro Usuario" id="newuser"
		widgetVar="adicionarUsuario" dynamic="true" showEffect="slide">

	<h:form id="cadastro">
		<h:panelGrid id="cadastroProduto" columns="2" >
			<h:outputLabel for="produto" value="Produto: " />
			<h:inputText id="produto" value="#{produtobean.produto.produto}"/>
			
			<h:outputLabel for="marca" value="Marca" />  
   				 <h:selectOneMenu id="marca" value="#{produtobean.produto.marca}">  
        			  <f:selectItems value="#{produtobean.marcas}" />
        			  <f:converter converterId="converterMarca"/>
				</h:selectOneMenu>  
				<p:commandButton actionListener="#{produtobean.saveObject()}" value="Cadastrar"/>
		</h:panelGrid>
	</h:form>
	</p:dialog>

</h:body> 
</html>

a minha duvida e ele me retorna esta mensagem GRAVE: org.hibernate.exception.ConstraintViolationException: Column ‘marca_idMarca’ cannot be null

A

Geeh_All,

Não tem stack trace do erro no log? Outra: você já debugou o ConverterMarca para ver o que está sendo feito e quais valores estão chegando?

Não sei como está a sua classe Marca, mas, considere que, para evitar erros de validação do JSF, você precisa sobrescrever o equals() e o hashCode() da classe.

L

Como o pessoal falou, a melhor forma é voce utilizar um Converter, pois assim, ele já vai setar a entidade direto na tua classe, assim que voce selecionar o <H:selectOneMenu />

da uma olhada nesse exemplo nesse site, muito bom

http://www.rponte.com.br/tag/entity-converter/

G

help?

G

alys eu ja sobrescrevi os metodos sim…
e ele continua dando erro ,debuguei aqui e acho que ele nem chega a chamar o converter
segue o erro em sí

GRAVE: org.hibernate.exception.ConstraintViolationException: Column 'marca_idMarca' cannot be null
	at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74)
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
	at $Proxy22.executeUpdate(Unknown Source)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2870)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3381)
	at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
	at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
	at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203)
	at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)
	at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167)
	at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:320)
	at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287)
	at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
	at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
	at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
	at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
	at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:757)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:749)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:745)
	at dao.ObjectDao.save(ObjectDao.java:47)
	at visao.ProdutoBean.saveObject(ProdutoBean.java:121)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:777)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:508)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'marca_idMarca' cannot be null
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2371)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2355)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
	... 58 more

08/10/2012 10:14:01 com.sun.faces.context.AjaxExceptionHandlerImpl log
GRAVE: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=cadastro:j_idt9, Message=/produto.xhtml @28,86 actionListener="#{produtobean.saveObject()}": org.hibernate.exception.ConstraintViolationException: Column 'marca_idMarca' cannot be null
08/10/2012 10:14:01 com.sun.faces.context.AjaxExceptionHandlerImpl log
GRAVE: /produto.xhtml @28,86 actionListener="#{produtobean.saveObject()}": org.hibernate.exception.ConstraintViolationException: Column 'marca_idMarca' cannot be null
javax.faces.event.AbortProcessingException: /produto.xhtml @28,86 actionListener="#{produtobean.saveObject()}": org.hibernate.exception.ConstraintViolationException: Column 'marca_idMarca' cannot be null
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:777)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:508)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.hibernate.exception.ConstraintViolationException: Column 'marca_idMarca' cannot be null
	at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74)
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
	at $Proxy22.executeUpdate(Unknown Source)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2870)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3381)
	at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
	at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
	at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203)
	at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)
	at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167)
	at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:320)
	at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287)
	at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
	at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
	at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
	at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
	at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:757)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:749)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:745)
	at dao.ObjectDao.save(ObjectDao.java:47)
	at visao.ProdutoBean.saveObject(ProdutoBean.java:121)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148)
	... 25 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'marca_idMarca' cannot be null
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2371)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2355)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
	... 58 more
R

Pro metodo saveObject() ser um actionListener vc precisa passar um ActionEvent pra ele.

Portanto das duas uma:

  • Muda de actionListener pra action e mantem saveObject();
  • Muda a assinatura pra saveObject(ActionEvent evt);
G

raf4ever

continua dando o mesmo erro
tudo isto por causa de um maldito converter

A

Oi Geeh_All,

Sua classe Converter está sendo chamada? Qual valor chega no método getAsObject()? Se não passar por ele, olha se chama o getAsString(), e olha qual valor chega. Feito isso, olhe se o find do DAO está retornando o esperado.

Outra coisa, olhe o html gerado. Repare se o componente está com id setado, e se cada está com o value definido corretamente.

Se nada disso funcionar, faz sem o primefaces, para saber se é alguma coisa nele que está atrapalhando.

Uma boa sugestão quando você está parado em um erro é fazer tentativas por etapas. Tire componentes e veja o que funciona e o que continua com erro. Repita isso até funcionar normal, depois vai acrescentando um a um até encontrar o problema. Eu sei que isso é trabalhoso, mas… bem vindo ao mundo da programação 8)

G

Alys,

so confere para ver se meu converter esta do modo certo

package implementacoes;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import dao.MarcaDao;
import entidade.Marca;

@FacesConverter(value="converterMarca")
public class ConverterMarca implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		if (value != null && !value.equals("")) {
		MarcaDao dao = new MarcaDao();
		return dao.find(Long.valueOf(value));
		}
		return null;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		if (value instanceof Marca) {
		Marca marca = (Marca) value;
		return String.valueOf(marca.getIdMarca());
		}
		return "";
	}

}
A

Cara,

Os métodos e as anotações estão certas. Deve estar vindo algo errado da tela. Olha só, montei um exemplo básico aqui, a partir do seu, e estou recuperando o valor sem problemas no ManagedBean.

Converter:

@FacesConverter(value="converterMarca")  
public class ConverterMarca implements Converter {  
  
    @Override  
    public Object getAsObject(FacesContext context, UIComponent component, String value) {  
        if (value != null && !value.equals("")) {
        	Marca marca = new Marca(123, "Setado no Converter");
	        return marca;  
        }  
        return null;  
    }  
  
    @Override  
    public String getAsString(FacesContext context, UIComponent component, Object value) {  
        if (value instanceof Marca) {  
	        Marca marca = (Marca) value;  
	        return String.valueOf(marca.getId());  
        }  
        return "";  
    }  
  
}

Página:

<h:form id="cadastro">  
        <h:panelGrid id="cadastroProduto" columns="2" >  
            <h:outputLabel for="marca" value="Marca" />    
                 <h:selectOneMenu id="marca" value="#{listaBean.marcaSelecionada}">    
                      <f:selectItems value="#{listaBean.marcas}" />
                      <f:converter converterId="converterMarca"/>
                </h:selectOneMenu>    
                <h:commandButton actionListener="#{listaBean.saveObject()}" value="Cadastrar"/>  
        </h:panelGrid>  
    </h:form>

Managed Bean:

@ManagedBean(name = "listaBean")  
@RequestScoped  
public class ListaExemploBean {
private Marca marcaSelecionada;
	
	public List<Marca> getMarcas(){
		List<Marca> marcas = new ArrayList<Marca>();
		
		marcas.add(new Marca(123, "Teste 1"));
		marcas.add(new Marca(124, "Teste 2"));
		marcas.add(new Marca(125, "Teste 3"));
		
		return marcas;
	}
	public void saveObject() {  
		if (this.marcaSelecionada != null){
			System.out.println("salvar! Marca: "+marcaSelecionada.getId() + " - " +marcaSelecionada.getDesc());
		} else {
			System.out.println("Marca nula ou não selecionada");
		}
	}

Ao debugar, na linha 06 da classe ConverterMarca, o “value” vem com o id da opção selecionada na tela. E ao executar a linha 17 do Bean, aparece normal para mim no log “salvar! Marca: 123 - Setado no Converter

Repare que eu fiz sem Primefaces (montei rápido aqui só para auxiliar com o problema). Se tivesse que apostar, seriam duas coisas:

  1. Algum problema relacionado ao Primefaces, seja faltando alguma configuração ou alguma outra coisa. Refaz a sua tela sem usar componentes dele, e veja se funciona.

  2. Verifique o HTML montado da sua página. Olhe se o componente é montado corretamente. Olha só como ficou o desse exemplo que montei:

<select id="cadastro:marca" name="cadastro:marca" size="1"> <option value="123" selected="selected">Teste 1</option> <option value="124">Teste 2</option> <option value="125">Teste 3</option> </select>

E, mais uma vez, recomendo que você debugue o código, e verifique se o fluxo e os valores retornados são os esperados. As vezes o problema pode ser algo simples, mas que só olhando o fonte você não enxerga.

A

Alys:
Geeh_All,

Qual a sua dúvida/problema neste momento? Dificuldade em conseguir montar um Converter, como sugerido pelo Lucas Abbatepaolo? Você procurou materiais/links? Teve dúvidas neles?

Ou você está com dificuldade em algum outro ponto? Neste caso, qual seria?

Lembre-se que o fórum não é para postar solução de problemas, e sim para te ajudar a resolvê-los.

ahdeerre,

Sim, é possível fazer isso. Procure exemplos de utilização de Ajax. O Showcase do Primefaces tem bosn exemplos.

Alys

já tinha visto varios exemplos do showcase, mas nao tinha encontrado nehum exemplo. Ontem estive olhando mais atentamente os exemplos a procura desses que utilizam ajax como você indicou e encontrei esse exemplo que se aproxima do que preciso, porem eles utilizam dois selectOneMenu: http://www.primefaces.org/showcase/ui/pprSelect.jsf

Seria isso mesmo?

G

Alys ,
Segui sua dica debuguei ,testei e percebi que sempre o meu objeto setado no seleconemenu vai nullo ou seja ele nao recebe a referencia
ate no seu teste que tentei implementar aki deu a mesma coisa

G

Consegui Galera!!

Brigadão a todos …

o problema era no meu converter e como esta chamando no jsf

vo colocar meu bean, jsf,converter e a classe marca com os metodos equals e hascode sobrescritos

Converter

package implementacoes;

import java.lang.reflect.Field;
import java.util.Collection;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

@FacesConverter(value="converterMarca")
public class ConverterMarca implements Converter {

	
	@Override  
    public Object getAsObject(FacesContext context,  
        UIComponent component, String value) {  
        if (value == null || value.equals(""))  
            return null;  
  
        try{  
            Long id = Long.valueOf(value);  
            Collection items =  (Collection) component.getAttributes().get("items");  
            return findById(items, id);  
        }catch(Exception ex){  
            throw new ConverterException("Não foi possível aplicar conversão de item com valor ["+value+"] no componente ["+component.getId()+"]", ex);  
        }  
    }  
      
    @Override  
    public String getAsString(FacesContext context, UIComponent component,  
            Object value) {  
        if (value == null)  
            return "";  
          
        return getIdByReflection(value).toString();  
    }  
      
    private Object findById(Collection collection, Long idToFind){  
        for (Object obj : collection){  
             Long id = getIdByReflection(obj);  
             if (id == idToFind)  
                 return obj;  
        }  
          
        return null;  
    }  
      
    private Long getIdByReflection(Object bean){  
        try{  
            Field idField = bean.getClass().getDeclaredField("idMarca");  
            idField.setAccessible(true);  
            return (Long) idField.get(bean);  
        }catch(Exception ex){  
            throw new RuntimeException("Não foi possível obter a propriedade 'idMarca' do item",ex);  
        }  
    }  

}

JSF

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui">

<h:head></h:head> 
<h:body> 
<h:form id="teste">
<p:commandLink value="Novo Livro"
					actionListener="#{produtobean.prepararAdicionarObject()}"
					onclick="adicionarUsuario.show()" />
					</h:form>
<p:dialog header="Cadastro Usuario" id="newuser"
		widgetVar="adicionarUsuario" dynamic="true" showEffect="slide">

	<h:form id="cadastro">
		<h:panelGrid id="cadastroProduto" columns="2" >
			<h:outputLabel for="produto" value="Produto: " />
			<h:inputText id="produto" value="#{produtobean.produto.produto}"/>
			
			<h:outputLabel for="marca" value="Marca" />  
   				 <h:selectOneMenu id="marca" value="#{produtobean.marcaSelecionada}" converter="converterTeste"
   				 	items="#{produtobean.listamarca}"
   				 >  
        			  <f:selectItems value="#{produtobean.listamarca}" var="marca" itemLabel="#{marca.marca}" itemValue="#{marca}" />
				</h:selectOneMenu>  
				<p:commandButton actionListener="#{produtobean.saveObject()}" value="Cadastrar"/>
		</h:panelGrid>
	</h:form>
	</p:dialog>
</h:body> 
</html>

Bean

package visao;

import implementacoes.InterfaceBean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;

import org.primefaces.event.RowEditEvent;

import dao.MarcaDao;
import dao.ObjectDao;
import entidade.Marca;
import entidade.Produto;


/**
 * Bean da classe Produto responsavel por gerenciar os produtos na cama de visão
 * Como faz conexão com o banco e sai da JVM implementa Serializable.
 * implementa InterfaceBean que tem os metodos basicos dos Bean da aplicação(camada de visão)
 * @author Rangel
 * @version 1.0
 * @since 25/09/2012
 * @see implementacoes.InterfaceBean
 * @see java.lang.Object
 * @see java.io.Serializable
 */
@ManagedBean(name="produtobean")
@RequestScoped
public class ProdutoBean implements Serializable,InterfaceBean {

	/**
	 * numero gerado aleatoriamente pela Serializable 
	 * @serial serialVersionUID
	 */
	private static final long serialVersionUID = -9193715420049605319L;

	private List<Marca> listamarca;
	private ArrayList<SelectItem> marcas;
	
	private Produto produto = new Produto();
	private Marca marcaSelecionada ;
	
	public List<SelectItem> getMarcas(){
			if (marcas == null) {
				
		
		this.marcas = new  ArrayList<SelectItem>();
		if (listamarca == null) {
			listamarca = (List<Marca>) new MarcaDao().listaMarca();
		}
		this.marcas.add(new SelectItem(0,"Selecione"));
		for(Marca m:listamarca){
			this.marcas.add(new SelectItem(m.getIdMarca().toString(),m.getMarca()));
		}
		
			}
		return this.marcas;
	}



	public Produto getProduto() {
		return produto;
	}


	public void setProduto(Produto produto) {
		this.produto = produto;
	}


	public ArrayList<SelectItem> getMarca() {
		return marcas;
	}


	public void setMarca(ArrayList<SelectItem> marca) {
		this.marcas = marca;
	}


	public List<Marca> getListamarca() {
		if (listamarca == null) {
			listamarca = (List<Marca>) new MarcaDao().listaMarca();
		}
		
		return this.listamarca;
	}
	
	public void setListamarca(List<Marca> listamarca) {
		this.listamarca = listamarca;
	}


	public List<Object> listarObject() {
		return null;
	}

	public Object prepararAdicionarObject() {
		produto = new Produto();
		return produto;
	}

	public void editObject(RowEditEvent event) {
		
	}

	public String deleteObject(RowEditEvent event) {
		return null;
	}

	
	public void saveObject() {
		ObjectDao dao = new ObjectDao();
		produto.setMarca(marcaSelecionada);
		dao.saveRelationShip(produto);
	}



	public Marca getMarcaSelecionada() {
		return marcaSelecionada;
	}



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



}

e classe marca

package entidade;

import java.util.*;

import javax.persistence.*;

/**
 * Classe do pacote padrão de entedidades, todas as classes desse pacote foram mapeadas usando jpa2.0
 * Faz um relacionamento OneToMany com a classe Produto
 * @author Rangel
 * @version 2.0
 * @since 03/10/2012
 * @see java.lang.Object
 */
@Entity
@Table(name="marca")
public class Marca {

	
	@Id
	@GeneratedValue
	private Long idMarca;
	
	private String marca;
	
	@OneToMany(mappedBy = "marca", targetEntity = Produto.class, 
				fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<Produto> produto;

	public List<Produto> getProduto() {
		return produto;
	}

	public void setProduto(List<Produto> produto) {
		this.produto = produto;
	}

	public String getMarca() {
		return marca;
	}

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

	public Long getIdMarca() {
		return idMarca;
	}
	
	
	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
			}
			if (getClass() != obj.getClass()) {
			return false;
			}
			final Marca other = (Marca) obj;
			if (this.idMarca != other.idMarca && (this.idMarca == null || !this.idMarca.equals(other.idMarca))) {
			return false;
			}
			return true;
			}

			@Override
	public int hashCode() {
			int hash = 5;
			hash = 41 * hash + (this.idMarca != null ? this.idMarca.hashCode() : 0);
			return hash;
	}
	
	
}
Criado 26 de setembro de 2012
Ultima resposta 10 de out. de 2012
Respostas 26
Participantes 8