Tenho uma entidade com CRUD que funcionava perfeitamente.
Após implementar validação do formulário com Jquery validation a lista continua aparecendo, mas ao editar ou incluir e efetuar o submit obtenho a saída abaixo:
org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.ericsson.etracking.modelo.Agenda.status
Sei que ocorre porque o atributo no bean está setado como @Column(nullable=false), o que está correto, pois o dado é obrigatório.
Pesquisando no fórum, e na web, vi alguns colegas removendo o nullable.
Me parece que os parâmetros após o submit estão vindo vazios.
Alguém tem uma sugestão de como resolver mantendo a não aceitação para nulo?
Exite algum @Transient no campo que está vindo com erro?
Não Mickdark. O pior é que não percebo um ponto de partida…
Fabiaonoalima, pode colocar o código do mapeamento e a página com validation que vc implementou!!
remoção de post duplicado.
Deixei somente um atributo para simplificar ok?
package br.com.ericsson.etracking.modelo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Agenda {
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
private Long id;
@Column(nullable=false, length=30)
private String status;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status= status;
}
}
O mapeamento do hibernate:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Configurações para conexão com o db -->
<property name="hibernate.connection.username">etracking</property>
<property name="hibernate.connection.password">******</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/etracking</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="show_sql">false</property>
<property name="format_sql">true</property>
<!-- entidades -->
<mapping class="br.com.ericsson.etracking.modelo.Agenda" />
</session-factory>
</hibernate-configuration>
No head da página usei:
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript" src="http://jzaefferer.github.com/jquery-validation/jquery.validate.js"></script>
<script type="text/javascript" src="<c:url value="/js/jquery_validation.js"/>"></script>
No “/js/jquery_validation.js”:
$(document).ready(function(){
$("#form").validate({
rules: {
status: {required: true },
},
messages:{
status:{
required: " Informe o status Final",
minlength: " Status deve conter, no minimo, 3 caracteres"
}
},
submitHandler: function(form){
if(confirm('Tem certeza?'))form.submit();
}
});
});
Bom!! Você pode tentar fazer 3 coisas:
Tenta tirar esse validation do gitHub ou escolhe apenas um deles para ficar:
Nesta linha
rules: {
status: {required: true },
},
pode deixar assim
rules: {
status: "required",
},
E tenta tirar essa function handler para ver se funciona
,
submitHandler: function(form){
if(confirm('Tem certeza?'))form.submit();
}
O log persiste.
Vou postar meu form abaixo.
<form class="form" action="<c:url value="/agenda/${agenda.id}"/>" method="Post">
<fieldset>
<legend>EDITAR AGENDAMENTO</legend>
<table border="0">
<tr>
<td>
<label for="siteDestino">Site Destino</label>
</td>
<td>
<input class="field" id="siteDestino"
type="text" size="60" name="siteDestino" value="${agenda.siteDestino}"/>
</td>
</tr>
<tr>
<td>
<label for="logradouro">Logradouro</label>
</td>
<td>
<input class="field" id="logradouro"
type="text" size="60" name="logradouro" value="${agenda.logradouro}"/>
</td>
</tr>
<tr>
<td>
<label for="localidade">Localidade</label>
</td>
<td>
<input class="field" id="localidade"
type="text" size="60" name="localidade" value="${agenda.localidade}"/>
</td>
</tr>
<tr>
<td>
<label for="uf">UF</label>
</td>
<td>
<input class="field" id="uf"
type="text" size="60" name="uf" value="${agenda.uf}"/>
</td>
</tr>
<tr>
<td>
<label for="data">Data</label>
</td>
<td>
<input class="field" id="data"
type="text" size="60" name="data" value="${agenda.data}"/>
</td>
</tr>
<tr>
<td>
<label for="hora">Hora</label>
</td>
<td>
<input class="field" id="hora"
type="text" size="60" name="hora" value="${agenda.hora}"/>
</td>
</tr>
<tr>
<td>
<label for="rota">Rota</label>
</td>
<td>
<input class="field" id="rota"
type="text" size="60" name="rota" value="${agenda.rota}"/>
</td>
</tr>
<tr>
<td>
<label for="contato">Contato</label>
</td>
<td>
<input class="field" id="contato"
type="text" size="60" name="contato" value="${agenda.contato}"/>
</td>
</tr>
<tr>
<td>
<label for="telefone">Telefone</label>
</td>
<td>
<input class="field" id="telefone"
type="text" size="60" name="telefone" value="${agenda.telefone}"/>
</td>
</tr>
<tr>
<td>
<label for="infra">Infra</label>
</td>
<td>
<input class="field" id="infra"
type="text" size="60" name="infra" value="${agenda.infra}"/>
</td>
</tr>
<tr>
<td>
<label for="obs">Observação</label>
</td>
<td>
<input class="field" id="obs"
type="text" size="60" name="obs" value="${agenda.obs}"/>
</td>
</tr>
<tr>
<td>
<label for="localSaida">Local Sainda</label>
</td>
<td>
<input class="field" id="localSaida"
type="text" size="60" name="localSaida" value="${agenda.localSaida}"/>
</td>
</tr>
<tr>
<td>
<label for="status">Status</label>
</td>
<td>
<select class="field" id=status name="status"
style="width: 400px">
<option value="" selected="selected">${agenda.status}</option>
<option value="Pendente">Pendente</option>
<option value="Agendado">Agendado</option>
<option value="Cross Docking">Cross Docking</option>
<option value="Devolvido a EDB">Devolvido a EDB</option>
<option value="Devolvido a WH SJC">Devolvido a WH SJC</option>
<option value="Em Transito/HUB">Em Transito/HUB</option>
<option value="Entregue">Entregue</option>
<option value="Reversa EDB Agendada">Reversa EDB Agendada</option>
</select>
</td>
</tr>
<tr>
<td>
<label for="solicitante">Solicitante</label>
</td>
<td>
<input class="field" id="solicitante"
type="text" size="60" name="solicitante" value="${agenda.solicitante}"/>
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type="hidden" name="_method" value="put" />
<input class="linkNew" type="submit" value="SALVAR"/>
</td>
</tr>
</table>
</fieldset>
</form>
Rapaz, vc colocou uma classe no form e nao um id!!
Ao invés disso
$("#form").validate({
Tenta isso
$(".form").validate({
A validação funciona normal, e o submit também após remover o handler, mas quando efetua o submit…
org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.ericsson.etracking.modelo.Agenda.contato
Porém mudou o atributo reclamado, antes era
br.com.ericsson.etracking.modelo.Agenda.status
agora é
br.com.ericsson.etracking.modelo.Agenda.contato
você pode postar a classe mapeada completa!
É um bean. To pensando em remover as últimas implementações e se funcionar, reimplementar…
Mas aí a raíz do problema permanecerá oculta…
package br.com.ericsson.etracking.modelo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Agenda {
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
private Long id;
@Column(name = "site_destino", nullable = false, length=20)
private String siteDestino;
@Column(nullable = false, length=60)
private String logradouro;
@Column(nullable=false, length=60)
private String localidade;
@Column(nullable=false, length=2)
private String uf;
@Column(nullable=false, length=10)
private String data;
@Column(nullable=false, length=5)
private String hora;
@Column(nullable=false, length=2)
private String rota;
@Column(nullable=false, length=20)
private String contato;
@Column(nullable=false, length=14)
private String telefone;
@Column(nullable=false, length=20)
private String infra;
@Column(nullable=false, length=60)
private String obs;
@Column(name = "local_saida", nullable = false, length=20)
private String localSaida;
@Column(nullable=false, length=30)
private String status;
@Column(nullable=false, length=25)
private String solicitante;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public String getSiteDestino() {
return siteDestino;
}
public void setSiteDestino(String siteDestino) {
this.siteDestino = siteDestino;
}
public String getLogradouro() {
return logradouro;
}
public void setLogradouro(String logradouro) {
this.logradouro = logradouro;
}
public String getLocalidade() {
return localidade;
}
public void setLocalidade(String localidade) {
this.localidade = localidade;
}
public String getUf() {
return uf;
}
public void setUf(String uf) {
this.uf = uf;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getHora() {
return hora;
}
public void setHora(String hora) {
this.hora = hora;
}
public String getRota() {
return rota;
}
public void setRota(String rota) {
this.rota = rota;
}
public String getContato() {
return contato;
}
public void setContato(String contato) {
this.contato = contato;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
public String getInfra() {
return infra;
}
public void setInfra(String infra) {
this.infra = infra;
}
public String getObs() {
return obs;
}
public void setObs(String obs) {
this.obs = obs;
}
public String getLocalSaida() {
return localSaida;
}
public void setLocalSaida(String localSaida) {
this.localSaida = localSaida;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status= status;
}
public String getSolicitante() {
return solicitante;
}
public void setSolicitante(String solicitante) {
this.solicitante = solicitante;
}
}
Falta de ler a documentação!
o name do seus inputs tem que seguir a convenção do vraptor!
name=“agenda.status” e assim com todos eles!
Eu li, estava assim, removi a pouco para testar, vou mudar novamente, postarei o resultado.
Mickdark e kadu.m.lino,
Temos a seguinte conclusão:
Conforme kadu.m.lino mencionou o name dos inputs tem que seguir a convenção vraptor, (exemplo: name=“agenda.status”), caso contrário teremos a saída abaixo:
org.hibernate.PropertyValueException: not-null property references a null or transient value: br.com.ericsson.etracking.modelo.Agenda.siteDestino
Estou utilizando JQuery Validation da seguinte forma em um arquivo .js
O problema é que preciso informar o seguinte para o Jquery que não aceita agenda.siteDestino devido o (.) ser um seletor:
$(document).ready(function(){
$("#form").validate({
rules: {
agenda.siteDestino: {required: true, minlength: 2 },
},
messages:{
agenda.siteDestino:{
required: " Informe o site destino",
minlength: " O site destino deve conter, no minimo, 2 caracteres"
}
}
});
});
[color=red]A questão é que só é possível acrescentar a convenção do vraptor no validation do JQuery utilizando aspas (“agenda.siteDestino”) na rules devido o ponto.
[/color]
Solução:
$(document).ready(function(){
$("#form").validate({
rules: {
"agenda.siteDestino": {required: true, minlength: 2 },
},
messages:{
"agenda.siteDestino":{
required: " Informe o site destino",
minlength: " O site destino deve conter, no minimo, 2 caracteres"
}
}
});
});
Não sei se está claro, então segue 2 links para esclarecer:
http://www.guj.com.br/java/202203-jquery--id-funciona-empresaid-nao-funciona
http://api.jquery.com/category/selectors
Mais uma vez o fórum ajudou muito. Grato pela atenção!