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 ^^