Problemas com mapeamento usando Hibernate Annotations

Olá todos,

Eu criei 3 classes ClienteDTO, EnderecoDTO e TelefoneDTO com relacionamento de 1:1 em Cliente e Endereco e de 1:N em Cliente e Telefone.

O problema é o seguinte eu fiz o mapeamento de cliente com a classe endereco, funcionou belezinha. Quando excluia o cliente ele excluia o endereço. :slight_smile: Só que eu criei a classe telefone e agora eu não consigo salvar os dados do telefone, eu percebi quando eu passo os dados do cliente ele vai também os dados do endereço. Eu acho que é isso q esta dando problema na hora de salvar. Alguém pode me ajudar?

Eu vou passar o codigo da minha classe.

ClienteDTO

@Entity
@Table(name = "cliente")
public class ClienteDTO extends DTO {

    /**
	 * 
	 */
//	private static final long serialVersionUID = 1L;

	@Id
    @Column(name = "codigo", nullable = false)
    private Integer codigo;

    @Column(name = "nome", nullable = false)
    private String nome;

    private String cnpj;

    private String data;
    private String obs;
    
    @OneToOne
    @JoinColumn(name="codigo")
    private EnderecoDTO endereco;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "cliente")
    private List<TelefoneDTO> listTelefone;

EnderecoDTO

@Entity
@Table(name = "endereco")
public class EnderecoDTO extends DTO {

    @Id
    @Column(name = "id", unique = true, nullable = false)
    private Integer id;

    @Column(name = "rua", nullable = false)
    private String rua;

    @Column(name = "complemento")
    private String complemento;

    @Column(name = "cep")
    private String cep;

    @Column(name = "bairro")
    private String bairro;

    @Column(name = "cidade")
    private String cidade;

    
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "endereco")
    private ClienteDTO cliente;

TelefoneDTO

@Entity
@Table(name = "telefone")
public class TelefoneDTO extends DTO {

    @Id
    @Column(name = "id", nullable = false)
    private Integer id;
    
    private Integer ddd;
    
    @Column(name = "numero", nullable = false)
    private String numero;
    
    private String tipo;

    @JoinColumn(name = "codCliente" )
    @ManyToOne
    private ClienteDTO cliente;

ClienteTeste

public class ClienteTeste {

