Mapeamento de tabelas no Hibernate Annotations

Olá pessoal,

Estou com dificuldades realizar um mapeamento no Hibernate utilizando annotations.
Tenho uma tabela chamada Funcionario (PK drtFuncionario e outras colunas),
uma tabela Ocorrencia(PK idOcorrencia e outras colunas) agora tenho uma tabela Testemunha(PK FK idOcorrencia e PK FK drtFuncionario). Ou seja a tabela Testemunha tem as chaves estrangeiras vindas das Tabelas Funcionario e Ocorrencia, sendo estas chaves a sua chave primária composta. Será que entenderam? Como ficaria a minha classe com as anotações?

Grato.
Wallfox

na sua Tabela Testemunha, existe mais algum campo alem das chaves?

se não tiver, ela eh simplesmente uma tabela associativa, então o mapeamento ficaria mais ou menos assim:

@Entity
public class Funcionario implements Serializable {

    @Id
    public Integer drtFuncionario;

    @ManyToMany(
        targetEntity=pacote.Ocorrencia.class,
        cascade={CascadeType.PERSIST, CascadeType.MERGE}
    )
    @JoinTable(
        name="Testemunha",
        joinColumns={@JoinColumn(name="drtFuncionario")},
        inverseJoinColumns={@JoinColumn(name="idOcorrencia")}
    )
    public Collection getOcorrencias() {
        return ocorrencias;
    }
    ...
}

@Entity
public class Ocorrencia implements Serializable {

    @Id
    public Integer idOcorrencia;

    @ManyToMany(
        cascade={CascadeType.PERSIST, CascadeType.MERGE},
        mappedBy="Testemunha"
        targetEntity=Funcionario.class
    )
    public Collection getFuncionarios() {
        return funcionarios;
    }
}

agora, se na tabela Testemunha vc tiver outras informações…vc tem q criar o seu POJO para Testemunha, e mapea-lo junto com Funcionario e Ocorrencia como 2 mapeamentos many-to-one, porém com uma composite PK, mais ou menos assim:

@Entity
public class Testemunha implements Serializable {
    
    @Id
    public Integer drtFuncionario;
    public Integer idOcorrencia;

    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity=Funcionario.class )
    @JoinColumn(name="drtFuncionario")
    public Funcionario getFuncionario() {
        return funcionario;
    }

    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity=Ocorrencia.class )
    @JoinColumn(name="idOcorrencia")
    public Ocorrencia getOcorrencia() {
        return ocorrencia;
    }
}

aih vc tem q mapear Funcionario e Ocorrencia com um mapeamento one-to-many em cada, “apontando” pra Testemunha…

espero ter ajudado…

flw

Olá Pedro,

Ótima explicação!
No meu caso a minha tabela Testemunha é apenas associativa. Como ficaria a minha classe Testemunha???

Grato.
Wallfox

Quando a tabela eh apenas associativa vc nao precisa criar a classe POJO q representa essa tabela…apenas faça o mapeamento many-to-many e manda bala…

Aiaiaiai… acho q eh muita coisa para a minha cabeça.
Já estou abusando, mas e agora? Como fica minhas classes Funcionario e Ocorrencia?

Valeu
Wallfox

Desculpe a insistência, mas sem a classe como eu faço para povoa a minha tabela ocorrência?

Grato.
Wallfox

na minha primeira resposta, eu coloquei como vc vai mapear as suas classes…

vc vai popular normalmente, tipo assim, a sua classe Funcionario terá uma Collection de Ocorrencias, e a sua class Ocorrencia tera uma Collection de Funcionarios, sacou?

como a sua tabela Testemunha eh apenas associativa, segue abaixo novamente como ficarar o seu mapeamento:

@Entity
public class Funcionario implements Serializable {

    @Id
    public Integer drtFuncionario;

    @ManyToMany(
        targetEntity=pacote.Ocorrencia.class,
        cascade={CascadeType.PERSIST, CascadeType.MERGE}
    )
    @JoinTable(
        name="Testemunha",
        joinColumns={@JoinColumn(name="drtFuncionario")},
        inverseJoinColumns={@JoinColumn(name="idOcorrencia")}
    )
    public Collection getOcorrencias() {
        return ocorrencias;
    }
    ...
}

@Entity
public class Ocorrencia implements Serializable {

    @Id
    public Integer idOcorrencia;

    @ManyToMany(
        cascade={CascadeType.PERSIST, CascadeType.MERGE},
        mappedBy="Testemunha"
        targetEntity=Funcionario.class
    )
    public Collection getFuncionarios() {
        return funcionarios;
    }
} 

lembrando q vc ainda tem q adicionar o resto dos seus campos…

Olá,

Ao anotar a classe Ocorrencia na parte

    @ManyToMany(
        cascade={CascadeType.PERSIST, CascadeType.MERGE},
        mappedBy="Testemunha"
        targetEntity=Funcionario.class
    )
    public Collection getFuncionarios() {
        return funcionarios;
    } 

aparece a seguinte mensagem:
Inconsistent access type in entity class because a field in this class or its super class chain is already annotated as @Id or EmbeddedID

E agora??

Grato.
Wallfox

cara…eu não tenho ambiente pra testar aqui…tudo q passei pra vc foi de cabeça e achando uns exemplos no google…então não tenho como testar aqui…tenta dar uma pesquisada em alguns exemplos…

com o Hibernate 2, o livro “Hibernate in Action” me ajudou muito como referencia…nem sei se tem a versão do Hibernate 3, mas se tiver ajuda muito, tem todos esses exemplos…

A documentação no site do Hibenate é ótima, é o melhor lugar para referencia que vc pode precisar =)

Abraços!

Valeu pessoal, vou estudar um pouco mais.

Grato.
Wallfox

Olá pessoal,

Eu encontrei este site:
http://www.caucho.com/resin-3.0/amber/tutorial/cmp-many2many/index.xtp
e acabei conseguindo fazer funcionaro mapeamento ManyToMany. Não sei se é a maneira correta. Se alguem souber, por favor, me avise.

Grato.
Wallfox

Wallfox…eh isso aih mesmo!