Java Web -- org.hibernate.PropertyValueException: not-null property references a null or transient value

Alterei o titulo do meu tópico pois o problema e um pouco mais profundo.

Produto.xhtml

<?xml version="1.0" encoding="UTF-8" ?>
<!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://xmlns.jcp.org/jsf/html"
	  xmlns:p="http://primefaces.org/ui"
	  xmlns:f="http://xmlns.jcp.org/jsf/core">
	  
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Produtos</title>
</h:head>

<h:body>

	<p:growl id="mensagem" />

	<h:form id="FRMLista">
	
		<p:panel header="Cidades - Listagem">
			<p:dataTable id="PNTabela" emptyMessage="Nenhuma Registro Encontrado" paginator="true" value="#{produtoBean.produtos}" var="produto" rows="10">
				
				<f:facet name="footer">
					<p:commandButton value="Adicionar" actionListener="#{produtoBean.novo()}" oncomplete="PF('PDialog').show();" update=":mensagem :FMCadastro:PNDados" >
						<f:actionListener type="org.omnifaces.eventlistener.ResetInputAjaxActionListener" />
					</p:commandButton>
				</f:facet>
				
				<p:column headerText="Codigo de Barras" filterBy="#{produto.codigoNacional}" sortBy="#{produto.codigoNacional}" >
				 <h:outputText value="#{produto.codigoNacional}" />
				</p:column>
				
				<p:column headerText="Codigo Int. de Barras" filterBy="#{produto.codigoInternacional}" sortBy="#{produto.codigoInternacional}" >
				 <h:outputText value="#{produto.codigoInternacional}" />
				</p:column>
				
				<p:column headerText="Nome" filterBy="#{produto.nome}" sortBy="#{produto.nome}" >
				 <h:outputText value="#{produto.nome}" />
				</p:column>
				
				<p:column headerText="Dados" >
				 <h:outputText value="#{produto.descricao}" />
				</p:column>
				
				<p:column headerText="Estoque" filterBy="#{produto.quantidade}" sortBy="#{produto.quantidade}" >
				 <h:outputText value="#{produto.quantidade}" />
				</p:column>
				
				<p:column headerText="Promoção" filterBy="#{produto.promocao}" sortBy="#{produto.promocao}" >
				 <h:outputText value="#{produto.promocao}" />
				</p:column>
				
				<p:column headerText="Valor" filterBy="#{produto.preco}" sortBy="#{produto.preco}" >
				 <h:outputText value="#{produto.preco}" />
				</p:column>
				
				<p:column headerText="Fabricante" filterBy="#{produto.fabricante}" sortBy="#{produto.fabricante}" >
				 <h:outputText value="#{produto.fabricante.nome}" />
				</p:column>
				
				
				<p:column headerText="Opção">
					<p:commandButton icon="ui-icon-trash" actionListener="#{produtoBean.excluir}" update=":FRMLista:PNTabela">
						<p:confirm header="Confirmação" message="Deseja excluir o produto ?" icon="ui-icon-alert" />
						<f:attribute name="produtoSelecao" value="#{produto}" />
					</p:commandButton>
					
					<p:commandButton icon="ui-icon-pencil" actionListener="#{produtoBean.editar}" update=":FMCadastro:PNDados" oncomplete="PF('PDialog').show();" >
						<f:attribute name="produtoSelecao" value="#{produto}" />
						<f:actionListener type="org.omnifaces.eventlistener.ResetInputAjaxActionListener" />
					</p:commandButton>
				</p:column>
				
			</p:dataTable>
			
			<p:confirmDialog global="true">
				<p:commandButton value="Confirmar" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
				<p:commandButton value="cancelar" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
			</p:confirmDialog>
			
		</p:panel>
		
	</h:form>
	
	<p:dialog header="Cidades - Cadastro" widgetVar="PDialog" draggable="false" resizable="false" modal="true" closable="false">
	
	<h:form id="FMCadastro">
		<h:panelGrid id="PNDados" columns="2">
		
		
			 <p:outputLabel for="nome" value="Nome :" />
			 <p:inputText id="nome" size="30" value="#{produtoBean.produto.nome}" required="true" requiredMessage="Este Campo e Obrigatorio !"/>
			 
			 <p:outputLabel for="cbn" value="Código de Barras :" />
			 <p:inputText id="cbn" size="30" value="#{produtoBean.produto.codigoNacional}" required="true" requiredMessage="Este Campo e Obrigatorio !" >
			 
			 <p:outputLabel for="cbi" value="Código Int/Barras :" />
			 <p:inputText id="cbi" size="30" value="#{produtoBean.produto.codigoInternacional}" required="true" requiredMessage="Este Campo e Obrigatorio !"/>
			 
			 <p:outputLabel for="valor" value="Valor :" />
			 <p:inputText id="valor" size="30" value="#{produtoBean.produto.preco}" required="true" requiredMessage="Este Campo e Obrigatorio !"/>
			 
			 <p:outputLabel for="quant" value="Estoque :" />
			 <p:inputText id="quant" size="30" value="#{produtoBean.produto.quantidade}" required="true" requiredMessage="Este Campo e Obrigatorio !"/>
			 
			 <p:outputLabel for="promo" value="Promoção :" />
			 <p:inputText id="promo" size="30" value="#{produtoBean.produto.promocao}" required="true" requiredMessage="Este Campo e Obrigatorio !"/>
			 
			 <p:outputLabel for="fabric" value="Fabricante :"/>
			 <p:selectOneMenu id="fabric" filter="true" value="#{produtoBean.produto.fabricante}" converter="omnifaces.SelectItemsConverter" required="true" requiredMessage="Informe o Estado !">
			 
				 <f:selectItem noSelectionOption="true" itemLabel="Selecione um Estado" />
				 <f:selectItems value="#{produtoBean.fabricantes}" var="fabricante" itemValue="#{fabricante}" itemLabel="#{fabricante.nome}" />
			 
			 </p:selectOneMenu>
			 
			 <p:outputLabel for="info" value="Informações :" />
			 <p:editor id="info" size="30" value="#{produtoBean.produto.descricao}" required="true" requiredMessage="Este Campo e Obrigatorio !"/>
			 
		 </h:panelGrid>
		 <h:panelGrid columns="2">
		 
		 	<p:commandButton value="Salvar" actionListener="#{produtoBean.salvar}" update=":mensagem :FMCadastro:PNDados :FRMLista:PNTabela" />
			 	
			 	<p:commandButton value="Cancelar" oncomplete="PF('PDialog').hide();" />
		 
		 </h:panelGrid>
	</h:form>
	
	</p:dialog>
	
