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!