[RESOLVIDO] Hibernate Annotations - Preencher automaticamente uma coluna de outra tabela

6 respostas
R

Bom dia a todos,

Estou com uma duvida, pesquisei bastante na internet sobre como resolver, porem tem informacoes divergentes, testei algumas mas sem sucesso.

Tenho 2 c classes, Endereco e Pessoa. O que quero fazer é que a chave primaria de Endereco seja a mesma foreign key, que referencia a chave primaria de Pessoa.

Quando eu setar uma pessoa, automaticamente a coluna da chave primaria de endereco seja preenchida com o mesmo valor da chave primaria de Pessoa.

Nao sei quais anotações usar.

Desde ja agradeço qualquer informação.

Segue as classes:

Classe Pessoa

@Entity
@Table(name = "pessoa")
public class PessoaTO implements Serializable {

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

	@Id
	@SequenceGenerator(name = "PESSOA_GENERATION", sequenceName = "pessoa_id_seq", allocationSize = 1)
	@GeneratedValue(generator = "PESSOA_GENERATION", strategy = GenerationType.SEQUENCE)
	private Integer id;

	@Column(name = "nome", nullable = false)
	private String nome;
	
	@OneToOne(fetch = FetchType.EAGER)
	@Fetch(FetchMode.JOIN)
	private EnderecoTO endereco;
	
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public EnderecoTO getEndereco() {
		return endereco;
	}

	public void setEndereco(EnderecoTO endereco) {
		this.endereco = endereco;
	}

}

Classe Endereco

@Entity
@Table(name = "endereco")
public class EnderecoTO implements Serializable {

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

	@Id
	@SequenceGenerator(name = "ENDERECO_GENERATION", sequenceName = "endereco_id_seq", allocationSize = 1)
	@GeneratedValue(generator = "ENDERECO_GENERATION", strategy = GenerationType.SEQUENCE)
	private Integer id;

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

	@OneToOne
	private PessoaTO pessoa;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getLogradouro() {
		return logradouro;
	}

	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}

	public PessoaTO getPessoa() {
		return pessoa;
	}

	public void setPessoa(PessoaTO pessoa) {
		this.pessoa = pessoa;
	}

}

6 Respostas

Hebert_Coelho

Aqui mostra como fazer: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

R

Vlw, vou ler tudinho, se eu conseguir resolver coloco aqui como Resolvido, se nao, posto as duvidas =D.

Hebert_Coelho

rof20004:
Vlw, vou ler tudinho, se eu conseguir resolver coloco aqui como Resolvido, se nao, posto as duvidas =D.
Issae! =D

Acho que tu vai entender sim, lá tem o exemplo certinho do que você procura.

R

Olá Herbert, muito show seu material mano, li tudinho, e consegui fazer o que eu queria =D… sério show de bola seus artigos.

Agora falta só uma coisinha, que nao consegui entender mesmo.

Como faço pra quando eu salvar o objeto pai, seto os filhos todos pelo pai, mas nao seto os IDs dos filhos, pois quero que recebam o ID do pai. e tambem nao quero setar manualmente, quero que seja automatico. Ta dando erro:

org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property

Minhas classes ficaram assim:

PessoaTO.java (Classe PAI)

import java.io.Serializable;

import javax.persistence.CascadeType;
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.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "pessoa")
@Inheritance(strategy = InheritanceType.JOINED)
public class PessoaTO implements Serializable {

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

	@Id
	@SequenceGenerator(name = "PESSOA_GENERATION", sequenceName = "pessoa_id_seq", allocationSize = 1)
	@GeneratedValue(generator = "PESSOA_GENERATION", strategy = GenerationType.SEQUENCE)
	@Column(name = "id", nullable = false)
	private Integer idPessoa;

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

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

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

	@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "pessoa")
	private EnderecoTO endereco;

	@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "pessoa")
	private LoginTO login;

	public Integer getIdPessoa() {
		return idPessoa;
	}

	public void setIdPessoa(Integer idPessoa) {
		this.idPessoa = idPessoa;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public EnderecoTO getEndereco() {
		return endereco;
	}

	public void setEndereco(EnderecoTO endereco) {
		this.endereco = endereco;
	}

	public LoginTO getLogin() {
		return login;
	}

	public void setLogin(LoginTO login) {
		this.login = login;
	}

}

EnderecoTO.java (Classe FILHA)

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.MapsId;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "endereco")
@Inheritance(strategy = InheritanceType.JOINED)
public class EnderecoTO implements Serializable {

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

	@Id
	private Integer idEndereco;

	@MapsId
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id")
	private PessoaTO pessoa;

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

	public Integer getIdEndereco() {
		return idEndereco;
	}

	public void setIdEndereco(Integer idEndereco) {
		this.idEndereco = idEndereco;
	}

	public PessoaTO getPessoa() {
		return pessoa;
	}

	public void setPessoa(PessoaTO pessoa) {
		this.pessoa = pessoa;
	}

	public String getLogradouro() {
		return logradouro;
	}

	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}

}

LoginTO.java (Classe FILHA)

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.MapsId;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "login")
@Inheritance(strategy = InheritanceType.JOINED)
public class LoginTO implements Serializable {

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

	@Id
	private Integer idLogin;

	@MapsId
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id")
	private PessoaTO pessoa;

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

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

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

	public Integer getIdLogin() {
		return idLogin;
	}

	public void setIdLogin(Integer idLogin) {
		this.idLogin = idLogin;
	}

	public PessoaTO getPessoa() {
		return pessoa;
	}

	public void setPessoa(PessoaTO pessoa) {
		this.pessoa = pessoa;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public Integer getStatus() {
		return status;
	}

	public void setStatus(Integer status) {
		this.status = status;
	}

}

Quero salvar da seguinte forma:

pessoa = new PessoaTO();
pessoa.setNome(tfNome.getText().trim());
pessoa.setCpf("[telefone removido]");
pessoa.setTelefone(tfTelefone.getText().trim());
pessoa.setEndereco(new EnderecoTO());
pessoa.getEndereco().setLogradouro(tfEndereco.getText().trim());
pessoa.setLogin(login);
pessoaDAO = new PessoaDAO();
pessoaDAO.save(pessoa);

Estou setando o objeto login e endereco, pelo objeto PAI, e estou persistindo o objeto pai.

Estou desconfiando que ele nao esta setando os primary keys dos filhos, por isso esse erro. Mas so que criei a tabela e esta exatamente como eu queria, os primary keys dos filhos sao a chave estrangeira da pessoa. Da uma luz por favor ^^

R

Hi herbert ‘-’

R

Resolvi da seguinte forma.

Na hora de setar as informacoes do endereco, eu faco:

pessoa.getEndereco().setPessoa(pessoa);

Isso salva a referencia do objeto pessoa no objeto endereco, que por sua vez se encarrega de identifica a primary key de pessoa e setar na classe endereco.

Vlw Herbert xD

Criado 25 de novembro de 2012
Ultima resposta 27 de nov. de 2012
Respostas 6
Participantes 2