[RESOLVIDO] Dúvidas Vraptor3 + Hibenate

74 respostas
C

Olá pessoal

Estou com uma super duvida

Tenho um Form para cadastrar produtos, neste form tbm eu defino as propriedades das lojas que ele vai compor e tenho um relacionamento N p/ M, entre produtos e lojas e uma classe com atributos intermediarios produtoLoja.

Estou conseguindo inserir na tabela produtos porém não insere na tabela produtoLoja.

Segue abaixo codigo

incluir.jsp

form action="<c:url value="/produtos"/>" method="POST">
<table>
<tr>
      <td>Descricao Curta:</td>
      <td><input name="produto.descCurta" type="text" id="descCurta" size="22" maxlength="22"/></td>
      <td>Descricao Completa:</td>
      <td><input name="produto.descCompleta" type="text" id="descCompleta" size="50" maxlength="50"/></td>
</tr>
<tr>
      <td>Embalagem Venda:</td>
      <td><input name="produto.embVenda" type="text" id="embVenda" size="3" maxlength="3"/></td>
      <td>Embalagem Compra:</td>
      <td><input name="produto.embCompra" type="text" id="embVenda" size="3" maxlength="3"/></td>
</tr>
</table>

<table>
<thead>
    <tr>
      <th>Loja</th>
      <th>Preço</th>
      <th>Margem</th>
      <th>Estoq</th>
    </tr>
    </thead>
<tbody>
<c:forEach items="${lojaList}" var="loja">
<tr>

      <td><input name="produtoLoja.idLoja" type="text" id="codLoja" size="3" maxlength="3" disabled="disabled" value="${loja.id}" class="label"/>
      <td><input name="produtoLoja.preco" type="text" id="preco" size="3" maxlength="3" class="label"/></td>
      <td><input name="produtoLoja.margem" type="text" id="margem" size="3" maxlength="3" class="label"/></td>
      <td><input name="produtoLoja.estoque" type="text" id="estoque" size="9" maxlength="9" class="label"/></td>
</tr>
</c:forEach>
    </tbody>
  </table>
<input type="submit" value="Enviar"/>
</form>

Meu controller

@Path("/produtos")
		@Post
		public void adiciona(final Produto produto, ProdutoLoja produtoloja) {
		produtodao.salva(produto);
		produtolojadao.salva(produtoloja);
		result.redirectTo(CategoriasController.class).listaprodutos();
		}

ProdutoLojaDao

public void salva(ProdutoLoja produtoLoja) {
		Transaction tx = session.beginTransaction();
		session.save(produtoLoja);
		tx.commit();
		}

ProdutoDao

public void salva(Produto produto) {
		Transaction tx = session.beginTransaction();
		session.save(produto);
		tx.commit();
		}

produto.java

@SuppressWarnings("serial")
@Entity
@Table(name = "produto", catalog = "teste")
@PrimaryKeyJoinColumn(name = "id")
public class Produto implements Serializable{
	
	@Id  
	@GeneratedValue(strategy = IDENTITY)  
	@Column(name = "id", unique = true, nullable = false)
	private Integer id;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "produto")  
 	private Set<ProdutoLoja> produtoLoja = 	new HashSet<ProdutoLoja>(0);

loja

@SuppressWarnings("serial")  
@Entity 
@Table(name = "loja", catalog = "teste")
public class Loja implements Serializable{
	@Id
	@GeneratedValue(strategy = IDENTITY)  
	@Column(name = "id", unique = true, nullable = false)
	private Integer id;

produtoloja

@SuppressWarnings("serial")  
@Entity
@Table(name = "produtoLoja", catalog = "teste")
public class ProdutoLoja implements Serializable{
	
	@EmbeddedId  
	@AttributeOverrides( { @AttributeOverride(name = "idloja", column =  
	@Column(name = "idloja", nullable = false)), @AttributeOverride(name =  
	"idproduto", column = @Column(name = "idproduto", nullable = false)) })  
	private Id id;
	
	@ManyToOne(fetch = FetchType.LAZY)  
	@JoinColumn(name = "idloja", nullable = false, insertable = false,  
	updatable = false)  
	private Loja loja; 
	
	@ManyToOne(fetch = FetchType.LAZY)  
	@JoinColumn(name = "idproduto", nullable = false, insertable = false,  
	updatable = false)  
	private Produto produto;

Desde já agradeço

74 Respostas

Lucas_Cavalcanti

troque seu form para:

<c:forEach items="${lojaList}" var="loja" varStatus="s">
<tr>

      <td><input name="produto.produtoLoja[${s.index}].idLoja" type="text" id="codLoja" size="3" maxlength="3" disabled="disabled" value="${loja.id}" class="label"/>
      <td><input name="produto.produtoLoja[${s.index}].preco" type="text" id="preco" size="3" maxlength="3" class="label"/></td>
      <td><input name="produto.produtoLoja[${s.index}].margem" type="text" id="margem" size="3" maxlength="3" class="label"/></td>
      <td><input name="produto.produtoLoja[${s.index}].estoque" type="text" id="estoque" size="9" maxlength="9" class="label"/></td>
</tr>
</c:forEach>

na sua lógica:

@Path("/produtos")
		@Post
		public void adiciona(final Produto produto) {
		produtodao.salva(produto);		result.redirectTo(CategoriasController.class).listaprodutos();
		}

e na classe Produto:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "produto", cascade=CascadeType.PERSIST)    
private Set<ProdutoLoja> produtoLoja =    new HashSet<ProdutoLoja>(0);
C

Lucas Cavalcanti:
troque seu form para:

<c:forEach items="${lojaList}" var="loja" varStatus="s">
<tr>

      <td><input name="produto.produtoLoja[${s.index}].idLoja" type="text" id="codLoja" size="3" maxlength="3" disabled="disabled" value="${loja.id}" class="label"/>
      <td><input name="produto.produtoLoja[${s.index}].preco" type="text" id="preco" size="3" maxlength="3" class="label"/></td>
      <td><input name="produto.produtoLoja[${s.index}].margem" type="text" id="margem" size="3" maxlength="3" class="label"/></td>
      <td><input name="produto.produtoLoja[${s.index}].estoque" type="text" id="estoque" size="9" maxlength="9" class="label"/></td>
</tr>
</c:forEach>

na sua lógica:

@Path("/produtos")
		@Post
		public void adiciona(final Produto produto) {
		produtodao.salva(produto);		result.redirectTo(CategoriasController.class).listaprodutos();
		}

e na classe Produto:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "produto", cascade=CascadeType.PERSIST)    
private Set<ProdutoLoja> produtoLoja =    new HashSet<ProdutoLoja>(0);

Lucas está fazendo o insert na em produtos porem não insere em produtosLoja

Lucas_Cavalcanti

vc colocou o cascade?

a lista de produtoLoja dentro de produto tá vindo populada?

C

Lucas Cavalcanti:
vc colocou o cascade?

a lista de produtoLoja dentro de produto tá vindo populada?

Sim

OneToMany(fetch = FetchType.LAZY, mappedBy = "produto", cascade=CascadeType.PERSIST)  
 	private Set<ProdutoLoja> produtoLoja = 	new HashSet<ProdutoLoja>(0);

