<class name="Pessoa" table="pessoa">
<id name="id" column="id">
<generator class="identity"/>
</id>
<property name="nome" column="nome" type="string" />
<property name="matricula" column="matricula" type="string" />
<property name="dataNascimento" column="data_nascimento" type="date" />
<joined-subclass name="Professor" table="professor">
<key column="id" />
<property name="especializacao" column="especializacao" type="string" />
<property name="salario" column="salario" type="big_decimal" lazy="true" />
<set name="turma" inverse="true" order-by="id asc">
<key column="id_professor"/>
<one-to-many class="Turma"/>
</set>
<set name="habilitacao" table="disciplina_professor" lazy="true">
<key column="id_professor"/>
<many-to-many class="Disciplina" column="id_disciplina"/>
</set>
</joined-subclass>
<joined-subclass name="Aluno" table="aluno">
<key column="id" />
<property name="anoIngresso" column="ano_ingresso" type="integer" />
<property name="curso" column="curso" type="string" />
<set name="inscricao" table="aluno_turma" lazy="true">
<key column="id_aluno"/>
<many-to-many class="Turma" column="id_turma"/>
</set>
</joined-subclass>
</class>
Pessoa é uma classe abstract. Aluno e Professor sao sub-class de Pessoa.
Nao to conseguindo fazr com @Annotations
Como faco para fzr esse exemplo com anotacoes?
Opa,
Ai vai um exempo:
/*
* Pessoa.java
*
* Created on 19 de Novembro de 2006, 17:28
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package br.unipar.jclinica.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
/**
*
* @author Paulo Henrique Peres <paulo.peres@pop.com.br>
*/
@MappedSuperclass
public abstract class Pessoa implements Serializable {
@Column(name="NOME", nullable=false, length=100)
private String nome;
@Column(name="EMAIL", nullable=false, length=50)
private String email;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Classe Usuário que herda de Pessoa
/*
* Usuario.java
*
* Created on 19 de Novembro de 2006, 17:34
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package br.unipar.jclinica.model;
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.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
/**
*
* @author Paulo Henrique Peres <paulo.peres@pop.com.br>
*/
@Entity
@Table(name="USUARIO")
@SequenceGenerator(name="SG_USUARIO", sequenceName="SG_USUARIO")
public class Usuario extends Pessoa {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
@Column(name="CODIGO_FK")
private int codigo;
@Column(name="TIPO_USUARIO", nullable=false, length=20)
private String tipoUsuario;
@Column(name="NOME_USUARIO", nullable=false, length=20)
private String nomeUsuario;
@Column(name="SENHA", nullable=false, length=20)
private String senha;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getTipoUsuario() {
return tipoUsuario;
}
public void setTipoUsuario(String tipoUsuario) {
this.tipoUsuario = tipoUsuario;
}
public String getNomeUsuario() {
return nomeUsuario;
}
public void setNomeUsuario(String nomeUsuario) {
this.nomeUsuario = nomeUsuario;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
}
Desta forma, vai ser criado uma tabela só com todos os campos para o Usuário, existe mais formas, como por exempo, criar uma tabela pessoa e uma usuário, é bem simples, na documentação tem bastante coisa.
Valeu,
Paulo
Valeu paulo, era isso mesmo…
Ainda nao testei…
Mas posso ver uma coisa, por exemplo o id neste caso eh salvo na tabela cliente?
tah com cara de postgresql esse banco.
Correta essa informacao?
rs
Alexandre,
Serve para o PostgreSQL, mas to usando este código com o Firebird.
Quando a tua duvida em relação ao código, é o seguinte, no meu projeto é desse jeito, porém, já fiz uma vez da seguinte forma:
Classe Pessoa (== Tabela no Banco de Dados)
Classe Cliente (== Tabela no Banco de Dados se relacionando com Pessoa)
Classe Funcionario(== tabela no banco de dados se relacionando com o Pessoa)
Desta forma o que muda é a estratégia, veja, no lugar de:
@MappedSuperClass
vc coloca desta forma na classe abstrata
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
Qualquer dúvida, veja aqui:
http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html#d0e749
Qualquer dúvida é so falar.
Valeu,
Paulo
Obrigado Paulo, ajudou bastante!
Paulo, vc pode me passar os fontes do seu projeto.
So para eu continuar com meus estudos e aprender mais com os fontes reais de programacao no dia a dia?