[RESOLVIDO] Herança no hibernate

5 respostas
psycozy

bom dia galera!

sou iniciante no mundo hibernate e por isso estou com um ‘probleminha’:

apanhei bastante até conseguir gerar meu banco (PostgreSQL) através dos models e do hibernate, mas consegui =)

mas houve um grande problema, eu tenho uma classe ‘PessoaFisica’ e outras classes que são extends dela, são estas ‘Aluno’ e 'Funcionario’
o que aconteceu foi que as tabelas extends foram geradas com TODOS os atributos de ‘PessoaFisica’ e nao só com ‘pessoa_fisica_id’, por exemplo.

imagino que o erro - pelo que entendi na documentação - seja o fato de eu ter usado @MappedSuperclass em ‘PessoaFisica’, porem, sem este dava o seguinte erro ao executar o main com o método de criação do banco: "org.hibernate.AnnotationException: Unable to define/override @Id(s) on a subclass: pacotes.Aluno

gostaria de saber como faço para corrigir isso.

caso necessário, é só pedir que posto os fontes

agradeço desde já!

:: Rafael Bazanella ::

5 Respostas

Igor_Gabriel

Fala psycozy,

o id mapeado está na superclasse ou nas filhas?

coloca o código pra gente dar uma olhadinha.

Abraço.

psycozy

atendendo ao pedido do Igor, segue os codigos:

Class PessoaFisica

@MappedSuperclass
@Entity
@Table(name = "pessoa_fisica")
@Inheritance(strategy=InheritanceType.JOINED)
public class PessoaFisica {

    /**
     * Pessoa Fisica ID
     */
    @Id
    @SequenceGenerator(name = "generator", sequenceName = "pessoa_fisica_id_seq", initialValue = 1, allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generator")
    @Column(name = "pessoa_fisica_id", length = 10,
            nullable = false, updatable = false)
	private int pessoaFisicaId;

    /**
     * Nome
     */
    @Column(name = "nome", length = 180, nullable = true)
	private String nome;

    /**
     * RG
     */
    @Column(name = "rg", length = 40, nullable = true)
	private String rg;

    /**
     * CPF
     */
    @Column(name = "cpf", length = 14, nullable = true)
	private String cpf;

    /**
     * Endereço
     */
    @Column(name = "endereco", length = 80, nullable = true)
	private String endereco;

    /**
     * Bairro
     */
    @Column(name = "bairro", length = 40, nullable = true)
	private String bairro;

    /**
     * Cidade
     */
    @Column(name = "cidade", length = 80, nullable = true)
	private String cidade;

    /**
     * Estado
     */
    @Column(name = "estado", length = 2, nullable = true)
	private String estado;

    /**
     * Cep
     */
    @Column(name = "cep", length = 8, nullable = true)
	private int cep;

    /**
     * Fone Residencial
     */
    @Column(name = "fone_res", length = 14, nullable = true)
	private String foneResidencial;

    /**
     * Data Nascimento
     */
    @Column(name = "data_nasc", nullable = true)
	private Date dataNascimento;

    /**
     * Fone Celular
     */
    @Column(name = "fone_cel", length = 14, nullable = true)
	private String foneCelular;

    /**
     * Fax
     */
    @Column(name = "fax", length = 14, nullable = true)
	private String fax;

    /**
     * Sexo
     */
    @Column(name = "sexo", length = 14, nullable = true)
	private String sexo;

    /**
     * Pai
     */
    @Column(name = "pai", length = 80, nullable = true)
	private String pai;

    /**
     * Mãe
     */
    @Column(name = "mae", length = 80, nullable = true)
	private String mae;


	public int getPessoaFisicaId(){
		return pessoaFisicaId;
	}

	public void setPessoaFisicaId(int newVal){
		pessoaFisicaId = newVal;
	}

	public String getNome(){
		return nome;
	}

	public void setNome(String newVal){
		nome = newVal;
	}

	public String getRg(){
		return rg;
	}

	public void setRg(String newVal){
		rg = newVal;
	}

	public String getCpf(){
		return cpf;
	}

	public void setCpf(String newVal){
		cpf = newVal;
	}

	public String getEndereco(){
		return endereco;
	}

	public void setEndereco(String newVal){
		endereco = newVal;
	}

	public String getBairro(){
		return bairro;
	}

	public void setBairro(String newVal){
		bairro = newVal;
	}

	public String getCidade(){
		return cidade;
	}

	public void setCidade(String newVal){
		cidade = newVal;
	}

	public String getEstado(){
		return estado;
	}

	public void setEstado(String newVal){
		estado = newVal;
	}

	public int getCep(){
		return cep;
	}

	public void setCep(int newVal){
		cep = newVal;
	}

	public String getFoneResidencial(){
		return foneResidencial;
	}

	public void setFoneResidencial(String newVal){
		foneResidencial = newVal;
	}

	public Date getDataNascimento(){
		return dataNascimento;
	}

	public void setDataNascimento(Date newVal){
		dataNascimento = newVal;
	}

	public String getFoneCelular(){
		return foneCelular;
	}

	public void setFoneCelular(String newVal){
		foneCelular = newVal;
	}

	public String getFax(){
		return fax;
	}

	public void setFax(String newVal){
		fax = newVal;
	}

	public String getSexo(){
		return sexo;
	}

	public void setSexo(String newVal){
		sexo = newVal;
	}

	public String getPai(){
		return pai;
	}

	public void setPai(String newVal){
		pai = newVal;
	}

	public String getMae(){
		return mae;
	}

	public void setMae(String newVal){
		mae = newVal;
	}
}

Class Aluno

@Entity
@Table(name = "aluno")
public class Aluno extends PessoaFisica {