Ele não teria acionar o ProdutoLojaDao para inserir ?

Dentro de ProdutoLoja contém Id da associacao (chave composta no banco) isso pode está influenciando.

@Embeddable  
	public static class Id implements Serializable {  
	   
	@Column(name = "idLoja", nullable = false)  
	private Integer idLoja;  
	   
	@Column(name = "idProduto", nullable = false)  
	private Integer idProduto;
Lucas_Cavalcanti

você está usando transações? (se usou o componente do VRaptor, ele faz isso)
dá algum erro no log do servidor?

se você coloca o cascade, não precisa salvar os produtoLoja na mão, o cascade serve exatamente pra isso

C

Lucas Cavalcanti:
você está usando transações? (se usou o componente do VRaptor, ele faz isso)
dá algum erro no log do servidor?

se você coloca o cascade, não precisa salvar os produtoLoja na mão, o cascade serve exatamente pra isso

Traz o seguinte log mas sem erros

11:41:44,402 DEBUG [VRaptor             ] VRaptor received a new request
11:41:44,419 DEBUG [DefaultRequestExecution] executing stack  DefaultRequestExecution
11:41:44,435 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:41:44,435 DEBUG [DefaultResourceTranslator] trying to access /produtos
11:41:44,437 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: ProdutosController.adicionaProdutosController.adiciona(Produto)]
11:41:44,448 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:41:44,452 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
11:41:44,458 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:41:44,575 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
11:41:44,576 DEBUG [AsmBasedTypeCreator ] Trying to make class for ProdutosController$adiciona$[telefone removido]$2
11:41:44,576 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.adiciona(Produto) as [produto]
11:41:44,579 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: [Produto]
11:41:44,579 DEBUG [AsmBasedTypeCreator ] Method for field 'Produto' being defined for type Lbr/com/caelum/brvarejo/produto/Produto;
11:41:44,584 DEBUG [AsmBasedTypeCreator ] Methods: [public br.com.caelum.brvarejo.produto.Produto ProdutosController$adiciona$[telefone removido]$2.getProduto(), public void ProdutosController$adiciona$[telefone removido]$2.setProduto(br.com.caelum.brvarejo.produto.Produto)]
11:41:44,584 DEBUG [AsmBasedTypeCreator ] Fields: [private br.com.caelum.brvarejo.produto.Produto ProdutosController$adiciona$[telefone removido]$2.Produto_]
11:41:44,584 DEBUG [CacheBasedTypeCreator] cached generic type for method [DefaultResourceMethod: ProdutosController.adicionaProdutosController.adiciona(Produto)]
11:41:44,584 DEBUG [OgnlParametersProvider] Applying example_length with [10]
11:41:44,668 DEBUG [OgnlParametersProvider] cant find property for expression example_length ignoring
11:41:44,669 DEBUG [OgnlParametersProvider] Applying produto.codPisCofins with [0]
11:41:44,696 DEBUG [OgnlParametersProvider] Applying produto.embVenda with []
11:41:44,699 DEBUG [OgnlParametersProvider] Applying produto.referencia with []
11:41:44,699 DEBUG [OgnlParametersProvider] Applying produto.codMarca with []
11:41:44,702 DEBUG [OgnlParametersProvider] Applying produto.tembReceb with [0]
11:41:44,704 DEBUG [OgnlParametersProvider] Applying produto.embReceb with []
11:41:44,708 DEBUG [OgnlParametersProvider] Applying produto.codCstA with [0]
11:41:44,711 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].estoqueMaximo with []
11:41:44,717 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].estoqueMaximo ignoring
11:41:44,718 DEBUG [OgnlParametersProvider] Applying produto.codSetor with [0]
11:41:44,720 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].ativo with [1]
11:41:44,720 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].ativo ignoring
11:41:44,721 DEBUG [OgnlParametersProvider] Applying example2_length with [10]
11:41:44,722 DEBUG [OgnlParametersProvider] cant find property for expression example2_length ignoring
11:41:44,722 DEBUG [OgnlParametersProvider] Applying produto.codPeso with []
11:41:44,728 DEBUG [OgnlParametersProvider] cant find property for expression produto.codPeso ignoring
11:41:44,729 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].expBalanca with [0]
11:41:44,729 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].expBalanca ignoring
11:41:44,730 DEBUG [OgnlParametersProvider] Applying produto.codFigFiscal with []
11:41:44,732 DEBUG [OgnlParametersProvider] Applying example3_length with [10]
11:41:44,733 DEBUG [OgnlParametersProvider] cant find property for expression example3_length ignoring
11:41:44,733 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].estoqueMinimo with []
11:41:44,734 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].estoqueMinimo ignoring
11:41:44,734 DEBUG [OgnlParametersProvider] Applying familia.codFamilia with []
11:41:44,735 DEBUG [OgnlParametersProvider] cant find property for expression familia.codFamilia ignoring
11:41:44,735 DEBUG [OgnlParametersProvider] Applying produto.descCurta with [kafakds]
11:41:44,736 DEBUG [OgnlParametersProvider] Applying produto.codPauta with []
11:41:44,739 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].expPdv with [0]
11:41:44,740 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].expPdv ignoring
11:41:44,740 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].preco with [33]
11:41:44,741 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].preco ignoring
11:41:44,741 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].margem with [33]
11:41:44,744 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].margem ignoring
11:41:44,745 DEBUG [OgnlParametersProvider] Applying produto.descCompleta with [aksfdlkmdsajflksadf]
11:41:44,745 DEBUG [OgnlParametersProvider] Applying produto.tembCompra with [0]
11:41:44,747 DEBUG [OgnlParametersProvider] Applying produto.tembVenda with [0]
11:41:44,749 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].etiqGondola with [0]
11:41:44,750 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].etiqGondola ignoring
11:41:44,750 DEBUG [OgnlParametersProvider] Applying produto.tipoProd with []
11:41:44,751 DEBUG [OgnlParametersProvider] Applying produto.embCompra with []
11:41:44,753 DEBUG [OgnlParametersProvider] Applying produto.codCategoria with [, , , , ]
11:41:44,761 DEBUG [OgnlParametersProvider] unable to parse expression 'produto.codCategoria'
ognl.OgnlException: codCategoria [java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String]
	at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:103)
	at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
	at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
	at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.ASTChain.setValueBody(ASTChain.java:227)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.Ognl.setValue(Ognl.java:737)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:132)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:83)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:68)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String
	at br.com.caelum.vraptor.http.ognl.VRaptorConvertersAdapter.convertValue(VRaptorConvertersAdapter.java:56)
	at ognl.OgnlRuntime.getConvertedType(OgnlRuntime.java:1040)
	at ognl.OgnlRuntime.getConvertedTypes(OgnlRuntime.java:1057)
	at ognl.OgnlRuntime.getConvertedMethodAndArgs(OgnlRuntime.java:1083)
	at ognl.OgnlRuntime.getAppropriateMethod(OgnlRuntime.java:1169)
	at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1183)
	at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1454)
	at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:85)
	... 47 more
