Este relacionamento informa que há apenas um registro da entidade relacionado com um registro de outra entidade.
Exemplo de relacionamento Um-para-Um unidirecional, no qual temos uma Mensagem dividida em duas tabelas:
Script do banco de dados:
Modelo UML:
Neste exemplo definimos que uma Mensagem possui uma MensagemCorpo, então destaforma a Mensagem sabe qual é seu MensagemCorpo, mas o contrario não existe, a MensagemCorpo não tem a necessidade de conhecer qual a Mensagem está associado a ele, ou seja, temos um relacionamento unidirecional.
Primeiramente podemos mostrar apenas uma listagem de Mensagens, mas não tem necessidade por enquanto de mostrar o conteúdo de todas as mensagens e depois caso eu queira ler o conteúdo da mensagem podemos através dela chegar até seu corpo utilizando o atributo do tipo MensagemCorpo, ou seja, encontrar o conteúdo da mensagem.
Código fonte das classes com o relacionamento:
Na classe Mensagem utilizamos a anotação javax.persistence.OneToOne para definir o relacionamento de um-para-um entre as classes Mensagem e MensagemCorpo.
A classe MensagemCorpo é uma entidade normal que não conhece a classe Mensagem.
Note que não precisamos criar nenhuma referencia para informar que o atributo mensagemCorpo da classe Mensagem referencia a coluna mensagemcorpo_id da tabela Mensagem.
O JPA possui alguns padrões para facilitar o mapeamento entre a classe Java e a tabela do banco de dados, quando criamos uma coluna de chave estrangeira seguindo o padrão nometabela_chaveprimaria, o mapeamento é feito automaticamente pelo JPA, ou seja, o atributo MensagemCorpo mensagemCorpo é automaticamente associado com a coluna mensagemcorpo_id.
A classe MensagemDAO ficará da seguinte forma:
No exemplo a seguir estamos chamando apenas o método salvar da classe MensagemDAO:
Ao salvar a mensagem no banco de dados, também será salvo automaticamente a mensagem corpo nas devidas tabelas:
javax.persistence.OneToOne
Esta anotação define uma associação com outra entidade que tenha a multiplicidade de um-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.
mappedBy
Informa o atributo que é dono do relacionamento.
optional
Informa se a associação é opcional.
targetEntity
A classe entity que é alvo da associação.
Quando precisamos especificar um mapeamento que não é padrão do JPA, podemos utilizar a anotação javax.persistence.JoinColumn, por exemplo se a tabela Mensagem e MensagemCorpo fossem:
Poderíamos utilizar o JoinColumn para criar a associação:
javax.persistence.JoinColumn
Esta anotação é utilizada para especificar a coluna utilizada na associação com outra entity.
Propriedades
Descrição
columnDefinition
Definição do tipo da coluna.
insertable
Informa se a coluna é incluída no SQL de INSERT.
name
Informa o nome da coluna de chave estrangeira.
nullable
Informa se a coluna pode ser null.
referencedColumnName
Nome da coluna que é referenciada pela coluna da chave estrangeira.