dÚvida mapeamento de chave primaria estrangeira

então galera, tô fervendo a cabeça aqui pra tentar resolver o meu problema, já li forum estrangeiro,brasileiro e tal, mas não encontro a resposta. O meu problema, na verdade é simples. Eu tenho uma tabela Pessoa, cuja chave primaria é o “rg”, e tenho uma tabela Advogado que tem como chave primaria um “rg_advogado”, que é u objeto do tipo Pessoa. Os beans tão assim:

@Entity
@Table(name=“Advogado”)
public class Advogado implements Serializable
{

private Pessoa rg_advogado;

@Column(name=“OAB_numero_advogado”,nullable=false,updatable=true)
private Integer oab_numero_advogado;

/* gets e sets */

Bean Pessoa:
@Embeddable
@Table(name=“Pessoa”)
public class Pessoa implements Serializable{

@Id
private Integer rg;

Minha dúvida( :?: ) é, como eu mapeio essa chave primária, no caso “rg_advogado”?
Me ajudem, por favor!!! :cry:

Se eu entendi o que você está fazendo, então seria um relacionamento one-to-one … mapeie com:

@OneToOne @JoinColumn(name="campo_da_tabela")

Cara, pra começar sua classe Advogado tem que herdar de Pessoa (class Advogado extends Pessoa)!
Na classe Pessoa você tem que informar o tipo de herança que será mapeada para o banco: JOINED, SINGLE_TABLE ou TABLE_PER_CLASS. Isso deve ser feito através da anotação @Inheritance:

@Entity
@Table(name="person")
@Inheritance(strategy=InheritanceType.JOINED)
public class Person implements Serializable{
      //implementação
}

Aconselho você a dar uma lida em mapeamento de herança no Hibernate!
Abraços.

[quote=marcelo.bellissimo]Se eu entendi o que você está fazendo, então seria um relacionamento one-to-one … mapeie com:

@OneToOne @JoinColumn(name="campo_da_tabela") [/quote]

Já tentei… =/
Mas, dá o seguinte erro: “Não há ID definido para esta hierarquia da entidade”.
:x

[quote=joncarv]Cara, pra começar sua classe Advogado tem que herdar de Pessoa (class Advogado extends Pessoa)!
Na classe Pessoa você tem que informar o tipo de herança que será mapeada para o banco: JOINED, SINGLE_TABLE ou TABLE_PER_CLASS. Isso deve ser feito através da anotação @Inheritance:

@Entity
@Table(name="person")
@Inheritance(strategy=InheritanceType.JOINED)
public class Person implements Serializable{
      //implementação
}

Aconselho você a dar uma lida em mapeamento de herança no Hibernate!
Abraços.[/quote]

Foi o que eu pensei em fazer, mas como eu sou um mero estagiário e meu chefe não tá aqui e não quis mudar… mas, que se foda, vou fazer isso. =D
E ah, dps que eu fizer isso daí o que eu faço dps? Só isso resolve?

Bom, depende do que você estiver querendo fazer. Qual o tipo de relação entre Pessoa e Advogado?
Minha resposta foi considerando que você esteja querendo fazer um mapeamento de herança! Foi a relação mais óbvia que consegui identificar entre Pessoa e Advogado, afinal um Advogado é uma Pessoa! :slight_smile:

[quote=joncarv]Bom, depende do que você estiver querendo fazer. Qual o tipo de relação entre Pessoa e Advogado?
Minha resposta foi considerando que você esteja querendo fazer um mapeamento de herança! Foi a relação mais óbvia que consegui identificar entre Pessoa e Advogado, afinal um Advogado é uma Pessoa! :)[/quote]

heahiueahe
Sim, advogado é pessoa, mas mais parece o cão! :twisted: heiuahuehaea
Cara, eu quero mapear isso numa relação de um pra um. Tipo, 'uma pessoa só pode ser um advogado, e um advogado só pode ser uma pessoa". hehehe

[quote=hedlabel]Já tentei… =/
Mas, dá o seguinte erro: "Não há ID definido para esta hierarquia da entidade".
:x[/quote]
Veja:

@Id // <- colocou o annotation de ID aqui? @OneToOne @JoinColumn(name="campo_da_tabela")

[quote=marcelo.bellissimo][quote=hedlabel]Já tentei… =/
Mas, dá o seguinte erro: "Não há ID definido para esta hierarquia da entidade".
:x[/quote]
Veja:

@Id // <- colocou o annotation de ID aqui? @OneToOne @JoinColumn(name="campo_da_tabela") [/quote]

Já… =/

Cara, esse tipo de relação não é um pra um, é herança!
O quanto você sabe de orientação a objetos? Antes de trabalhar com Hibernate dá uma lida sobre OO.

Abraços!

Não “é” uma herança, “pode ser” uma herança, mas ele não quer assim… e aliás eu recomendo fazer sem herança… muito bonito usar herança, Advogado é uma Pessoa, mas é melhor ele fazer funcionar primeiro no modelo 0ne-to-one… depois ele tenta herança que é mais chato pra configurar…

Quanto ao @Id, caramba… você colocou e ainda assim está dando o mesmo erro? Ué… manda as classe inteiras ai pra gente dar uma olhada… ah, não se esqueça, coloque entre as tags “code” pra gente poder ler mais fácil…

Marcelo,

eu estou respondendo de acordo com a própria afirmação que ele fez acima! O que ele quer mapear é “um advogado só pode SER uma pessoa…” e isso pra mim só pode ser herança!
Caso contrário, também pode existir uma relação entre Advogado e Pessoa no sentido de um Advogado poder atender VÁRIAS Pessoas. Nesse caso seria OneToMany/ManyToOne.
Ele pode fazer primeiro com OneToOne, mas de que adianta se o modelo dele vai ficar “errado”?

Não está errado, é que você está se limitando ao conceito OO da coisa… ele quer um cadastro de Pessoa, e um cadastro de Advogado que tem os mesmos dados de uma Pessoa, mais alguns… pensando em OO, está certíssimo dizer que Advogado extends Pessoa, mas ele está querendo outra coisa… aliás, veja bem o que ele escreveu:

Então pra que duas classes? Pelo que eu entendi, ele quer uma classe Advogado que referencie a classe Pessoa… é normal esse tipo de abordagem, apesar de que seria muito mais “elegante” fazer a herança mesmo… mas eu também nunca tive bons momentos mapeando heranças no Hibernate…

Opa… eu não estou me limitando ao conceito “OO da coisa”! O Hibernate foi criado para pensarmos no modo “OO da coisa”!!!

Pra mim isso é HERANÇA!!!
Depende do modelo que ele tem em mãos! Eu consegui entender como herança exatamente pela citação que você fez do que ele disse:

Relações do tipo “é um” são herança!
hedlabel, descreve o seu modelo que fica mais fácil te ajudar! :wink:

Mas não te obriga á fazer isso…

Pra mim isso é HERANÇA!!![/quote]
Sim, é herança… existe herança no banco de dados ? Só existe no conceito OO… por isso que eu falei que ele pode fazer no conceito one-to-one, que é justamente o que existe fisicamente no banco de dados…

[quote=joncarv]Depende do modelo que ele tem em mãos! Eu consegui entender como herança exatamente pela citação que você fez do que ele disse:

Leia novamente… uma pessoa só pode ser um advogado… e um advogado só pode ser uma pessoa… do jeito que ele falou, só existe uma classe, Pessoa (ou Advogado, escolha uma, pois uma é a outra, e a outra é uma… entendeu ?)

Calma ai galerinha!
=)
Deixa eu explicar, eu sempre pensei em usar herança, entretanto, como eu já peguei o “bonde” andando não queria modificar, e tentei mapear desse jeito que eu disse, entretanto, mostrando esse tópico ao meu chefe, ele viu que realmente é melhor usar herança! Ou seja, não adiantou eu e o outro estagiário dizermos isso 200x pra ele, o cara só acreditou dps que eu mostrei o tópico! Sinceramente, é numa hora dessas que dá vontade mandar tomar no cu um cara desses! Vou usar herança(amén!!!)mesmo, que era o que a gente sempre quis usar. \o/ Valeu MESMO pela a ajuda galera!!!

