Pessoal,
estou estudando JPA com o Hibernate e estou tentando implementar o mapeamento de herança descrito abaixo:
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name="pessoa")
public class Pessoa {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
private int id;
@Column(length=45)
private String nome;
public Pessoa() {
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
@Entity
@Table(name="pessoa_juridica")
public class PessoaJuridica extends Pessoa {
@Column(precision=10, scale=2)
private BigDecimal renda;
public PessoaJuridica() {
}
public BigDecimal getRenda() {
return this.renda;
}
public void setRenda(BigDecimal renda) {
this.renda = renda;
}
}
Porém,
o eclipse está emitindo a seguinte mensagem sobre a annotation @Entity da classe Pesso:
- Discriminator column “DTYPE” cannot be resolved on table
"{1}"
- Discriminator column “DTYPE” cannot be resolved on table
"pessoa"
alguém tem idéia de que erro é esse?
DTYPE é uma coluna que vai ser gerada na tabela que representa a entidade pai. Na verdade, todos os registros, tanto de Pessoa quanto de PessoaJuridica, serão gerados na tabela Pessoa e a coluna DTYPE é que norteia a sua implementação JPA de modo a resolver que tipo de objeto uma determinada tupla da tabela Pessoa é, ou seja, uma Pessoa ou uma PessoaJuridica.
Acho que para sua situação seria mais interessante usar uma MappedSuperClass, pq acho que você não vai instanciar uma pessoa diretamente não é?
Dê uma lida aqui para aprender sobre mapeamento em herança: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168
[]´s
Davi,
quando eu li sobre herança em JPA eu vi que existem 3 estratégias para mapear a herança.
Estratégia Table per Class
Estratégia Single Table
Estratégia Joined Subclass
eu entendi que na estratégia Joined não é necessário criar um atributo de identificação do tipo do Registro, pois, as subclasses seriam armazenadas em tabelas separadas, onde as chaves primárias das tabelas de subclasses seriam também a chave estrangeira da tabela pai.
ou seja,
Pessoa PessoaJuridica
id(PK) ---------------- idPessoaJuridica(PK)(FK)
join
Pessoa.id = PessoaJuridica.idPessoaJuridica.
meu entendimento está errado?
OBS: Inclusive eu já criei essas tabelas no banco com os relacionamentos de acordo com o que eu entendi.
Obrigado pelo retorno cara.
É verdade. Falha a minha. DTYPE é usado na Single table per class hierarchy (InheritanceType.SINGLE_TABLE).
Não sei pq está dando esse erro…
Eu normalmente prefiro gerar a base de dados a partir das classes, ao invés de fazer o contrário.
Se você modelar corretamente suas classes a estrutura do seu banco ficará correta.
[]´s
vou tentar fazer a mesma coisa davi.
se der tudo certo eu mando o resultado.
Obrigado mais uma vez
Davi,
fiz o teste hj e tudo funcionou.
Não sei explicar o que aconteceu tb.
vlw mais uma vez cara.