/-- Encapsulated exception ------------\
java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String
	at br.com.caelum.vraptor.http.ognl.VRaptorConvertersAdapter.convertValue(VRaptorConvertersAdapter.java:56)
	at ognl.OgnlRuntime.getConvertedType(OgnlRuntime.java:1040)
	at ognl.OgnlRuntime.getConvertedTypes(OgnlRuntime.java:1057)
	at ognl.OgnlRuntime.getConvertedMethodAndArgs(OgnlRuntime.java:1083)
	at ognl.OgnlRuntime.getAppropriateMethod(OgnlRuntime.java:1169)
	at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1183)
	at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1454)
	at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:85)
	at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
	at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
	at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.ASTChain.setValueBody(ASTChain.java:227)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.Ognl.setValue(Ognl.java:737)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:132)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:83)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:68)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
\--------------------------------------/
11:41:44,765 DEBUG [OgnlParametersProvider] Applying produto.codIva with []
11:41:44,767 DEBUG [OgnlParametersProvider] Applying produto.perecivel with [0]
11:41:44,768 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].estoque with [33]
11:41:44,769 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].estoque ignoring
11:41:44,769 DEBUG [OgnlParametersProvider] Applying produto.codImposto with [0]
11:41:44,774 DEBUG [OgnlParametersProvider] Applying produto.codClassFiscal with []
11:41:44,777 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.adiciona(Produto) as [produto]
11:41:44,777 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: ProdutosController.adicionaProdutosController.adiciona(Produto)] are [br.com.caelum.brvarejo.produto.Produto@18df2e4]
11:41:44,809 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:41:44,810 DEBUG [ExecuteMethodInterceptor] Invoking ProdutosController.adiciona(Produto)
Hibernate: 
    insert 
    into
        dbbrvarejo.produto
        (codCategoria, codClassFiscal, codCstA, codFamilia, codFigFiscal, codImposto, codIva, codKit, codMarca, codNutricao, codPauta, codPisCofins, codReceitaBal, codReceitaProd, codSetor, descCompleta, descCurta, embCompra, embReceb, embVenda, perecivel, peso, referencia, tembCompra, tembReceb, tembVenda, tipoProd) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Lucas_Cavalcanti

deu erro sim:

11:41:44,761 DEBUG [OgnlParametersProvider] unable to parse expression 'produto.codCategoria'
ognl.OgnlException: codCategoria [java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String]
	at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:103)
	at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
	at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
	at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.ASTChain.setValueBody(ASTChain.java:227)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.Ognl.setValue(Ognl.java:737)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:132)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90)

vc tah mandando mais de um parametro na requisição com o nome: produto.codCategoria ?

C

Lucas Cavalcanti:
deu erro sim:

11:41:44,761 DEBUG [OgnlParametersProvider] unable to parse expression 'produto.codCategoria'
ognl.OgnlException: codCategoria [java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String]
	at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:103)
	at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
	at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
	at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.ASTChain.setValueBody(ASTChain.java:227)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.Ognl.setValue(Ognl.java:737)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:132)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90)

vc tah mandando mais de um parametro na requisição com o nome: produto.codCategoria ?

Relmente estava com esse erro, corrigir e mesmo assim não insere os registro
No log apararece ignoring nos regirtros produtoLoja veja.

13:36:20,911 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].estoque with [3]
13:36:20,912 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].estoque ignoring
13:36:20,902 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].etiqGondola with [1]
13:36:20,903 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].etiqGondola ignoring
13:36:20,890 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].expPdv with [0]
13:36:20,891 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].expPdv ignoring
13:36:20,891 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].preco with [2]
13:36:20,892 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].preco ignoring
13:36:20,892 DEBUG [OgnlParametersProvider] Applying produto.produtoLoja[0].margem with [3]
13:36:20,896 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoLoja[0].margem ignoring

O que pode ser isso??

Lucas_Cavalcanti

troque o

class Produto {
   ...
   Set<ProdutoLoja> produtoLoja;
   ...
}

por

class Produto {
   ...
   List<ProdutoLoja> produtoLoja;
   ...
}
C

Lucas Cavalcanti:
troque o

class Produto {
   ...
   Set<ProdutoLoja> produtoLoja;
   ...
}

por

class Produto {
   ...
   List<ProdutoLoja> produtoLoja;
   ...
}

Mesmo assim continua não inserindo os registro na tabela produtoLoja

Lucas_Cavalcanti

aparece no log que ele tá ignorando?

no controller essa lista tá vindo com algum elemento?

C

Lucas Cavalcanti:
aparece no log que ele tá ignorando?

no controller essa lista tá vindo com algum elemento?

A lista traz os elementos porém ignora.

Lucas_Cavalcanti

manda salvar um por um antes de salvar o produto então

C

Não entedi!!!. Ex.

Lucas_Cavalcanti

acho que não é antes, faça isso:

produtoDao.salva(produto);
for(ProdutoLoja loja : produto.getProdutoLoja()) {
    produtoLojaDao.salva(loja);
}
C

Lucas Cavalcanti:
acho que não é antes, faça isso:

produtoDao.salva(produto); for(ProdutoLoja loja : produto.getProdutoLoja()) { produtoLojaDao.salva(loja); }

Deu erro 500

9/08/2010 16:59:49 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet default threw exception br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at br.com.caelum.brvarejo.controller.ProdutosController.adiciona(ProdutosController.java:91) 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 br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57) ... 37 more

Lucas_Cavalcanti

Caused by: java.lang.NullPointerException
at br.com.caelum.brvarejo.controller.ProdutosController.adiciona(ProdutosController.java:91)

o que tem nessa linha?

renanpto

cleison:
Lucas Cavalcanti:
acho que não é antes, faça isso:

produtoDao.salva(produto); for(ProdutoLoja loja : produto.getProdutoLoja()) { produtoLojaDao.salva(loja); }

Deu erro 500

9/08/2010 16:59:49 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet default threw exception br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException at br.com.caelum.brvarejo.controller.ProdutosController.adiciona(ProdutosController.java:91) 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 br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57) ... 37 more


Voce vinculou o produto na loja no momento do insert ?

C

Lucas Cavalcanti:
Caused by: java.lang.NullPointerException
at br.com.caelum.brvarejo.controller.ProdutosController.adiciona(ProdutosController.java:91)

o que tem nessa linha?

