Hibernate - problemas com herança

6 respostas
G

Olá pessoal tenho o seguinte codigo:

public Usuario(){

private int id;
private String name;
private String cpf;

//getters n setters

}


public Medico extends Usuario{

private String crm;
private String especialidade;

//getters n setters

}


public Paciente extends Usuario{

private String patologia;

//getters n setters
}

tenho algumas questões em cima disso. Bem, ainda estou cursando a faculdade de CC, e ainda n terminei o curso de banco de dados, mas ate onde aprendi é possível fazer uma generalização de tabelas, exemplo:

tabela Usuario, Paciente e Medico, separadas, OK, só n entendi como fazer isso na prática, como eu faria a ligação das tabelas, ja que deveriam ter a mesma PK. Dado este problema eu resolvi fazer um tabelão com um campo tipo de usuario, onde vou diferenciar qual o tipo de usuario e com determinados atributos null.

a pergunta, como fazer para o hibernate persistir no banco essas classes, levando em consideracao que tenho uma classe Usuario, uma Pessoa e uma Medico que herdam de Usuario. E se possivel, alguem poderia me explicar o procedimento tanto no banco quanto no hibernate para fazer a persistencia da primeira forma que eu tentei, pois sei que é o mais indicado.

6 Respostas

W

Fikaria assim…

@Entity
@Table(name = "TB_USUARIO")
@Inheritance(strategy = InheritanceType.JOINED)
public Usuario(){

@Id
@Column(name = "ID")
private int id;

@Column(name = "NAME")
private String name;

@Column(name = "CPF")
private String cpf;

//getters n setters
}

@Entity
@Table(name = "TB_MEDICO")
public Medico extends Usuario{

@Column(name = "CRM")
private String crm;

@Column(name = "ESPECIALIDADE")
private String especialidade;

//getters n setters
}

@Entity
@Table(name = "TB_PACIENTE")
public Paciente extends Usuario{

@Column(name = "PATOLOGIA")
private String patologia;

//getters n setters
}

Espero ter ajudado…

Qualquer duvida… poste aí…

[]s

G

Ai que ta, vc fez essas anotacoes vizando a minha primeira tentativa, com tabelas para as especializacoes, e eu expliquei que n sei como faz isso no banco, ou seja, n sei como cirar tabelas com generalizacao e dai fiz um tabelao, portato gostaria que vc postasse como seria no banco para utilizar esta solucao das classes que vc postou, ou entao a minha duvida principal, como fazer as anotacoes para um tabelao (que é o que tenho hj).

W

Não sei se entendi… mas esse tabelao seria algo assim:

TB_USUARIO
+ID
+NAME
+CPF
+CRM
+ESPECIALIDADE
+PATOLOGIA

Seria isso??? Uma tabela com todos campos???

Da forma que foi meu exemplo fikaria assim:

TB_USUARIO
+ID
+NAME
+CPF

TB_MEDICO
+CRM
+ESPECIALIDADE

TB_PACIENTE
+PATOLOGIA

Acho que essa seria a solução ideal… já pensando em OO.

Essa é sua duvida???

G

sim o tabelao é esse mesmo, e isso é um modo que eu encontrei pra fazer, pq eu n sei como fazer desse outro jeito q vc pos, pq n sei como ligar as tabelas especializadas com a tabela geral. Se vc souber como faço isso sera de grande ajuda.

W

O JOIN entre as tabelas o HIBERNATE realiza pra vc…

Por exemplo… quando for preciso listar todos os Médicos…

fará assim:

final DetachedCriteria criteria = DetachedCriteria.forClass(Medico.class);
final List<Medico> listaComTodosMedicos = hibernateOperations.findByCriteria(criteria);

De preferencia torne a classe Usuário abstrata. Para que nunca seja criada diretamente uma instancia de Usuario e sim de Medico e Paciente.

G

mas pra fazer join as tabelas tem q estar ligadas de alguma forma no nivel do banco, tipo com fks e pks, esse e o lance, n sei fazer isso com esse modelo de generalizacao e epecializacao na base.

Criado 14 de fevereiro de 2011
Ultima resposta 14 de fev. de 2011
Respostas 6
Participantes 2