Mapeamento com Hibernate Annotations

1 resposta
gustavodelgado

Pessoal, como faço para mapear um atributo que é do tipo da própria classe?
Por exemplo… tenho uma tabela de setores, onde cada setor pode (ou não) possuir um setor superior. (No banco é uma chave extrangeira para a mesma tabela).
Minha classe Setor está assim:

package br.com.progov.intranetlibrary.entidade;


@Entity
@Table(name="int_setores")
public class Setor {
    
    private Integer codigoSetor;
    private String controle;
    private String descricao;
    private char ultimoNivel = 's';
    private SetorNivel codigoSetorNivel;
    private Setor setorSuperior;
    
    
    public Setor() {
    }
    
    
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Integer getCodigoSetor() {
        return codigoSetor;
    }
    
    public void setCodigoSetor(Integer codigo) {
        this.codigoSetor = codigo;
    }
    
    public String getControle() {
        return controle;
    }
    
    public void setControle(String controle) {
        this.controle = controle;
    }
    
    public String getDescricao() {
        return descricao;
    }
    
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    
    public char getUltimoNivel() {
        return ultimoNivel;
    }
    
    public void setUltimoNivel(char ultimoNivel) {
        this.ultimoNivel = ultimoNivel;
    }
    
    @ManyToOne
    public SetorNivel getCodigoSetorNivel() {
        if (codigoSetorNivel == null){
            codigoSetorNivel = new SetorNivel();
        }
        return codigoSetorNivel;
    }
    
    public void setCodigoSetorNivel(SetorNivel codigoNivel) {
        this.codigoSetorNivel = codigoNivel;
    }
    
    @ManyToOne
    @JoinColumn(name="codigoSetor", nullable=true)
    public Setor getSetorSuperior() {
        return setorSuperior;
    }
    
    public void setSetorSuperior(Setor setorSuperior) {
        this.setorSuperior = setorSuperior;
    }
    
           
    
}
O problema está no mapeamento do setor superior:

@ManyToOne

@JoinColumn(name=codigoSetor, nullable=true)

public Setor getSetorSuperior() {

return setorSuperior;

}
Está apresentando o erro:

[b]

Exception in thread main java.lang.ExceptionInInitializerError

at br.com.progov.hibernate.HibernateUtil.(HibernateUtil.java:31)

at br.com.progov.dao.hibernateimpl.GenericoDAOHibernateImpl.selectById(GenericoDAOHibernateImpl.java:80)

at testes.SetorPersistencia.main(SetorPersistencia.java:15)

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: br.com.progov.intranetlibrary.entidade.Setor column: codigoSetor (should be mapped with insert=false update=false)

at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:605)

at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:627)

at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:645)

at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:420)

at org.hibernate.mapping.RootClass.validate(RootClass.java:192)

at org.hibernate.cfg.Configuration.validate(Configuration.java:1099)

at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1284)

at br.com.progov.hibernate.HibernateUtil.(HibernateUtil.java:28)

 2 more

[/b]

Quando utilizava o .hbm.xml, o mapeamento era assim:

1 Resposta

gustavodelgado

Consegui resolver mapeando os 2 relacionamentos da seguinte maneira:

@ManyToOne

@JoinColumn(name=codigoSetorNivel, nullable=false)

public SetorNivel getCodigoSetorNivel() {

return codigoSetorNivel;

}
@ManyToOne

@JoinColumn(name=setorSuperior, nullable=true)

public Setor getSetorSuperior() {

return setorSuperior;

}
Criado 27 de novembro de 2006
Ultima resposta 27 de nov. de 2006
Respostas 1
Participantes 1