@Path("/produtos")
		@Post
		public void adiciona(final Produto produto) {
		produtodao.salva(produto);
		for(ProdutoLoja produtoLoja : produto.getProdutoLoja()) {  
		     produtolojadao.salva(produtoLoja);
		}
Lucas_Cavalcanti

isso eu tinha percebido, cleison, mas qual delas é a linha 91?

o null pointer pode ser:
produtodao == null, ou produto == null ou produtolojadao == null… tenta ver qual eh… vai ser o que tá na linha 91

C

Lucas Cavalcanti:
isso eu tinha percebido, cleison, mas qual delas é a linha 91?

o null pointer pode ser:
produtodao == null, ou produto == null ou produtolojadao == null… tenta ver qual eh… vai ser o que tá na linha 91

Desculpa na linha 91 com esse codigo

for(ProdutoLoja produtoLoja : produto.getProdutoLoja()) {  
		     produtolojadao.salva(produtoLoja);
		}

Faz a inserção na tabela Produtos e para nesta linha acima.

Lucas_Cavalcanti

então produto.getProdutoLoja() é null…

vê no log se está populando os parametros corretamente ou se tah aparecendo aquele ignoring que estava antes

C

Lucas Cavalcanti:
então produto.getProdutoLoja() é null…

vê no log se está populando os parametros corretamente ou se tah aparecendo aquele ignoring que estava antes

Continua com ignoring

segue como está o código completo

Produto

import static javax.persistence.GenerationType.IDENTITY;
import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;


@SuppressWarnings("serial")
@Entity
@Table(name = "produto", catalog = "dbbrvarejo")
@PrimaryKeyJoinColumn(name = "id")
public class Produto implements Serializable{
	
	@Id  
	@GeneratedValue(strategy = IDENTITY)  
	@Column(name = "id", unique = true, nullable = false)
	private Integer id;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "produto", cascade= CascadeType.PERSIST)  
 	private List<ProdutoLoja> produtoLoja;
	
	private String tipoProd;
	private String descCurta;
	private String descCompleta;
	private int codFamilia;
	private String referencia;
	private int codMarca;
	private int codSetorCusto;
	private int codKit;
	private int codDivisao;
	private int codSetor;
	private int codSecao;
	private int codGrupo;
	private int codSubGrupo;
	private int embVenda;
	private int tembVenda;
	private int embReceb;
	private int tembReceb;
	private int embCompra;
	private int tembCompra;
	private int codNutricao;
	private int codReceitaBal;
	private int codReceitaProd;
	private String perecivel;
	private double peso;
	private int codImposto;
	private int codCstA;
	private int codPisCofins;
	private int codClassFiscal;
	private int codPauta;
	private int codFigFiscal;
	private int codIva;

Loja

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@SuppressWarnings("serial")  
@Entity 
@Table(name = "loja", catalog = "dbbrvarejo")
public class Loja implements Serializable{
	@Id
	@GeneratedValue(strategy = IDENTITY)  
	@Column(name = "id", unique = true, nullable = false)
	private Integer id;
	
	@Column(name = "descricao")
	private String descricao; 

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "loja")  
	private Set<ProdutoLoja> produtoLoja;

ProdutoLoja

import java.io.Serializable;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


@SuppressWarnings("serial")  
@Entity
@Table(name = "produtoLoja", catalog = "dbbrvarejo")
public class ProdutoLoja implements Serializable{
	
	@EmbeddedId  
	@AttributeOverrides( { @AttributeOverride(name = "idloja", column =  
	@Column(name = "idloja", nullable = false)), @AttributeOverride(name =  
	"idproduto", column = @Column(name = "idproduto", nullable = false)) })  
	private Id id;
	
	@ManyToOne(fetch = FetchType.LAZY)  
	@JoinColumn(name = "idloja", nullable = false, insertable = false,  
	updatable = false)  
	private Loja loja; 
	
	@ManyToOne(fetch = FetchType.LAZY)  
	@JoinColumn(name = "idproduto", nullable = false, insertable = false,  
	updatable = false)  
	private Produto produto;
	
	private String ativo;
	private int margem;
	private double estoque;
	private double estoqueMinimo;
	private double estoqueMaximo;
	private String etiqGondola;
	private String expBalanca;
	private String expPdv;
	private double preco;
	private int linhaLoja;

//* getters e setters

@Embeddable  
	public static class Id implements Serializable {  
	   
	@Column(name = "idLoja", nullable = false)  
	private Integer idLoja;  
	   
	@Column(name = "idProduto", nullable = false)  
	private Integer idProduto;

	public Integer getIdLoja() {
		return idLoja;
	}

	public void setIdLoja(Integer idLoja) {
		this.idLoja = idLoja;
	}

	public Integer getIdProduto() {
		return idProduto;
	}

	public void setIdProduto(Integer idProduto) {
		this.idProduto = idProduto;
	}

ProdutoController

@Path("/produtos")
		@Post
		public void adiciona(final Produto produto) {
		produtodao.salva(produto);
		for(ProdutoLoja produtoLoja : produto.getProdutoLoja()) {  
		     produtolojadao.salva(produtoLoja);
		}
		result.redirectTo(ProdutosController.class).incluir();
		}

Log

18:35:49,305 DEBUG [OgnlParametersProvider] Applying example_length with [10]
18:35:49,391 DEBUG [OgnlParametersProvider] cant find property for expression example_length ignoring
18:35:49,392 DEBUG [OgnlParametersProvider] Applying produto.codPisCofins with [1]
18:35:49,414 DEBUG [OgnlParametersProvider] Applying produto.embVenda with [22]
18:35:49,416 DEBUG [OgnlParametersProvider] Applying produto.referencia with [344]
18:35:49,416 DEBUG [OgnlParametersProvider] Applying produto.produtoloja[0].estoque with [333]
18:35:49,424 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoloja[0].estoque ignoring
18:35:49,424 DEBUG [OgnlParametersProvider] Applying produto.codMarca with [33]
18:35:49,426 DEBUG [OgnlParametersProvider] Applying produto.tembReceb with [1]
18:35:49,431 DEBUG [OgnlParametersProvider] Applying produto.produtoloja[0].etiqGondola with [1]
18:35:49,434 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoloja[0].etiqGondola ignoring
18:35:49,434 DEBUG [OgnlParametersProvider] Applying produto.embReceb with [22]
18:35:49,436 DEBUG [OgnlParametersProvider] Applying produto.codCstA with [1]
18:35:49,438 DEBUG [OgnlParametersProvider] Applying produto.produtoloja[0].margem with [22]
18:35:49,440 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoloja[0].margem ignoring
18:35:49,440 DEBUG [OgnlParametersProvider] Applying produto.codSetor with [1]
18:35:49,445 DEBUG [OgnlParametersProvider] Applying produto.codFamilia with [222]
18:35:49,447 DEBUG [OgnlParametersProvider] Applying produto.codPeso with [333]
18:35:49,450 DEBUG [OgnlParametersProvider] cant find property for expression produto.codPeso ignoring
18:35:49,450 DEBUG [OgnlParametersProvider] Applying example2_length with [10]
18:35:49,451 DEBUG [OgnlParametersProvider] cant find property for expression example2_length ignoring
18:35:49,451 DEBUG [OgnlParametersProvider] Applying produto.codFigFiscal with [22]
18:35:49,453 DEBUG [OgnlParametersProvider] Applying produto.codSubGrupo with [1]
18:35:49,455 DEBUG [OgnlParametersProvider] Applying produto.produtoloja[0].preco with [22]
18:35:49,459 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoloja[0].preco ignoring
18:35:49,460 DEBUG [OgnlParametersProvider] Applying produto.codSecao with [1]
18:35:49,462 DEBUG [OgnlParametersProvider] Applying example3_length with [10]
18:35:49,464 DEBUG [OgnlParametersProvider] cant find property for expression example3_length ignoring
18:35:49,464 DEBUG [OgnlParametersProvider] Applying produto.produtoloja[0].expPdv with [1]
18:35:49,467 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoloja[0].expPdv ignoring
18:35:49,467 DEBUG [OgnlParametersProvider] Applying produto.descCurta with [ajdskfjaskhd]
18:35:49,468 DEBUG [OgnlParametersProvider] Applying produto.codPauta with [2222]
18:35:49,469 DEBUG [OgnlParametersProvider] Applying produto.descCompleta with [afhasdfhjahskdfjhsad']
18:35:49,470 DEBUG [OgnlParametersProvider] Applying produto.produtoloja[0].estoqueMinimo with [22222]
18:35:49,474 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoloja[0].estoqueMinimo ignoring
18:35:49,475 DEBUG [OgnlParametersProvider] Applying produto.tembCompra with [1]
18:35:49,477 DEBUG [OgnlParametersProvider] Applying produto.tembVenda with [1]
18:35:49,478 DEBUG [OgnlParametersProvider] Applying produto.codSetorCusto with [1]
18:35:49,480 DEBUG [OgnlParametersProvider] Applying produto.tipoProd with [0]
18:35:49,481 DEBUG [OgnlParametersProvider] Applying produto.produtoloja[0].estoqueMaximo with [22222]
18:35:49,483 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoloja[0].estoqueMaximo ignoring
18:35:49,484 DEBUG [OgnlParametersProvider] Applying produto.embCompra with [33]
18:35:49,488 DEBUG [OgnlParametersProvider] Applying produto.codDivisao with [1]
18:35:49,491 DEBUG [OgnlParametersProvider] Applying produto.codIva with [2222]
18:35:49,495 DEBUG [OgnlParametersProvider] Applying produto.produtoloja[0].expBalanca with [1]
18:35:49,497 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoloja[0].expBalanca ignoring
18:35:49,497 DEBUG [OgnlParametersProvider] Applying produto.codGrupo with [1]
18:35:49,499 DEBUG [OgnlParametersProvider] Applying produto.perecivel with [1]
18:35:49,499 DEBUG [OgnlParametersProvider] Applying produto.codImposto with [1]
18:35:49,503 DEBUG [OgnlParametersProvider] Applying produto.codClassFiscal with [33333]
18:35:49,506 DEBUG [OgnlParametersProvider] Applying produto.produtoloja[0].ativo with [1]
18:35:49,507 DEBUG [OgnlParametersProvider] cant find property for expression produto.produtoloja[0].ativo ignoring
18:35:49,508 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.adiciona(Produto) as [produto]
18:35:49,508 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: ProdutosController.adicionaProdutosController.adiciona(Produto)] are [br.com.caelum.brvarejo.produto.Produto@6343c4]
18:35:49,536 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
18:35:49,536 DEBUG [ExecuteMethodInterceptor] Invoking ProdutosController.adiciona(Produto)
Hibernate: 
    insert 
    into
        dbbrvarejo.produto
        (codClassFiscal, codCstA, codDivisao, codFamilia, codFigFiscal, codGrupo, codImposto, codIva, codKit, codMarca, codNutricao, codPauta, codPisCofins, codReceitaBal, codReceitaProd, codSecao, codSetor, codSetorCusto, codSubGrupo, descCompleta, descCurta, embCompra, embReceb, embVenda, perecivel, peso, referencia, tembCompra, tembReceb, tembVenda, tipoProd) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Traz Erro 500 na linha 91

O que posso está fazendo de errado?

Lucas_Cavalcanti

se o nome do parâmetro da requisição é:

produto.produtoloja[0].estoque=333

o VRaptor vai traduzir para:

produto.getProdutoloja().get(0).setEstoque("333");

vc tem todos esses getters? essa linha acima compila?

o nome do seu atributo ém produto é produtoLoja, com L maiusculo, mas vc tah colocando no nome do input produtoloja, com l minusculo…

troca os inputs pra produto.produtoLoja[…], com o L maiusculo

C

Lucas Cavalcanti:
se o nome do parâmetro da requisição é:

produto.produtoloja[0].estoque=333

o VRaptor vai traduzir para:

produto.getProdutoloja().get(0).setEstoque("333");

vc tem todos esses getters? essa linha acima compila?

o nome do seu atributo ém produto é produtoLoja, com L maiusculo, mas vc tah colocando no nome do input produtoloja, com l minusculo…

troca os inputs pra produto.produtoLoja[…], com o L maiusculo

Lucas não rodou, mas valeu mesmo.

Se não é pedir demais teria uma modelo para que possa me basear.

vlw

Lucas_Cavalcanti

vou fazer só um, vc se baseia pra fazer o resto (to omitindo as anotações):

public class Produto {
    private List<ProdutoLoja> produtosLoja;

    public List<ProdutoLoja> getProdutosLoja() {
         return produtosLoja;
    }
    public void setProdutosLoja(List<ProdutoLoja> produtosLoja) {
         this.produtosLoja = produtosLoja;
    }
}
public class ProdutoLoja {
     private String estoque;

     public String getEstoque() {
        return estoque;
     }
     public void setEstoque(String estoque) {
         this.estoque = estoque;
     }
}

jsp:

<c:forEach items=".." var="..." varStatus="s">
    <input type="text" name="produto.produtosLoja[${s.index}].estoque" />
</c:forEach>

controller:

public void adiciona(Produto produto) {
    // veja se aqui nessa linha produto.getProdutosLoja() tem alguma coisa
    produtodao.salva(produto);
}

tome cuidado com maiúsculas e minúscula… se possível gere os getters e setters usando a sua IDE (eclipse, netbeans) e use o mesmo nome do atributo no caminho do input

C

Lucas Cavalcanti:
vou fazer só um, vc se baseia pra fazer o resto (to omitindo as anotações):

public class Produto {
    private List<ProdutoLoja> produtosLoja;

    public List<ProdutoLoja> getProdutosLoja() {
         return produtosLoja;
    }
    public void setProdutosLoja(List<ProdutoLoja> produtosLoja) {
         this.produtosLoja = produtosLoja;
    }
}
public class ProdutoLoja {
     private String estoque;

     public String getEstoque() {
        return estoque;
     }
     public void setEstoque(String estoque) {
         this.estoque = estoque;
     }
}

jsp:

<c:forEach items=".." var="..." varStatus="s">
    <input type="text" name="produto.produtosLoja[${s.index}].estoque" />
</c:forEach>

controller:

public void adiciona(Produto produto) {
    // veja se aqui nessa linha produto.getProdutosLoja() tem alguma coisa
    produtodao.salva(produto);
}

tome cuidado com maiúsculas e minúscula… se possível gere os getters e setters usando a sua IDE (eclipse, netbeans) e use o mesmo nome do atributo no caminho do input

Agora está aparecendo esse erro

\ids para esta classe deve ser atribuído manualmente antes de chamar o save ():

20/08/2010 15:12:50 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): br.com.caelum.brvarejo.produto.ProdutoLoja
	at org.hibernate.id.Assigned.generate(Assigned.java:56)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:122)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)
	at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:241)
	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:292)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:240)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)
	at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:320)
	at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:266)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:243)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:154)
	at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:479)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:357)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
	at br.com.caelum.brvarejo.dao.ProdutoDao.salva(ProdutoDao.java:23)
	at br.com.caelum.brvarejo.controller.ProdutosController.adiciona(ProdutosController.java:89)
	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 br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	... 37 more
