Hibernate - Relação de Entidades

Galera estou com um pequeno problema creio eu, criei duas classes cliente e endereço conforme abaixo

classe cliente

@Entity
@Table
public class Cliente extends Model implements Serializable {
    
    @Id //Fazendo com que o banco de dados transforme o id em serial.
    @GeneratedValue(strategy=GenerationType.IDENTITY)//GenerationType.IDENTITY esse identity faz com que o cada tabela tenha sua propria sequencia de pk;
    private int id;
	
    @Column(unique = true)//este comando impossibilita de cadastrar nomes iguais na coluna nome.
    private String nome;
    
	private String telefone;
    
	private String cpf;
	
    @OneToOne
    private Endereco endereco;

Classe endereco

@Entity
@Table
public class Endereco extends Model implements Serializable {

	@Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)//GenerationType.IDENTITY esse identity faz com que o cada tabela tenha sua propria sequencia de pk;
    private int id;
    private String cidade;
    private String bairro;
    private String rua;
    private String numero;
    private String complemento;
    
	@OneToOne 
    private Cliente cliente;

O problema que ta gerando é que no banco de dados ao cadastrar o cliente e o endereco juntos a tabela cliente ta consegue pegar o id do endereco mas o endereco não consegue pegar o id do cliente fica null.

para fazer este teste criei um classe principal adicionar e coloquei o codigo como esta abaixo…

    public class Adicionar {

    public static void main(String[] args) {
        HibernateDAO dao = new HibernateDAO();
        
        
        Endereco end = new Endereco("MACEIO", "JAÇA", "MEC", "83", "DE FRENTE AO RACINE");
        dao.add(end);
        
        dao = new HibernateDAO();
        Cliente cli = new Cliente("GABRIEL SANTOS", "12313211321", "11561651615", end);
        dao.add(cli);
    }
}

mesmo assim ja tentei colocar o cliente ali no construtor do endereco mas ele não consegue enxergar
o cliente pois o cliente é adicionado posteriormente, algum anjo do ceu pode me ajudar neste problema??

Bom dia rapaz,

Voce esta usando criteria ,hql ou query nativa ?

query nativa @igoralves

1 curtida

@Gabriel_barreto

Consegue disponibilizar a query para que eu possa dar uma olhada ??

opa brother conseguir resolver este problema, vou lhe mostrar o metodo que ultilizei

@Entity
@Table
@SequenceGenerator(name="cliente_seq", sequenceName = "cliente_seq",initialValue=1, allocationSize = 1)// comando para criar uma sequencia propria para a tabela atual.
public class Cliente extends Model implements Serializable {

	@Id //Fazendo com que o banco de dados transforme o id em serial.
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "cliente_seq")//GenerationType.IDENTITY esse identity faz com que o cada tabela tenha sua propria sequencia de pk;
	private int id;
	
	@Column(unique = true)//este comando impossibilita de cadastrar nomes iguais na coluna nome.
	private String nome;
	
	private String telefone;
	private String cpf;
	
	@OneToOne (cascade = CascadeType.ALL)
	private Endereco endereco;
@Entity
@Table
@SequenceGenerator(name="endereco_seq", sequenceName = "endereco_seq" ,initialValue=1, allocationSize = 1)
public class Endereco extends Model implements Serializable {
	
	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "endereco_seq")
	private int id;
	
	private String cidade;
	private String bairro;
	private String rua;
	private String numero;
	private String complemento;
	
	@OneToOne
	private Cliente cliente;

Se vai usar native query, por que não fica com o JDBC mesmo?

Além disso, eu não sei de onde você tirou que o cliente precisa de uma referência do endereço. Em geral, endereço pertence a um cliente, não o contrário. Logo, ou você cria uma tabela associativa (e altera a relação para N:M ou você só coloca a FK do cliente no endereço.

Além disso, o que acontece quando você tem um objeto dentro do outro e um pega o ID e o outro não é que você não deve estar setando as instâncias adequadamente. O que é um erro bem comum.

Endereço e = new Endereco();
//Seta os atributos do endereço
Cliente c = new Cliente();
c.setEndereco(); //Ok, aqui pega o id do endereço
e.setCliente(c); //Aqui faz com que o endereço pegue o id do cliente.