Ajuda POR FAVOR!!! struts+hibernate
Vanessa
Respostas
Davi Costa
11/11/2010
Se estiver é problema na página.
Abaixo segue um exemplo de mapeamento:
//class Cliente
@OneToMany(mappedBy="cliente")
private List<SubCliente> subClientes;
//class SubCliente
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "CD_CLIENTE", nullable = false)
private Cliente cliente;
Caso vc queira deixá-lo bidirecional.
Senão basyta colocar assim, não faz mais refência na tabela Cliente:
//class SubCliente
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "CD_CLIENTE", nullable = false)
private Cliente cliente;
Att Davi
Vanessa
11/11/2010
@Cascade(CascadeType.SAVE_UPDATE)
private List<Dentista> dentista; Na classe Dentista @ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "cod_cidade", insertable = true, updatable = true)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
private Cidade cidade; mais acho que o problema esta na ACTION, na verdade nao sei direito como fazer lá... vc poderia me da um exemplo de como ficaria um cadastro assim? MUITO OBRIGADA!!!!
Vanessa
11/11/2010
Davi Costa
11/11/2010
Tenta ver como debugar, para ver se está vindo null no objeto dentista, talvez seja aí seu problema.
Att Davi
Vanessa
11/11/2010
Tenta ver como debugar, para ver se está vindo null no objeto dentista, talvez seja aí seu problema.
Att Davi
public String inserirDentista() {
DentistaDao dd = new DentistaDao();
dentista.setCidade(cidade);
if (validadorCampos()) {
if (dd.cadastraDentista(dentista)) {
lista = pd.listarDentistas();
return "sucessoDentista";
} else
return "erro";
} else {
return "incorreto";
}
}<s:select list="cidades" name="cidade.cidade" label="Cidade"/>
Davi Costa
11/11/2010
dd.cadastraDentista(dentista)
Coloca a implementação dele.Essa lista de cidades vem do banco né?
Porque se não vier primeiro vc teria que inserir a cidade.
Bom para debugar vai depender da IDE que estiver usando.
Quando levantar o servidor a primeira coisa que vai fazer e subir em modo debug.
Depois na linha de código que vc que inspecionar vc coloca um break-point, vai na esquerda onde fica as linhas (na verdade os números das linhas) e clica duas vezes com o mouse.
Quando a aplicação para lá vc seleciona com o mouse o seu objeto dentisata antes de ser salvo e clica c o botão direito e inspeciona esse objeto e vai como estáseus atributos.
Outra coisa mostra mais código da sua página, se possível pode até colocá-la inteira.
Att Davi
Vanessa
11/11/2010
dd.cadastraDentista(dentista)
Coloca a implementação dele.Essa lista de cidades vem do banco né?
Porque se não vier primeiro vc teria que inserir a cidade.
Att Davi
public boolean cadastraDentista(Dentista dentista) {
s.save(dentista);
t.commit();
if (t.wasCommitted()) {
return true;
} else {
return false;
}
}
<fieldset style="width: 567px;"> <legend>CADASTRO DE PACIENTES</legend> <s:actionerror/> <s:actionmessage/> <s:form action="dentista!inserirDentista" method="post" validate="true" theme="css_xhtml"> <s:hidden name="dentista.cod_dentista"/> <table> <tr> <th>CPF:</th> <th colspan="5"><s:textfield name="dentista.cpf"/></th> </tr> <tr> <th>Nome:</th> <th colspan="5"><s:textfield name="dentista.nome" size="62" /></th> </tr> <tr> <td>Sexo:</td> <td><s:textfield name="dentista.sexo" size="2" /></td> <th>Idade:</th> <td><s:textfield name="dentista.idade" size="3" /></td> <th>Data de nascimento:</th> <td><s:textfield name="dentista.nascto" size="10"/></td> </tr> <tr> <td>E-mail:</td> <td colspan="5"><s:textfield name="dentista.email" size="62"/></td> </tr> <tr> <td>Endereço:</td> <td colspan="5"><s:textfield name="dentista.endereco" size="62"/></td> </tr> <tr> <td>Bairro:</td> <td colspan="2"><s:textfield name="dentista.bairro" size="15"/></td> <td>Cidade:</td> <td colspan="2"><s:select list="cidades" name="cidade.cidade."/></td> </tr> <tr> <td>CEP:</td> <td colspan="2"><s:textfield name="dentista.cep" /></td> </tr> <tr> <td>Telefone:</td> <td><s:textfield name="dentista.tel_fixo" size="10" /></td> </tr> <tr> <td colspan="3"><s:submit value="GRAVAR" /></td> <td colspan="3"><s:reset value="Limpar" /></td> </tr> </table> </s:form> </fieldset>
Vanessa
11/11/2010
Porque se não vier primeiro vc teria que inserir a cidade.
Davi Costa
11/11/2010
http://www.vaannila.com/struts-2/struts-2-example/struts-2-ui-tags-example-1.html
Acredito que ajudar muito, inclusive dá para baixar os fontes dele.
Att Davi
Vanessa
11/11/2010
dentista.setCidade(cidade);
Davi Costa
11/11/2010
public String inserirDentista() { DentistaDao dd = new DentistaDao();if(cidade == null){ System.out.println("A cidade está nula o problema está aqui!");
}
dentista.setCidade(cidade); if (validadorCampos()) { if (dd.cadastraDentista(dentista)) { lista = pd.listarDentistas(); return "sucessoDentista"; } else return "erro"; } else { return "incorreto"; } }Se no console não imprimir essa linha de código então talvez seu mapeamneto do hibernate não esteja 100%, altera o mapeamento do hibernate para aquele que te passei, pois uso em uma aplicação minha e tenho certeza que funciona.
Att Davi
Davi Costa
11/11/2010
<td colspan="2"><s:select list="cidades" name="cidade.cidade."/></td>
Para :
<td colspan="2"><s:select list="cidades" name="cidade"/></td>
É por isso que a cidade está chegando null.
Att Davi
Vanessa
11/11/2010
Att Davi
Davi Costa
11/11/2010
Aletra a página para ficar desse modo.
<td colspan="2"><s:select list="cidades" name="dentista.cidade"/></td>
E no seu Action :
public String inserirDentista() { DentistaDao dd = new DentistaDao();//retirado esse trecho antigo e coloca esse para testar
if(dentista.getCidade() != null ){
System.out.println("Problema de cidade vir null está corrigido.");
}
if (validadorCampos()) { if (dd.cadastraDentista(dentista)) { lista = pd.listarDentistas(); return "sucessoDentista"; } else return "erro"; } else { return "incorreto"; } }
Vanessa
11/11/2010
Davi Costa
11/11/2010
E altera só a sua página e tenta fazer algum if na cidade e ver se ela está nula, e não só ela como o id dela se ela tiver ou algum outro atributo.
Acredito que o mapeamento q vc postou estava correto. O problema é realmente na cidade q está chegando na sua action.
Faz vários teste na página e na action ate ter certeza q o dentista está com a cidade correta. dá um getCidade().getId() se tiver para ver se não está nulo..
Att Davi
Davi Costa
11/11/2010
Att Davi
Vanessa
11/11/2010
Davi Costa
11/11/2010
Então já matamos um problema que é do Action e da página.
Agora vc vai alterar seu mapeamentoconforme te mandei o exemplo de cliente e subcliente só para testar.
Verifica também outras coisas na entidade,se tem id... vc pode até colocar aqui o código das duas entidades.
att Davi
Vanessa
11/11/2010
att Davi
Davi Costa
11/11/2010
@JoinColumn(name = "cod_cidade", insertable = true, updatable = true)
O fato de estar unilateral não tem problema algum, isso só vai interferir na consulta.
Por exemplo caso na sua aplicação vc vai querer listar os Dentistas pela cidade vale a pena vc deixar bidirecional, senão não há necessidade.
Posta só como ficou esse relacionamento de Cidade e Dentista como vc havia colocado antes.
att Davi
Vanessa
11/11/2010
@JoinColumn(name = "cod_cidade", insertable = true, updatable = true)
O fato de estar unilateral não tem problema algum, isso só vai interferir na consulta.
Por exemplo caso na sua aplicação vc vai querer listar os Dentistas pela cidade vale a pena vc deixar bidirecional, senão não há necessidade.
Posta só como ficou esse relacionamento de Cidade e Dentista como vc havia colocado antes.
att Davi
package bean;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "cidade")
public class Cidade implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
private int cod_cidade;
@Column
private String cidade;
@Column
private String uf;
@OneToMany(mappedBy = "cidade")
private List<Dentista> dentista;
e a classe dentista
package bean;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "paciente")
public class Dentista implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
private int cod_dentista;
@Column(length = 50)
private String nome;
@Column(length = 15)
private String cpf;
@Column(length = 1)
private String sexo;
@Column
private int tel_fixo;
@Column
private int tel_celular;
@Column(length = 40)
private String endereco;
@Column(length = 30)
private String bairro;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "cod_cidade", nullable = false)
private Cidade cidade;
@Column(length = 30)
private String email;
@Column(length = 2)
private String uf;
@Column
private int cep;
...getters e setters...
Davi Costa
11/11/2010
Será que essa cidade está vindo realmente do banco na sua tela.
Tenta ver o id da cidade antes de chamar o método de inserir o dentista, para ver se a cidade tem id diferente de null. Por que se tiver id, não era para estar inserindo a cidade.
Estou colocando abaixo um exemplo de mapeamento completo de clientes e subclientes para vc dar uma olhada:
@Entity(name = "SubCliente")
@Table(name = "TB_SUB_CLIENTE")
public class SubCliente implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1275724149278563701L;
@Id
@SequenceGenerator( name = "subCliente_id", sequenceName = "subCliente_seq", allocationSize = 1 )
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="subCliente_id")
@Column(name = "CD_SUBCLIENTE", nullable = false)
private Long id;
@NotNull
@Column(name = "CODIGO", length = 4, nullable = false)
private String codSubCliente;
@NotNull
@Column(name = "NOME_SUBCLIENTE")
private String nomeSubcliente;
@Column(name = "ENDERECO")
private String endereco;
@Column(name = "BAIRRO")
private String bairro;
@Column(name = "CIDADE")
private String cidade;
@Column(name = "UF", length = 2)
private String uf;
@Column(name = "CEP")
private String cep;
@Column(name = "FONE")
private String fone;
@Column(name = "COMP")
private String complemento;
@NotNull
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "CD_CLIENTE", nullable = false)
private Cliente cliente;
//getters e setters omitidos, equals e hashCode (vc os implementou né?)
@Entity(name = "Cliente")
@Table(name = "TB_CLIENTE")
public class Cliente implements Serializable{
/**
*
*/
private static final long serialVersionUID = -1598352828685913699L;
@Id
@SequenceGenerator( name = "cliente_id", sequenceName = "cliente_seq", allocationSize = 1 )
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="cliente_id")
@Column(name = "CD_CLIENTE", nullable = false)
private Long id;
@NotNull
@Pattern(regex="[0-9]")
@Column(name = "CODIGO", length = 4, nullable = false)
private String codCliente;
@Column(name = "NOME_CLIENTE", length = 100, nullable = false)
private String nomeCliente;
@Column(name = "RAZAO_SOCIAL")
private String razaoSocial;
@Column(name = "CNPJ_CGC")
private String cnpjCgc;
@Column(name = "CGF")
private Long cgf;
@Column(name = "ENDERECO")
private String endereco;
@Column(name = "COMP")
private String complemento;
@Column(name = "BAIRRO")
private String bairro;
@Column(name = "CIDADE")
private String cidade;
@Column(name = "UF", length = 2)
private String uf;
@Column(name = "CEP")
private String cep;
@Column(name = "FONE")
private String fone;
@Column(name = "SITE")
private String site;
@OneToMany(mappedBy="cliente")
private List<SubCliente> subClientes;
//getters e setters omitidos
No código com fundo amarelo mais em destaque eu perguntei se vc implementou equals e hashCode, porque se vc não implementou o hibernate nãotem como saber quando uma cidade é diferente da outra, por isso ele está inserindo mais um registro.
att Davi
Davi Costa
11/11/2010
@Entity @Table(name = "paciente") public class Dentista implements Serializable {
Esse valor de name="paciente" está correto?
Att Davi
Vanessa
11/11/2010
No código com fundo amarelo mais em destaque eu perguntei se vc implementou equals e hashCode, porque se vc não implementou o hibernate nãotem como saber quando uma cidade é diferente da outra, por isso ele está inserindo mais um registro.
att Davi
Vanessa
11/11/2010
@Entity @Table(name = "paciente") public class Dentista implements Serializable {
Esse valor de name="paciente" está correto?
Att Davi
Davi Costa
11/11/2010
Se for Eclipse, voce vai pressionar o botão direito sobre a classe e escolher a opção Source --> Generate hashCode() and equal()... Vai se abrir uma janela com os atributos da classe, vc só vai selecionar o id.
Faz isso nas duas classes.
se etiver usando o Netbeans não sei de cabeça, mas é algo muito parecido com o eclipse clica c o botão direito na classe e e procura algo parecido com o eclipse.
att Davi
Vanessa
11/11/2010
Se for Eclipse, voce vai pressionar o botão direito sobre a classe e escolher a opção Source --> Generate hashCode() and equal()... Vai se abrir uma janela com os atributos da classe, vc só vai selecionar o id.
Faz isso nas duas classes.
se etiver usando o Netbeans não sei de cabeça, mas é algo muito parecido com o eclipse clica c o botão direito na classe e e procura algo parecido com o eclipse.
att Davi
Davi Costa
11/11/2010
Tb atenta para aquela questão do id da cidade que está sendo setada para o dentista (antes de inserir o dentista), se o id da Cidade está vindo nulo é pq não está vindo do banco, pode ser por isso que está dando um insert na Cidade.
Att Davi
Vanessa
11/11/2010
Davi Costa
11/11/2010
mas se a telanão dava e agora está dando, será q vc n digitou algo nela sem kerer... dá um ctrl +z na página p ver se vc n digitou algum aracter sem kerer q quebrou sua página. Ou deu tudo certo e deveria ser redirecionado para outra tela.. e essa outra tela tá kebrada?... mas realmente não conheço esse erro :/
Att Davi
Vanessa
11/11/2010
Davi Costa
11/11/2010
Revisa tudo e pasa feedBack depois.
Bom trabalho!
Att Davi
Vanessa
11/11/2010
Bom trabalho!
Att Davi
Vanessa
11/11/2010
<s:select list="cidades" name="cidade"/>
e aí não aparaceu erro nenhum. O problema é nesta tag. Já tentei de várias formas:
<s:select list="cidades" name="cidade.cidade"/> <s:select list="cidades" name="dentista.cidade"/>
Mais qualquer coisa que eu coloque aí dá erro. será que este é a forma correta de fazer?
Davi Costa
11/11/2010
<s:select name="country" list="countryList" listKey="countryId" listValue="countryName" headerKey="0" headerValue="Country"label="Select a country" />
Retirado justamente daquele link que te passei:
http://www.vaannila.com/struts-2/struts-2-example/struts-2-ui-tags-example-1.html
O que mais me impressiona era q antes aparecia normalmente ou não?
na Action te esse atributo cidade e seus respectivos getters and setters?.. a Tela pelo menos aparece e só dá erro depois? Ou nem renderiza para ser salvo o Dentista?
Att Davi
Vanessa
11/11/2010
<s:select name="country" list="countryList" listKey="countryId" listValue="countryName" headerKey="0" headerValue="Country" label="Select a country" />
Retirado justamente daquele link que te passei:
http://www.vaannila.com/struts-2/struts-2-example/struts-2-ui-tags-example-1.html
O que mais me impressiona era q antes aparecia normalmente ou não?
na Action te esse atributo cidade e seus respectivos getters and setters?.. a Tela pelo menos aparece e só dá erro depois? Ou nem renderiza para ser salvo o Dentista?
Att Davi
Vanessa
11/11/2010
<s:select name="country" list="countryList" listKey="countryId" listValue="countryName" headerKey="0" headerValue="Country" label="Select a country" />
Retirado justamente daquele link que te passei:
http://www.vaannila.com/struts-2/struts-2-example/struts-2-ui-tags-example-1.html
O que mais me impressiona era q antes aparecia normalmente ou não?
na Action te esse atributo cidade e seus respectivos getters and setters?.. a Tela pelo menos aparece e só dá erro depois? Ou nem renderiza para ser salvo o Dentista?
Att Davi
<td colspan="2"><s:select name="cidade" list="{'India','USA','UK'}" headerKey="" headerValue="Selecione" />
e funcionou. mais quando coloco na opção List o nome da lista que tenho na action dá o erro.
Davi Costa
11/11/2010
Talvez essas cidades ainda estejam referenciado paciente. tenta ver isso nem q tenha q apagar sua cidades e inserir dnovo.
att Davi
Vanessa
11/11/2010
Talvez essas cidades ainda estejam referenciado paciente. tenta ver isso nem q tenha q apagar sua cidades e inserir dnovo.
att Davi
Davi Costa
11/11/2010
tem que comparar bem o q está no banco e nas entidades java se tem algum reggistro q seria incompatível, por exemplo um campo notnull na entidade q no registro do banco esteja permitindo nulo e nulo no regsitro.
Qual seu banco? Posta aqui o script do banco da tabela dentista, paciente e cidade.
É muito importante que vc veja como debugar, é uma mão na roda e rapidinho vc vai identificar muitos problemas.
Se já tiver manjando de debugue, coloca um break point no método que captura as cidades no banco e também no get da sua lista na action.
Att Davi
Vanessa
11/11/2010
Davi Costa
11/11/2010
Att Davi
Vanessa
11/11/2010
Vanessa
11/11/2010
Davi Costa
11/11/2010
Deixa eu te passar só mais uma alteração p vc testar. Coloca na sua página:
list="" // testa assim entre chaves p ver se corrige o erro.
Att Davi
Vanessa
11/11/2010
Davi Costa
11/11/2010
Pois ele não tinha relacionamento ManyToOne. Eu fiz e coloquei a tag <s:select para funcionar ... realmente deu um pouco de trabalho. Mandei p seu email, mas sem os jars. Caso tenha algum problema de jar me avisa q depois te passo.
Att Davi
Dyego Carmo
11/11/2010
Resolvido ?
Vanessa
11/11/2010
Davi Costa
11/11/2010
identifica o action que cadastra livro, assim como sua página,.
vc vai perceber que pego o id do membro e busco no banco ese membro para inserir no livro.
E na página verifique tb como usei a tag <s:select/>. Acredito que seu foco deve ser aí.
Para resolver seu problema que é para sexta pode abstrair o resto. Depois vc olha o que é novidade para vc na calma.
Att Davi
Davi Costa
11/11/2010
Att Davi
Vanessa
11/11/2010
Dyego Carmo
11/11/2010