Lucas_Cavalcanti

não é pra fazer só isso que eu te passei…

vc precisa setar os outros parâmetros tb neh, seguindo o exemplo que eu passei… coloque os inputs para os outros atributos do produtoLoja que vc tava setando antes, só cuidado com os nomes

C

Lucas Cavalcanti:
não é pra fazer só isso que eu te passei…

vc precisa setar os outros parâmetros tb neh, seguindo o exemplo que eu passei… coloque os inputs para os outros atributos do produtoLoja que vc tava setando antes, só cuidado com os nomes

Fiz conforme descreveu, os valores dos inputs são setados sem ignoring por não isere na tabela produtoloja.

Lucas_Cavalcanti

vc tem um Id composto na tabela produtoLoja…

então vc precisa setar todos os campos do id dele antes de salvar…

um dos campos dele é o id do produto que vc tá acabando de salvar…

então tente fazer:

  • coloque o cascade=CascadeType.PERSIST
  • faça o save apenas no produto

se não funcionar, faça, sem o cascade:

produtodao.salva(produto);

for(ProdutoLoja loja : produto.getProdutoLoja()) {
    loja.setProduto(produto);
    produtolojadao.salva(loja);
}

e desculpe pela última msg, foi meio ignorante…

C
Lucas Cavalcanti:
vc tem um Id composto na tabela produtoLoja...