</h:body>

</html>

Log de Erro

org.hibernate.PropertyValueException: not-null property references a null or transient value : com.woopper.workshopping.domain.Produto.Preco
at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:106)
at org.hibernate.action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready(AbstractEntityInsertAction.java:132)
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:86)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:492)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:197)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:181)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:216)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:334)
at


@Column( nullable = false, precision = 7, scale = 2 )
private BigDecimal Preco;

<p:outputLabel for="valor" value="Valor :" />
<p:inputText id="valor" size="30" value="#{produtoBean.produto.preco}" 
     required="true" requiredMessage="Este Campo e Obrigatorio !"/>

Desde já deicho claro que nao sou auto de data com programação java web, mais tenho o conhecimento de java para Desktop, passei uma semana quebrando a cabeça e não achei uma forma de corrigir o erro, pesso umildemente a ajuda de vocês acaso for possivel. ?

preciso gravar o preço do produto dentro do banco de dados mais sempre que vou gravar o proço ele retorna falando que meu produto esta null ou que ele esta not_null, porém e ai que vem o problema o preço do produto deve ser sim informado, portanto e um campo obrigatorio.

Desculpe ser chato com isso, o correto é autodidata

Bom, a mensagem de erro é bem clara: você não está passando nenhum valor para o atributo Preco (por quê o nome da variável começa com letra maiúscula?).
Reveja os passos anteriores à invocação desse método e certifique-se que o valor é informado à variável.
Corrija os nomes de atributos: em Java, só as classes possuem nomes iniciados em letras maiúsculas, métodos e atributos sempre têm letras minúsculas em seu início.

Seu atributo tem precisão de 7 e o tamanho do campo é 30?

Valeu cara realmente não tinha percebido que o meu atributo estava em maiúsculo, mas neste caso acredito que terei que tratar vários problemas pois possuo variáveis com o nome codigoNacional e codigoInternacional isso com toda a certeza vai me dar dor de cabeça…

o problema agora e a droga do campo descrição retornando o mesmo erro

@Column( nullable = false ) 
private String descricao;

public String getDescricao() {
	return descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

Acredito que não tenha nada de errado com o campo mais agora até ele esta me dando dor de cabeça…

1 curtida

Depois de todos estes anos nesta indústria vital, descobri que:

  • Não existe mensagem de erro sem um problema real.
  • Problemas não surgem do nada, ou é por falta de atenção ou é por falta de conhecimento ou é por excesso de confiança (falta de testes) ou todos juntos

Logo, se está aparecendo a mesma mensagem e você já resolveu o problema em outra variável, que tal aprender ou por em prática o uso do debug em teu projeto e verificar e certificar que tudo o que está como nullable = false realmente possui valor quando deve ser persistido?

2 curtidas

não compreendi bem o que quis dizer, porém devo lhe passar que, os campos que coloquei nullable = false, são campos que vejo como obrigatórios, e neste caso eu estou dando a informação mas ele persiste em me falar a mesma mensagem de antes, eu fiz os testes utilizando uma classe javatest.java, na classe pude colocar os dados e salvar, porém no xhtml ele retorna este mesmo erro de quando estava utilizando o método com a inicial em maiúsculo…

Se eles são obrigatórios, garanta que são passados para o DAO, a fim de não receber o mesmo erro sempre.

Eu criei minha camada DAO da seguinte forma.

[quote=" package com.woopper.workshopping.dao; ]

import com.woopper.workshopping.domain.Produto;

public class ProdutoDAO extends GenericDAO < Produto > {

}[/quote]

estou fazendo milhares de buscas na internet, para saber qual foi o erro que cometi, mas não acho nada.

ps: no código não tem os “:” eles apareceram devido a forma que coloquei o código aqui…

Venho aqui informar a todos que já corrigi o meu problema, abaixo uma lista do que eu fiz…!

1. Recriei a classe Produto.java
2. Recriei e implementei novamente a minha classe PodutoDAO.java
3. Recriei e implementei novamente a minha classe ProdutoBean.java
4. Recriei e implementei novamente a minha tela produto.xhtml

======================================================================================

As classes anteriores eu as mantive salvas para ver se após ter refeito os passos teria algo de diferente entre elas elas, e para minha surpresa na minha tela produto.xhtml, tinha uma propriedade do Prime Faces aberto que eu tinha me esquecido de fechar <p >, ou seja era um erro puramente por falta de minha atenção…
Obrigado ao @Luis_Augusto_Santos por ter se prontificado a me ajudar…