fantomas:
Oi renatocustodio,
Você está fazendo exatamente como pede o tutorial ou algum livro sobre o assunto? Porque isso que vc descreveu é considerado uma das associações (um para um) entre entidades mais simples de mapear.
O que acontece quando vc executa? É apresentado algum erro?
Talvez se vc postar o modelo das duas tabelas e as suas classes correspondentes a estas tabelas anime o pessoal a te ajudar.
[]'s
Então cara, no meu banco de dados está assim:

A minha classe Pessoa:
package pojo;
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.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import annotations.Rotulo;
@Entity
@Rotulo(valor="Pessoa")
public class Pessoa implements Serializable{
private static final long serialVersionUID = -5441754907875556638L;
@Id
@Column(name="PES_CODIGO")
@SequenceGenerator(allocationSize=1, name = "SEQ", sequenceName="SEQ_PESSOA")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ")
@Rotulo(valor="Código")
private int id;
@Column(name="PES_RAZAOSOCIAL")
@Rotulo(valor="Nome/Razão Social")
private String razaoSocial;
@Rotulo(valor="Tipo de Pessoa")
@JoinColumn(name="TIPPES_CODIGO")
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private TipoPessoa tipoPessoa;
@Column(name="PES_EMAIL")
@Rotulo(valor="Email")
private String email;
@Column(name="PES_NOMEFANTASIA", nullable=true)
@Rotulo(valor="Nome Fantasia")
private String nomeFantasia;
@Column(name="PES_CNPJ", length=14, nullable=true)
@Rotulo(valor="CPF/CNPJ")
private String CNPJ;
public Pessoa() {
tipoPessoa = new TipoPessoa();
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Pessoa other = (Pessoa) obj;
if (this.id != other.id) {
return false;
}
return true;
}
@Override
public int hashCode() {
return getId();
}
@Override
public String toString() {
return this.getRazaoSocial();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public TipoPessoa getTipoPessoa() {
return tipoPessoa;
}
public void setTipoPessoa(TipoPessoa tipoPessoa) {
this.tipoPessoa = tipoPessoa;
}
public String getCNPJ() {
return CNPJ;
}
public void setCNPJ(String cnpj) {
CNPJ = cnpj;
}
public String getRazaoSocial() {
return razaoSocial;
}
public void setRazaoSocial(String razaoSocial) {
this.razaoSocial = razaoSocial;
}
public String getNomeFantasia() {
return nomeFantasia;
}
public void setNomeFantasia(String nomeFantasia) {
this.nomeFantasia = nomeFantasia;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Minha classe PessoaUsuario:
package pojo;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import annotations.Rotulo;
@Entity
@Rotulo(valor="Usuário")
public class PessoaUsuario implements Serializable {
private static final long serialVersionUID = 1060983168252431713L;
@Id
@JoinColumn(name="PES_CODIGO")
@OneToOne(cascade=CascadeType.ALL)
private Pessoa pessoa;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="GRUUSO_CODIGO")
@Rotulo(valor="Grupo de Usuário")
private GrupoUsuario grupoUsuario;
@Column(name="PESUSU_LOGIN", length=10, nullable=false)
@Rotulo(valor="Login")
private String login;
@Column(name="PESUSU_SENHA", length=8, nullable=false)
@Rotulo(valor="Senha")
private String senha;
public PessoaUsuario() {
super();
}
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa 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 GrupoUsuario getGrupoUsuario() {
return grupoUsuario;
}
public void setGrupoUsuario(GrupoUsuario grupoUsuario) {
this.grupoUsuario = grupoUsuario;
}
@Override
public String toString() {
return this.login;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((pessoa == null) ? 0 : pessoa.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PessoaUsuario other = (PessoaUsuario) obj;
if (pessoa == null) {
if (other.pessoa != null)
return false;
} else if (!pessoa.equals(other.pessoa))
return false;
return true;
}
}
Quando rodo a aplicação o JPA não gera a tabela pra mim e não um erro de jdbc de tabela não encontrada. Se eu crio ela na mão, ele cria os outros campo na tabela para mim, mas na Pessoa ele cria um campo BLOB que nem é chave primária.
Fazendo da forma que o felipeguerra sugeriu consegui resolver parcialmente o problema. Mas ta acontecendo dele executar dois inserts quando mando salvar uma PessoaUsuario, um para a classe PessoaUsuari e outro para a classe Pessoa, ambos com os mesmos dados. Nesse caso a Pessoa já estava previamente cadastrada e os dados são duplicados em um novo registro. Por isso eu gostaria de usar composição e não herança nesse caso específico.
Alguém sabe se existe uma forma de realizar isso por composição, sem a necessidade de realizar a herança.