então vc precisa setar todos os campos do id dele antes de salvar...

um dos campos dele é o id do produto que vc tá acabando de salvar...

então tente fazer:
- coloque o cascade=CascadeType.PERSIST
- faça o save apenas no produto

se não funcionar, faça, sem o cascade:
produtodao.salva(produto);

for(ProdutoLoja loja : produto.getProdutoLoja()) {
    loja.setProduto(produto);
    produtolojadao.salva(loja);
}

e desculpe pela última msg, foi meio ignorante...

Sem problemas..

Fiz as alterações tem com e sem cascade mesmo assim não funfo, continua setando na tabela produtos, apos setar da erro 500.
tambem tem o id da loja que está sendo passado será que está correto? segue abaixo.

<input name="produto.produtoLoja[${s.index }].idloja"
public void adiciona(final Produto produto) {
		produtodao.salva(produto);
		for (ProdutoLoja loja : produto.getProdutoLoja()){
			loja.setProduto(produto);
			produtolojadao.salva(loja);
		}
Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): br.com.caelum.brvarejo.produto.ProdutoLoja at org.hibernate.id.Assigned.generate(Assigned.java:56) [code]

Desculpa tanta amolação

C

cleison:
Lucas Cavalcanti:
vc tem um Id composto na tabela produtoLoja…

então vc precisa setar todos os campos do id dele antes de salvar…

um dos campos dele é o id do produto que vc tá acabando de salvar…

então tente fazer:

  • coloque o cascade=CascadeType.PERSIST
  • faça o save apenas no produto

se não funcionar, faça, sem o cascade:

produtodao.salva(produto);

for(ProdutoLoja loja : produto.getProdutoLoja()) {
    loja.setProduto(produto);
    produtolojadao.salva(loja);
}

e desculpe pela última msg, foi meio ignorante…

Sem problemas…

Fiz as alterações tem com e sem cascade mesmo assim não funfo, continua setando na tabela produtos, apos setar da erro 500.
tambem tem o id da loja que está sendo passado será que está correto? segue abaixo.

<input name="produto.produtoLoja[${s.index }].idloja"
public void adiciona(final Produto produto) {
		produtodao.salva(produto);
		for (ProdutoLoja loja : produto.getProdutoLoja()){
			loja.setProduto(produto);
			produtolojadao.salva(loja);
		}
Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): br.com.caelum.brvarejo.produto.ProdutoLoja
	at org.hibernate.id.Assigned.generate(Assigned.java:56)

Desculpa tanta amolação

Lucas_Cavalcanti
<input name="produto.produtoLoja[${s.index }].idloja" value="${loja.id}"/>

na classe ProdutoLoja existe o método setIdloja? ou é setIdLoja?
se for o segundo, o nome do input deve ser produto.produtoLoja[${s.index }].idLoja

cuidado, pois maiúsculas e minúsculas importam.

C

Lucas Cavalcanti:
<input name="produto.produtoLoja[${s.index }].idloja" value="${loja.id}"/>

na classe ProdutoLoja existe o método setIdloja? ou é setIdLoja?
se for o segundo, o nome do input deve ser produto.produtoLoja[${s.index }].idLoja

cuidado, pois maiúsculas e minúsculas importam.

Havia feito a correção porem continua com esse mesmo problema que destaquei acima.

Lucas_Cavalcanti

as tabelas já existiam, ou vc criou só pra esse projeto?

se foi só pra esse projeto, desencana do id composto no ProdutoLoja, e troca esse id por um

@Id
@GeneratedValue
private Long id;

se as tabelas já existiam, e vc não pode mexer nelas, dá uma conferida nos nomes das colunas configuradas, pra ver se as maúsculas estão no lugar certo, e troca o nome do input pra:

<input name="produto.produtoLoja[${s.index }].loja.id" value="${loja.id}"/>
C

Lucas Cavalcanti:
as tabelas já existiam, ou vc criou só pra esse projeto?

se foi só pra esse projeto, desencana do id composto no ProdutoLoja, e troca esse id por um

@Id
@GeneratedValue
private Long id;

se as tabelas já existiam, e vc não pode mexer nelas, dá uma conferida nos nomes das colunas configuradas, pra ver se as maúsculas estão no lugar certo, e troca o nome do input pra:

<input name="produto.produtoLoja[${s.index }].loja.id" value="${loja.id}"/>

O projeto é novo verifiquei todos os campos das tabelas tbm.

Não sei se está é a melhor pratica de relacionamento, porque eu tenho o objeto loja, produto e produtoLoja. Ou melhor qual a melhor pratica? já que tenho relacionamento bidirecional e os ids dos objetos loja e produto devem constar no produtoLoja pois um produto pertence a varias e lojas e varias lojas contem varios produtos.

vlw

Lucas_Cavalcanti

o ideal em relacionamentos muitos pra muitos é algo do tipo:

@Entity
public class Produto {
   @Id
   @GeneratedValue
   private Long id;

   @OneToMany(mappedBy="produto")
   private List<ProdutoLoja> produtosLoja;
   // outros campos
}
@Entity
public class Loja {
   @Id
   @GeneratedValue
   private Long id;

   @OneToMany(mappedBy="loja")
   private List<ProdutoLoja> produtosLoja;

   // outros campos
}
@Entity
public class ProdutoLoja {//o ideal é renomear isso para algo que faça mais sentido, tipo ItemEstoque, ou algo do tipo
   @Id
   @GeneratedValue
   private Long id;

   @ManyToOne
   private Produto produto;

   @ManyToOne
   private Loja loja;

   // outros campos
}

e o ideal tb é deixar o hibernate tomar conta de tudo… não ficar colocando @Column’s nem @JoinColumn’s nem coisas do tipo…

C

Lucas Cavalcanti:
o ideal em relacionamentos muitos pra muitos é algo do tipo:

@Entity
public class Produto {
   @Id
   @GeneratedValue
   private Long id;

   @OneToMany(mappedBy="produto")
   private List<ProdutoLoja> produtosLoja;
   // outros campos
}
@Entity
public class Loja {
   @Id
   @GeneratedValue
   private Long id;

   @OneToMany(mappedBy="loja")
   private List<ProdutoLoja> produtosLoja;