    /**
     * Aluno Id
     */
    @Id
    @SequenceGenerator(name = "generator", sequenceName = "aluno_id_seq", initialValue = 1, allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generator")
    @Column(name = "aluno_id", length = 10,
            nullable = false, updatable = false)
    private Integer AlunoId;

    /**
     * Materias
     */
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE},
        mappedBy="alunos",
        targetEntity = Materia.class)
	private List<Materia> materias;

    /**
     * Observações de Saúde
     */
    @Column(name = "observacaoSaude", length = 255, nullable = true)
	private String observacaoSaude;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="turma_id",
                    insertable=true, updatable=true)
    @Fetch(FetchMode.JOIN)
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Turma turmas;


	public List<Materia> getMaterias(){
		return materias;
	}

	public void setMaterias(List<Materia> newVal){
		materias = newVal;
	}

	public String getObservacaoSaude(){
		return observacaoSaude;
	}

	public void setObservacaoSaude(String newVal){
		observacaoSaude = newVal;
	}

    public Turma getTurmas() {
        return turmas;
    }

    public void setTurmas(Turma turmas) {
        this.turmas = turmas;
    }
}

Class Funcionario

@Entity
@Table(name = "funcionario")
public class Funcionario extends PessoaFisica {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="materia_id",
                    insertable=true, updatable=true)
    @Fetch(FetchMode.JOIN)
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Materia materias;

    /**
     * Funcionário Id
     */
    @Id
    @SequenceGenerator(name = "generator", sequenceName = "funcionario_id_seq", initialValue = 1, allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generator")
    @Column(name = "funcionario_id", length = 10,
            nullable = false, updatable = false)
	private int funcionarioId;

    /**
     * CTPS
     */
    @Column(name = "ctps", length = 20, nullable = true)
    private String ctps;

    /**
     * Tipo de Contratação
     */
    @Column(name = "tipo_contratacao", length = 10, nullable = true)
	private String tipoContratacao;

    /**
     * Status
     */
    @Column(name = "status", length = 10, nullable = true)
	private String status;

    /**
     * Data da Contratação
     */
    @Column(name = "data_contratacao", nullable = true)
	private Date dataContratacao;

    /**
     * Função
     */
    @Column(name = "funcao", length = 40, nullable = true)
	private String funcao;

    /**
     * É um Professor
     */
    @Column(name = "professor", nullable = true)
	private boolean isProfessor;


	public int getFuncionarioId(){
		return funcionarioId;
	}

	public void setFuncionarioId(int newVal){
		funcionarioId = newVal;
	}

	public String getCtps(){
		return ctps;
	}

	public void setCtps(String newVal){
		ctps = newVal;
	}

	public String getTipoContratacao(){
		return tipoContratacao;
	}

	public void setTipoContratacao(String newVal){
		tipoContratacao = newVal;
	}

	public String getStatus(){
		return status;
	}

	public void setStatus(String newVal){
		status = newVal;
	}

	public Date getDataContratacao(){
		return dataContratacao;
	}

	public void setDataContratacao(Date newVal){
		dataContratacao = newVal;
	}

	public String getFuncao(){
		return funcao;
	}

	public void setFuncao(String newVal){
		funcao = newVal;
	}

	public boolean isIsProfessor(){
		return isProfessor;
	}

	public void setIsProfessor(boolean newVal){
		isProfessor = newVal;
	}

    public Materia getMaterias() {
        return materias;
    }

    public void setMaterias(Materia materias) {
        this.materias = materias;
    }
}
alan_pjr

Faça uma pesquisa sobre a anotação “@Inheritance” e os respectivos “InheritanceType”.

psycozy

e ai amigo alan_pjr =)

realizei a pesquisa que vc sugeriu.
e constatei que meu código esta correto, pois estou usando ‘@Inheritance(strategy=InheritanceType.JOINED)’.
o que, segundo minha pesquisa em vários sites, faria com que fossem criadas as tabelas ‘funcionario’ e ‘aluno’ contendo apenas o ‘pessoa_fisica_id’ (alem dos demais atributos, claro)

mas não é o que esta acontecendo no meu caso, e ja testei os outros InheritanceType (TABLE_PER_CLASS e SINGLE_TABLE).

aguardo sugestões.

[]'s

psycozy

Bom dia galera!

depois de muito sofrer e fritar os miólos, descobri que meu problema era mais simples do que eu imaginava…

como eu estava marcando as 2 classes como extends era desnecessário o uso do @MappedSuperclass, daí que estava surgindo aquele erro (org.hibernate.AnnotationException: Unable to define/override @Id(s) on a subclass: pacotes.Aluno )

o que eu fiz:

retirei o @MappedSuperclass da classe pai;
retirei alunoId e funcionarioId das classes filhas

logo, foram criadas as PFK’s pessoa_fisica_id nas tabelas filhas.

Obrigado a todos pelas dicas…

[]'s

Criado 17 de novembro de 2011
Ultima resposta 18 de nov. de 2011
Respostas 5
Participantes 3