PS: PHP tem OO? Pq esse meu chefe(que sabe menos que um estagiário >/ ) programa em PHP, tá em Java só por experiência.

PS: Eu já uso Hibernate há algum tempo e sabia que dava pra fazer essa “gambiarra” que eu tentei fazer, só não sabia como.

[quote=hedlabel]Calma ai galerinha!
=)
Deixa eu explicar, eu sempre pensei em usar herança, entretanto, como eu já peguei o “bonde” andando não queria modificar, e tentei mapear desse jeito que eu disse, entretanto, mostrando esse tópico ao meu chefe, ele viu que realmente é melhor usar herança! Ou seja, não adiantou eu e o outro estagiário dizermos isso 200x pra ele, o cara só acreditou dps que eu mostrei o tópico! Sinceramente, é numa hora dessas que dá vontade mandar tomar no cu um cara desses! Vou usar herança(amén!!!)mesmo, que era o que a gente sempre quis usar. \o/ Valeu MESMO pela a ajuda galera!!!

PS: PHP tem OO? Pq esse meu chefe(que sabe menos que um estagiário >/ ) programa em PHP, tá em Java só por experiência.[/quote]

Hahaha, é… acontece… a pior coisa que tem é um superior querendo meter o bedelho em coisa que não conhece… então, PHP que eu saiba tem OO… pacotes, heranças, polimorfismo… mas o PHP é mais flexivel, a tipagem dele é fraca, dá pra criar uma varíavel “whatever”, quer dizer, sem tipagem, que eu saiba… então pra quem mexe nisso e vai pro Java acaba tomando um tapa na cara de uma OO forte que nem o Java, rsrsrs…

hedlabel,

por favor, descreva seu modelo pra que eu possa te ajudar melhor, ok? :slight_smile:

Ah, ok, ok!!!
Era herança?! Pois é… desconfiei pelo que você estava descrevendo! :slight_smile:
Não fica tentando usar gambiarra não, cara! Não tem necessidade. O Hibernate é um framework bem poderoso… Dá pra usar OO puro e ser feliz!
Qualquer ajuda que precisar, posta ai!
Abraços!

Valeu pela ajuda ai galera!
Mas, agora tem outro problema, eu fiz a herança:

[code]
@Entity
@Table(name=“Advogado”, schema=“SISBIOID”)
@Inheritance(strategy=InheritanceType.JOINED)
public class Advogado extends Pessoa implements Serializable
{

@PrimaryKeyJoinColumn(name="Pessoa")
public Integer getId()
{
    return (this.getId());
}


}[/code]

Ele diz que não há id para essa classe! Oo" Não entendi, o pq de não ter o Id.