   // outros campos
}
@Entity
public class ProdutoLoja {//o ideal é renomear isso para algo que faça mais sentido, tipo ItemEstoque, ou algo do tipo
   @Id
   @GeneratedValue
   private Long id;

   @ManyToOne
   private Produto produto;

   @ManyToOne
   private Loja loja;

   // outros campos
}

e o ideal tb é deixar o hibernate tomar conta de tudo… não ficar colocando @Column’s nem @JoinColumn’s nem coisas do tipo…

Ok Lucas Obrigado irei fazer fazer essas mudanças e post aqui

C

cleison:
Lucas Cavalcanti:
o ideal em relacionamentos muitos pra muitos é algo do tipo:

@Entity
public class Produto {
   @Id
   @GeneratedValue
   private Long id;

   @OneToMany(mappedBy="produto")
   private List<ProdutoLoja> produtosLoja;
   // outros campos
}
@Entity
public class Loja {
   @Id
   @GeneratedValue
   private Long id;

   @OneToMany(mappedBy="loja")
   private List<ProdutoLoja> produtosLoja;

   // outros campos
}
@Entity
public class ProdutoLoja {//o ideal é renomear isso para algo que faça mais sentido, tipo ItemEstoque, ou algo do tipo
   @Id
   @GeneratedValue
   private Long id;

   @ManyToOne
   private Produto produto;

   @ManyToOne
   private Loja loja;

   // outros campos
}

e o ideal tb é deixar o hibernate tomar conta de tudo… não ficar colocando @Column’s nem @JoinColumn’s nem coisas do tipo…

Ok Lucas Obrigado irei fazer fazer essas mudanças e post aqui

Lucas conseguir setar nas duas tabelas, só não está trazendo o loja_id. Como eu faço para passar o valor do loja_id que está no input para a tabela itemEstoque?

vlw

Lucas_Cavalcanti

só colocar o caminho do id da loja… depende de como vc chamou os campos, seria algo do tipo:

<input name="produto.itensEstoque[${s.index}].loja.id" value="${loja.id}"/>
C

Lucas Cavalcanti:
só colocar o caminho do id da loja… depende de como vc chamou os campos, seria algo do tipo:

<input name="produto.itensEstoque[${s.index}].loja.id" value="${loja.id}"/>

O hibernate criou um campo loja_id em itensEstoque, passei esses parametros mas não funcionou.

<input name="produto.itensEstoque[${s.index}].loja.id" value="${loja.id}"/>
<input name="produto.itensEstoque[${s.index}].loja_id" value="${loja.id}"/>
Lucas_Cavalcanti

esse caminho não é das colunas da tabela!
é dos campos java:

produto.itensEstoque[0].loja.id=33

é equivalente a

produto.getItensEstoque().get(0).getLoja().setId(33);

vc consegue rodar esse código acima? esses getters e setter existem?

C

Lucas Cavalcanti:
esse caminho não é das colunas da tabela!
é dos campos java:

produto.itensEstoque[0].loja.id=33

é equivalente a

produto.getItensEstoque().get(0).getLoja().setId(33);

vc consegue rodar esse código acima? esses getters e setter existem?

No Log não traz o produto.itensEstoque[0].loja.id with [33], mas também não informa erro. Os getters e setter existem.

Não seria nada no controller?

Lucas_Cavalcanti

vc entendeu totalmente o que significa esse caminho?

os nomes estão corretos?

dá uma olhada no código fonte do html do seu formulario (veja isso no browser) e ve se ele tá colocando os valores corretamente

vê no log se ele tá tentando popular…

sua classe Loja tem um setId?

C

Lucas Cavalcanti:
vc entendeu totalmente o que significa esse caminho?

os nomes estão corretos?

dá uma olhada no código fonte do html do seu formulario (veja isso no browser) e ve se ele tá colocando os valores corretamente

vê no log se ele tá tentando popular…

sua classe Loja tem um setId?

Não entendi muito bem o caminho? como ele verifica o valor id é pelo valor do input?

Fiquei com uma duvida, eu carrego uma lista das lojas e carrego no input o id das lojas certo?

<c:forEach items="${lojaList}" var="loja" varStatus="s">
    <tr>
      <td><input name="produto.itensEstoque[${s.index }].loja.id" type="text" value="${loja.id}" class="label"/></td>

Não está populando no controller.
Na classe Loja tem setId.

Lucas_Cavalcanti

qdo vc faz:

<input name="produto.itensEstoque[${s.index }].loja.id" type="text" value="${loja.id}" class="label"/>

ele vai colocar no html algo assim:

<input name="produto.itensEstoque[0].loja.id" type="text" value="234" class="label"/>

e qdo vc submete o form ele vai passar na requisição:

produto.itensEstoque[0].loja.id=234

e o VRaptor vai fazer algo equivalente a:

Produto produto = new Produto();
produto.setItensEstoque(new ArrayList<ItemEstoque>());
produto.getItensEstoque().set(0, new Loja());
produto.getItensEstoque().get(0).setId(234);

executa esse último código em algum lugar e vê se funciona. Se funcionar deveria estar funcionando no vraptor tb… se não funcionar me fala o que não funcionou

C

Lucas Cavalcanti:
qdo vc faz:

<input name="produto.itensEstoque[${s.index }].loja.id" type="text" value="${loja.id}" class="label"/>

ele vai colocar no html algo assim:

<input name="produto.itensEstoque[0].loja.id" type="text" value="234" class="label"/>

e qdo vc submete o form ele vai passar na requisição:

produto.itensEstoque[0].loja.id=234

e o VRaptor vai fazer algo equivalente a:

Produto produto = new Produto();
produto.setItensEstoque(new ArrayList<ItemEstoque>());
produto.getItensEstoque().set(0, new Loja());
produto.getItensEstoque().get(0).setId(234);

executa esse último código em algum lugar e vê se funciona. Se funcionar deveria estar funcionando no vraptor tb… se não funcionar me fala o que não funcionou

Entedi todo processo, não conseguir rodar esse codigo.

O meu controller está totalmento correto?