	public static void main(String args[]){
		
		ClienteDTO clienteDTO = new ClienteDTO();
		try{
			
			clienteDTO.setCodigo(3);
			clienteDTO.setNome("Ana");
			clienteDTO.setObs("Muito Bom");
			

			EnderecoDTO enderecoDTO = new EnderecoDTO();
			enderecoDTO.setId(3);
			enderecoDTO.setRua("Rua: BBBBBBBBBB");
			enderecoDTO.setBairro("KKKKKKKKKK");
			enderecoDTO.setCep("HHHHHHHHHH");
			enderecoDTO.setCidade("YYYYYYY");
			enderecoDTO.setComplemento("");
			
			System.out.println("CodEnd: "+ enderecoDTO.getId());
			clienteDTO.setEndereco(enderecoDTO);

			//Tenta salvar o cliente no banco
			System.out.println("Salvando ....");
			//salva o cliente e o seu endereco
	//		DAOFactory.getClientePersistence().save(clienteDTO);
//			//apaga o cliente e o seu  endereco
			System.out.println("CodEnd: "+ enderecoDTO.getCliente());
			DAOFactory.getClientePersistence().save(clienteDTO);
			
			//não precisa implementar
			System.out.println("CodEnd: "+ enderecoDTO.getCliente());
			DAOFactory.getEnderecoPersistence().save(enderecoDTO);
			System.out.println("Salvo com sucesso ....");
		}catch(Exception e){
			System.out.println("Erro em salvar: "+e);
		}

		System.out.println("Listando ....");
		//Tenta listar todos os dados no banco
		try{
			List<ClienteDTO> lista = DAOFactory.getClientePersistence().find(null);
			for(ClienteDTO c :lista){

				System.out.println();
				System.out.println("Código: "+c.getCodigo());
				System.out.println("Nome: "+c.getNome());
				System.out.println("....Endereço ....");
				Map<String,Object> request = new HashMap<String,Object>();
				int cod = c.getCodigo();
				System.out.println("cod: "+cod);
				request.put("id", cod);
				List<EnderecoDTO> list = DAOFactory.getEnderecoPersistence().find(request);
				EnderecoDTO e = (EnderecoDTO) list.get(0);
				System.out.println();
				System.out.println("ID: "+e.getId());
				System.out.println("Rua: "+e.getRua());
		}
		}catch(Exception e){
			System.out.println("Erro em listar: "+e);
		}
		System.out.println("...............................");

try{
	

	 System.out.println("Salvando Dados Telefone...");
	
		TelefoneDTO telefoneDTO = new TelefoneDTO();
		telefoneDTO.setId(1);
		telefoneDTO.setDdd(18);
		telefoneDTO.setNumero("3644 8899");
		telefoneDTO.setTipo("comercial");
		telefoneDTO.setCodCliente(clienteDTO);
		 System.out.println("codigo cli: "+ telefoneDTO.getCodCliente());
		DAOFactory.getTelefonePersistence().save(telefoneDTO);
		System.out.println("Salvo com sucesso!");
		
		System.out.println(); System.out.println();
		System.out.println("Listando Dados Telefone...");
		//listando os dados do telefone
/*		List<TelefoneDTO> listat = DAOFactory.getTelefonePersistence().find(null);
		for(TelefoneDTO t : listat){
			System.out.println("Id: "+t.getId());
			System.out.print("DDD: "+t.getDdd());
			System.out.println(" Numero: "+t.getNumero());
			System.out.println("Tipo: "+t.getTipo());
			System.out.println("CodCli: "+t.getCodCliente());
		System.out.println();
		}*/	
	 }catch(Exception e){
		 System.out.println("Salvar: "+e);
	 }
	
	}

Mensagem de erro

13:01:34,406  INFO SessionFactoryImpl:161 - building session factory
13:01:34,906  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
Hibernate: /* get current state br.com.sisfarm.dto.ClienteDTO */ select clientedto_.codigo, clientedto_.nome as nome0_, clientedto_.cnpj as cnpj0_, clientedto_.data as data0_, clientedto_.obs as obs0_ from cliente clientedto_ where clientedto_.codigo=?
CodEnd: null
Hibernate: /* get current state br.com.sisfarm.dto.EnderecoDTO */ select enderecodt_.id, enderecodt_.rua as rua2_, enderecodt_.complemento as compleme3_2_, enderecodt_.cep as cep2_, enderecodt_.bairro as bairro2_, enderecodt_.cidade as cidade2_ from endereco enderecodt_ where enderecodt_.id=?
Salvo com sucesso ....
Listando ....
Hibernate: /* criteria query */ select this_.codigo as codigo0_2_, this_.nome as nome0_2_, this_.cnpj as cnpj0_2_, this_.data as data0_2_, this_.obs as obs0_2_, enderecodt2_.id as id2_0_, enderecodt2_.rua as rua2_0_, enderecodt2_.complemento as compleme3_2_0_, enderecodt2_.cep as cep2_0_, enderecodt2_.bairro as bairro2_0_, enderecodt2_.cidade as cidade2_0_, clientedto3_.codigo as codigo0_1_, clientedto3_.nome as nome0_1_, clientedto3_.cnpj as cnpj0_1_, clientedto3_.data as data0_1_, clientedto3_.obs as obs0_1_ from cliente this_ left outer join endereco enderecodt2_ on this_.codigo=enderecodt2_.id left outer join cliente clientedto3_ on enderecodt2_.id=clientedto3_.codigo

Código: 1
Nome: Ana
....Endereço ....
cod: 1
Hibernate: /* criteria query */ select this_.id as id2_2_, this_.rua as rua2_2_, this_.complemento as compleme3_2_2_, this_.cep as cep2_2_, this_.bairro as bairro2_2_, this_.cidade as cidade2_2_, clientedto2_.codigo as codigo0_0_, clientedto2_.nome as nome0_0_, clientedto2_.cnpj as cnpj0_0_, clientedto2_.data as data0_0_, clientedto2_.obs as obs0_0_, enderecodt3_.id as id2_1_, enderecodt3_.rua as rua2_1_, enderecodt3_.complemento as compleme3_2_1_, enderecodt3_.cep as cep2_1_, enderecodt3_.bairro as bairro2_1_, enderecodt3_.cidade as cidade2_1_ from endereco this_ left outer join cliente clientedto2_ on this_.id=clientedto2_.codigo left outer join endereco enderecodt3_ on clientedto2_.codigo=enderecodt3_.id where this_.id=?

ID: 1
Rua: Rua: XXXXXXXXXXX

Código: 2
Nome: Jorge
....Endereço ....
cod: 2
Hibernate: /* criteria query */ select this_.id as id2_2_, this_.rua as rua2_2_, this_.complemento as compleme3_2_2_, this_.cep as cep2_2_, this_.bairro as bairro2_2_, this_.cidade as cidade2_2_, clientedto2_.codigo as codigo0_0_, clientedto2_.nome as nome0_0_, clientedto2_.cnpj as cnpj0_0_, clientedto2_.data as data0_0_, clientedto2_.obs as obs0_0_, enderecodt3_.id as id2_1_, enderecodt3_.rua as rua2_1_, enderecodt3_.complemento as compleme3_2_1_, enderecodt3_.cep as cep2_1_, enderecodt3_.bairro as bairro2_1_, enderecodt3_.cidade as cidade2_1_ from endereco this_ left outer join cliente clientedto2_ on this_.id=clientedto2_.codigo left outer join endereco enderecodt3_ on clientedto2_.codigo=enderecodt3_.id where this_.id=?

ID: 2
Rua: Rua: MMMMMMMMMMMM

Código: 3
Nome: Ana
....Endereço ....
cod: 3
Hibernate: /* criteria query */ select this_.id as id2_2_, this_.rua as rua2_2_, this_.complemento as compleme3_2_2_, this_.cep as cep2_2_, this_.bairro as bairro2_2_, this_.cidade as cidade2_2_, clientedto2_.codigo as codigo0_0_, clientedto2_.nome as nome0_0_, clientedto2_.cnpj as cnpj0_0_, clientedto2_.data as data0_0_, clientedto2_.obs as obs0_0_, enderecodt3_.id as id2_1_, enderecodt3_.rua as rua2_1_, enderecodt3_.complemento as compleme3_2_1_, enderecodt3_.cep as cep2_1_, enderecodt3_.bairro as bairro2_1_, enderecodt3_.cidade as cidade2_1_ from endereco this_ left outer join cliente clientedto2_ on this_.id=clientedto2_.codigo left outer join endereco enderecodt3_ on clientedto2_.codigo=enderecodt3_.id where this_.id=?

ID: 3
Rua: Rua: BBBBBBBBBB
...............................
Salvando Dados Telefone...
codigo cli: br.com.sisfarm.dto.ClienteDTO{codigo=3, obs=Muito Bom, map={}, data=null, listTelefone=null, class=class br.com.sisfarm.dto.ClienteDTO, nome=Ana, cnpj=null, endereco=br.com.sisfarm.dto.EnderecoDTO{id=3, cidade=YYYYYYY, bairro=KKKKKKKKKK, complemento=, cep=HHHHHHHHHH, cliente=null, rua=Rua: BBBBBBBBBB, map={}, class=class br.com.sisfarm.dto.EnderecoDTO}}
Salvar: java.lang.ClassCastException: br.com.sisfarm.hao.EnderecoHAO cannot be cast to br.com.sisfarm.hao.TelefoneHAO

Rodrigo,

Pelo que eu percebi no seu código está dando um erro de casting.
Ou seja, você está tentando “atribuir” um EnderecoHAO a um TelefoneHAO, e isso está gerando uma exeção.

[quote=rodrigo.p]Mensagem de erro

Salvar: java.lang.ClassCastException: br.com.sisfarm.hao.EnderecoHAO cannot be cast to br.com.sisfarm.hao.TelefoneHAO[/quote]
Eu acho que tem alguma coisa errada, afinal eu não avistei essas duas classes EnderecoHAO e TelefoneHAO.
Tenta debugar esse código e vê como ele está se comportando no método save no momento em que você manda salvar o TelefoneDTO. Qualquer novidade, posta aqui.

Abraço.