Este relacionamento informa que existem muitos registros de uma entidade associados a um registro de outra entidade.
Exemplo de relacionamento Um-para-Muitos e Muitos-para-Um bidirecional, no qual uma Pessoa possui vários Telefones:
Script do banco de dados:
Modelo UML:
Neste exemplo definimos que uma Pessoa possui uma lista de Telefones e um Telefone está associado a uma Pessoa, portanto temos um relacionamento bidirecional.
Código fonte das classes com o relacionamento:
Na entidade Pessoa definimos que uma pessoa possui vários telefones através do atributo List<Telefone> telefones e adicionamos a anotação javax.persistence.OneToMany para informar que o relacionamento de Pessoa para Telefone é de Um-para-Muitos, note que nesta anotação definimos a propriedade mappedBy como “pessoa” que é para informar que o atributo com o nome pessoa na entity Telefone que é dona do relacionamento.
Na entidade Telefone definimos o atributo Pessoa pessoa e adicionamos a anotação javax.persistence.ManyToOne para definir que o relacionamento de Telefone para Pessoa é de Muitos-para-Um.
javax.persistence.ManyToOne
Esta anotação define uma associação com outra entidade que tenha a multiplicidade de muitos-para-um.
Propriedades
Descrição
cascade
As operações que precisam ser refletidas no alvo da associação.
fetch
Informa se o alvo da associação precisa ser obtido apenas quando for necessário ou se sempre deve trazer.
optional
Informa se a associação é opcional.
targetEntity
A classe entity que é alvo da associação.
Também podemos adicionar uma tabela para realizar o relacionamento unidirecional de um-para-muitos e o relacionamento muitos-para-muitos, normalmente utilizamos está alternativa como uma forma de normalizar os dados evitando duplicar o conteúdo dos registros.
Nesse exemplo queremos utilizar a entidade Telefone com as entidades Pessoa e Aluno, ou seja, Pessoa possui uma lista de Telefones e Aluno possui uma lista de Telefones, mas o telefone não sabe para quem ele está associado. Este tipo de relacionamento é unidirecional de um-para-muitos.
Na base de dados iremos criar as tabelas Pessoa, Telefone e Aluno, também iremos criar duas tabelas de associação chamadas Pessoa_Telefone e Aluno_Telefone:
Na entidade Pessoa definimos que uma pessoa possui vários telefones através do atributo List<Telefone> telefones e adicionamos a anotação javax.persistence.OneToMany para informar que o relacionamento de Pessoa para Telefone é de Um-para-Muitos.
Para informar que vamos utilizar a tabela PESSOA_TELEFONE para realizar a associação entre as tabelas PESSOA e TELEFONE utilizamos a anotação javax.persistence.JoinTable.
Para informar que a coluna PESSOA_ID da tabela PESSOA_TELEFONE é a coluna chave estrangeira para a tabela PESSOA e para informar que a coluna TELEFONE_ID da tabela PESSOA_TELEFONE é a chave estrangeira para a tabela TELEFONE utilizamos a anotação javax.persistence.JoinColumn.
javax.persistence.JoinTable
Esta anotação é utilizada para definir uma tabela que será utilizada na associação de um-para-muitos ou de muitos-para-muitos.
Propriedades
Descrição
catalog
O catalogo da tabela.
inverseJoinColumns
Chave estrangeira para realizar a associação com a tabela que não é dona do relacionamento.
joinColumns
Chave estrangeira para realizar a associação com a tabela que é dona do relacionamento.
name
Nome da tabela de associação.
schema
Esquema da tabela.
uniqueConstraints
Regras que podem ser adicionadas na tabela.
Na entidade Aluno definimos que um aluno possui vários telefones através do atributo List<Telefone> telefones e adicionamos a anotação javax.persistence.OneToMany para informar que o relacionamento de Aluno para Telefone é de Um-para-Muitos.
Para informar que vamos utilizar a tabela ALUNO_TELEFONE para realizar a associação entre as tabelas ALUNO e TELEFONE utilizamos a anotação javax.persistence.JoinTable.
Para informar que a coluna ALUNO_ID da tabela ALUNO _TELEFONE é a coluna chave estrangeira para a tabela ALUNO e para informar que a coluna TELEFONE_ID da tabela ALUNO _TELEFONE é a chave estrangeira para a tabela TELEFONE utilizamos a anotação javax.persistence.JoinColumn.
Agora vamos declarar a entidade Telefone, note que esta entidade não conhece as associações que são criadas para ela.
Para testar o cadastro de Aluno e Telefone vamos criar uma classe AlunoDAO onde iremos salvar, alterar, consultar por id e apagar os registro do aluno e telefone.
Vamos criar a classe AlunoDAOTeste que utilizará a classe AlunoDAO para salvar, alterar, consultar por id e apagar os registros de aluno e telefone:
Quando executamos a classe AlunoDAOTeste temos a seguinte saída no console: