Add Primary Key

tenho uma table clientes que herda tdu de uma tabela pessoa

como faço na tabela clientes add uma primary key de um campo herdado de outra tabela, eu tentei usar o metodo convencional e não deu certo, agora os campos que são da propria tabela da certo.

Ola

Se seu banco for relacional eu nego, pois não existe herança em BD.

hahaha :lol:

Brincadeiras a parte segue algumas estratégias(que peguei em um tutorial) para simular uma herança com hibernate.

[size=18]Estratégias:[/size]

Tabela única por hierarquia de classe
-Todas as classes na hierarquia são mapeadas para uma tabela única
-Um valor em um campo identifica a subclasse específica

create table PESSOA_HIERARQUIA ( id integer primary key not null, nome varchar(255), rua varchar(255), cidade varchar(255), estado varchar(255), cep varchar(255), funcionarioId integer, DISCRIMINADOR varchar(31) not null );

A coluna DISCRIMINADOR identifica o tipo da entidade sendo armazenada

@Entity @Table(name="PESSOA_HIERARQUIA") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="DISCRIMINATOR", discriminatorType=DiscriminatorType.STRING) @DiscriminatorValue("PESSOA") public class Pessoa { private int id; private String nome; @Id @GeneratedValue public int getId( ) { return id; } public void setId(int id) { this.id = id; } public String getNome( ) { return nome; } public void setNome(String nome) { this.nome = nome;} }

Cada classe na hierarquia é mapeada para uma tabela separada
Todas as propriedades das classes são mapeadas para colunas desta tabela incluindo as propriedades herdadas

A anotação @javax.persistence.Inheritance é usada para definir a estratégia de persistência para o relacionamento de herança
O atributo strategy define o mapeamento da herança a ser usado.

é usado neste caso pois estamos usando a estratégia de uma simples tabela por hierarquia

Desde que uma única tabela representa a hierarquia toda, o provedor da persistência precisa de uma maneira de identificar qual classe uma linha da tabela representa
Isto é determinado pela coluna DISCRIMINADOR
A anotação @javax.persistence.DiscriminatorColumn identifica qual coluna da tabela armazena o valor discriminador
O atributo (name=… identifica o nome da coluna
O atributo (discriminatorType=… identifica o tipo da coluna do discriminador STRING, CHAR, or INTEGER

 @Entity @DiscriminatorValue ("CUST")
  public class Cliente extends Pessoa {
  private String rua;
  private String cidade;
  private String estado;
  private String cep;
  ...
 }
 @Entity public class Employee extends Customer {
 private int funcionarioId;
 ...
 }

Tabela por classe concreta

create table Pessoa (
id integer primary key not null,
nome varchar(255));
create table Cliente (
id integer primary key not null,
nome varchar(255),
rua varchar(255),
cidade varchar(255),
estado varchar(255),
cep varchar(255));

create table Funcionario (
id integer primary key not null,
nome varchar(255),
rua varchar(255),
cidade varchar(255),
estado varchar(255),
cep varchar(255),
funcionarioId integer, );

A principal diferença entre esta estratégia e a estratégia SINGLE_TABLE é que não é necessário uma coluna discriminadora
Cada tabela contém cada propriedade persistente da hierarquia

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Person { ... }
@Entity public class Customer extends Person { ... }
@Entity public class Employee extends Customer { ... }

Perceba que somente a classe base da hierarquia precisa da anotação @Inheritance
As outras classes não precisam desta anotação

Tabela por subclasse
A raiz da hierarquia é representada por uma tabela
Cada subclasse é representada por uma tabela separada que contém campos específicos para a subclasse e também as colunas que representam as suas chaves pimárias

Nesta estratégia cada subclasse possui sua própria tabela
Esta tabela contém somente as propriedades definidas na classe em particular
Em outras palavras, esta estratégia é similar ao tabela por classe concreta, exceto pelo fato do esquema ser normalizado.
Esta estratégia também é conhecida por JOINED

create table Pesoa (
id integer primary key not null,
nome varchar(255) );
create table Cliente (
id integer primary key not null,
rua varchar(255),
cidade varchar(255),
estado varchar(255),
cep varchar(255));
create table Funcionario(
id integer primary key not null,
employeeId integer );

Quando o gerenciador de persistência carrega uma entidade que é subclasse dentro de uma hierarquia, é feito uma operação SQL join em todas as tabelas da hierarquia
Neste mapeamento, deve existir uma coluna em cada tabela que pode ser usada para relacionar cada tabela
No exemplo,as tabelas FUNCIONARIO, CLIENTE, e PESSOA compartilham o mesmo valor de chave primária

@Entity @Inheritance(strategy=InheritanceType.JOINED) public class Person { ... } @Entity public class Customer extends Person { ... } @Entity @PrimaryKeyJoinColumn (name="EMP_PK") public class Employee extends Customer { ... }

mais não da para add primary key no campo que foi feito inherits?