public void adiciona(final Produto produto) { produtodao.salva(produto); for (ItensEstoque itensEstoque : produto.getItensEstoque()){ itensEstoque.setProduto(produto); itensEstoquedao.salva(itensEstoque); }

Lucas_Cavalcanti

sim, o controller está correto…

qual parte não funciona?

C

Lucas Cavalcanti:
sim, o controller está correto…

qual parte não funciona?

Não conseguir rodar o codigo. Seria no controller? Ex?

Lucas_Cavalcanti
public class TantoFazQualClasse {
   public static void main(String[] args) {
      	Produto produto = new Produto();
        produto.setItensEstoque(new ArrayList<ItemEstoque>());
        produto.getItensEstoque().set(0, new Loja());
        produto.getItensEstoque().get(0).setId(234);

   }
}
C
Lucas Cavalcanti:
public class TantoFazQualClasse {
   public static void main(String[] args) {
      	Produto produto = new Produto();
        produto.setItensEstoque(new ArrayList<ItemEstoque>());
        produto.getItensEstoque().set(0, new Loja());
        produto.getItensEstoque().get(0).setId(234);

   }
}

Desculpe a ignorância.

Erro
set(0, new Loja());[The method set(int, itensEstoque) in the type List is not applicable for the arguments
(int, Loja)]

setId(234); [The method setId(Long) in the type itensEstoque is not applicable for the arguments (int)]

Lucas_Cavalcanti

esqueci de um passo:

public class TantoFazQualClasse {
   public static void main(String[] args) {
      	Produto produto = new Produto();
        produto.setItensEstoque(new ArrayList<ItemEstoque>());
        produto.getItensEstoque().set(0, new ItemEstoque());
        produto.getItensEstoque().get(0).setLoja(new Loja());
        produto.getItensEstoque().get(0).getLoja().setId(234L);

   }
}

isso funciona?

C

Lucas Cavalcanti:
esqueci de um passo:

public class TantoFazQualClasse {
   public static void main(String[] args) {
      	Produto produto = new Produto();
        produto.setItensEstoque(new ArrayList<ItemEstoque>());
        produto.getItensEstoque().set(0, new ItemEstoque());
        produto.getItensEstoque().get(0).setLoja(new Loja());
        produto.getItensEstoque().get(0).getLoja().setId(234L);

   }
}

isso funciona?

Saida no Log

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.RangeCheck(Unknown Source) at java.util.ArrayList.set(Unknown Source) at br.com.caelum.brvarejo.teste.main(teste.java:14)

Lucas_Cavalcanti

bom, compilou né? era isso o importante…

qdo vc roda a lógica de verdade (submete o formulario) ele dá algum erro ou só não salva nada?

C

Lucas Cavalcanti:
bom, compilou né? era isso o importante…

qdo vc roda a lógica de verdade (submete o formulario) ele dá algum erro ou só não salva nada?

Ele salva a tabela produto e a tabela itensProduto. Só não salva o campo loja_id(FK da tabela Loja).

Lucas_Cavalcanti

o formulario tah mandando essa informação? abre o codigo fonte da página e vê…

se estiver mandando, coloque essa linha no controller:

System.out.println(produto.getItensEstoque().get(0).getLoja().getId());

e veja se ele imprime o id

C

Lucas Cavalcanti:
o formulario tah mandando essa informação? abre o codigo fonte da página e vê…

se estiver mandando, coloque essa linha no controller:

System.out.println(produto.getItensEstoque().get(0).getLoja().getId());

e veja se ele imprime o id

O formulario manda as informações, menos o input ref a id Loja.

Coloquei a linha porem deu erro 500 [java.lang.NullPointerException]

Lucas_Cavalcanti

entra na página do formulario, botão direito, ver código fonte (ou similar) e vê se tah aparecendo os inputs do id da loja… vê se o value tá preenchido tb…

C

Sim está. A pagina executa normalmente.

Lucas_Cavalcanti

cola aqui o pedaço da página que tem esses inputs de loja

C

Segue

<tr>
      <td>Descricao Curta:</td>
      <td colspan="2"><input name="produto.descCurta" type="text" id="descCurta" size="22" maxlength="22" value="${produto.descCurta }" /></td>
      <td>Descricao Completa:</td>
      <td colspan="5"><input name="produto.descCompleta" type="text" id="descCompleta" size="50" maxlength="50" value="${produto.descCompleta }"/></td>
    </tr>
<tbody>
     <c:forEach items="${lojaList}" var="lojas" varStatus="s">
    <tr>
      <td><input name="produto.produtoLoja[${s.index }].loja.id" type="text" id="codloja" size="3" maxlength="3" class="label" disabled="disabled" value="${lojas.id }" class="label"/></td>
      <td><label>
        <select name="produto.produtoLoja[${s.index }].ativo" size="1" id="ativo" class="label">
          <option value="0">Não</option>
          <option value="1">Sim</option>
        </select>
      </label></td>
      <td><label>
        <input name="produto.produtoLoja[${s.index }].preco" type="text" id="preco" size="3" maxlength="3" class="label" value="0"/>
      </label></td>
Lucas_Cavalcanti

não o jsp, o código fonte da página no browser…

mas de qqer forma é produto.produtoLoja ou produto.itemEstoque?

C

Lucas Cavalcanti:
não o jsp, o código fonte da página no browser…

mas de qqer forma é produto.produtoLoja ou produto.itemEstoque?

É que estava com uma pagina para teste com itemEstoque.

<tr>
      <td><input name="produto.produtoLoja[0].loja.id" type="text" id="codloja" size="3" maxlength="3" class="label" disabled="disabled" value="1" class="label"/></td>
      <td><label>
        <select name="produto.produtoLoja[0].ativo" size="1" id="ativo" class="label">
          <option value="0">Não</option>
          <option value="1">Sim</option>

        </select>
      </label></td>
      <td><label>
        <input name="produto.produtoLoja[0].preco" type="text" id="preco" size="3" maxlength="3" class="label" value="0"/>
      </label></td>     
      <td><label>
        <input name="produto.produtoLoja[0].margem" type="text" id="margem" size="3" maxlength="3" class="label" value="0"/>
      </label></td>
      <td><label>

        <input name="produto.produtoLoja[0].estoque" type="text" id="estoque" size="9" maxlength="9" class="label" value="0"/>
      </label></td>
      <td><label>
        <input name="produto.produtoLoja[0].estoqueMinimo" type="text" id="estoqueMinimo" size="9" maxlength="9" class="label" value="0"/>
      </label></td>
Lucas_Cavalcanti

o caminho produto.produtoLoja[0].loja.id existe?

produto get/set produtoLoja get/set loja get/set id?

C

Lucas Cavalcanti:
o caminho produto.produtoLoja[0].loja.id existe?

produto get/set produtoLoja get/set loja get/set id?

Sim

Lucas_Cavalcanti

então não tem pq não estar funcionando… verifica se os nomes dos campos e dos getters/setters estão corretos

aparece no log a linha:

Applying produto.produtoLoja[0].loja.id with [3]

sem erro depois dela?

C

Lucas Cavalcanti:
então não tem pq não estar funcionando… verifica se os nomes dos campos e dos getters/setters estão corretos

aparece no log a linha:

Applying produto.produtoLoja[0].loja.id with [3]

sem erro depois dela?

O estranho é que não aparece essa linha no log.

Lucas_Cavalcanti

então o parâmetro não tá indo pra requisição… os inputs estão dentro do form?

C

O problema é que os outro inputs vão para a requisição somente esse que não vai.

Lucas_Cavalcanti

posta aqui o jsp inteiro… via attachment talvez

C
Lucas_Cavalcanti
<input name="produto.produtoLoja[${s.index }].loja.id" type="text" id="codloja" size="3" maxlength="3" class="label" disabled="disabled" value="${lojas.id }" class="label"/>

qdo vc coloca disabled=“disabled” ele não manda o parâmetro pra requisição…
troque isso pra readonly=“readonly”

C

Obrigado Lucas, deu tudo certo.
Vlw

Leandro-SP

Pessoal,
por favor, acho que o meu problema é parecido mas este topico ficou tão confuso que nao consegui resolver o problema.
Podem me ajudar?
http://www.guj.com.br/posts/list/204789.java
Obrigado.
Att,
Leandro.

Criado 18 de agosto de 2010
Ultima resposta 29 de ago. de 2010
Respostas 74
Participantes 4