O que exatamente significa o lado dono ? O que é uma explicação com alguns exemplos de mapeamento ( um para muitos, um para um, muitos para um )?
O texto a seguir é um trecho da descrição de @OneToOne na documentação do Java EE 6. Você pode ver o conceito que possui o lado nele.
Define uma associação de valor único para outra entidade que possui multiplicidade um para um. Normalmente, não é necessário especificar a entidade de destino associada explicitamente, pois ela geralmente pode ser inferida a partir do tipo de objeto que está sendo referenciado. Se o relacionamento for bidirecional, o lado não proprietário deverá usar o elemento mappedBy da anotação OneToOne para especificar o campo ou a propriedade do relacionamento do lado proprietário.
Respostas:
Por que é necessária a noção de um lado dono:
A idéia de um lado proprietário de uma relação bidirecional deriva do fato de que nos bancos de dados relacionais não existem relações bidirecionais, como no caso de objetos. Nos bancos de dados, temos apenas relações unidirecionais - chaves estrangeiras.
Qual é o motivo do nome 'dono'?
O lado proprietário da relação rastreada pelo Hibernate é o lado da relação que possui a chave estrangeira no banco de dados.
Qual é o problema que a noção de possuir lado resolve?
Veja um exemplo de duas entidades mapeadas sem declarar um lado proprietário:
Do ponto de vista do OO, esse mapeamento define não uma relação bidirecional, mas duas relações unidirecionais separadas.
O mapeamento criaria não apenas tabelas
PERSONS
eID_DOCUMENTS
, mas também criaria uma terceira tabela de associaçãoPERSONS_ID_DOCUMENTS
:Observe a chave primária
pk
emID_DOCUMENTS
somente. Nesse caso, o Hibernate controla os dois lados da relação independentemente: Se você adicionar um documento à relaçãoPerson.idDocuments
, ele inserirá um registro na tabela de associaçãoPERSON_ID_DOCUMENTS
.Por outro lado, se chamarmos
idDocument.setPerson(person)
, alteramos a chave estrangeira person_id na tabelaID_DOCUMENTS
. O Hibernate está criando duas relações unidirecionais (chave estrangeira) no banco de dados, para implementar uma relação bidirecional de objetos.Como a noção de possuir lado resolve o problema:
Muitas vezes o que nós queremos é apenas uma chave estrangeira na tabela de
ID_DOCUMENTS
direçãoPERSONS
ea mesa associação extra.Para resolver isso, precisamos configurar o Hibernate para parar de rastrear as modificações na relação
Person.idDocuments
. O Hibernate deve rastrear apenas o outro lado da relaçãoIdDocument.person
e, para isso, adicionamos mappedBy :O que significa mappedBy?
Existem GOTCHAs, consequências?
Usando mappedBy , Se nós só chamar
person.getDocuments().add(document)
, a chave estrangeira emID_DOCUMENTS
vão NÃO estar ligado ao novo documento, porque esta não é a / lateral proprietária rastreado da relação!Para vincular o documento à nova pessoa, você precisa ligar explicitamente
document.setPerson(person)
, porque esse é o lado proprietário da relação.Ao usar mappedBy , é de responsabilidade do desenvolvedor saber qual é o lado proprietário e atualizar o lado correto da relação para acionar a persistência da nova relação no banco de dados.
fonte
person.getDocuments().add(document)
", o hibernate atualiza a chave estrangeiraID_DOCUMENTS
.@OneToMany
anotação que pode ser definida como PERSIST. Nesse caso, o hibernar salvará todas as entidades vinculadas ao banco de dados. Alguém pode esclarecer isso - por que o autor diz que o hibernate não rastreia alterações no lado não proprietário - mas, na verdade, o hibernado realiza o rastreamento?Você pode imaginar que o lado proprietário é a entidade que tem a referência ao outro. No seu trecho, você tem um relacionamento individual. Como é uma relação simétrica , você terá que, se o objeto A estiver em relação ao objeto B, também o vice-versa for verdadeiro.
Isso significa que salvar no objeto A uma referência ao objeto B e salvar no objeto B uma referência ao objeto A será redundante: é por isso que você escolhe qual objeto "possui" o outro que tem a referência a ele.
Quando você tem um relacionamento um para muitos, os objetos relacionados à parte "muitos" serão o lado proprietário; caso contrário, você precisará armazenar muitas referências de um único objeto para uma multidão. Para evitar isso, todos os objetos da segunda classe terão um ponteiro para o único ao qual se referem (portanto, eles são o lado proprietário).
Para um relacionamento muitos-para-muitos, uma vez que você precisará de uma tabela de mapeamento separada de qualquer maneira, não haverá nenhum lado proprietário.
Em conclusão, o lado proprietário é a entidade que faz referência ao outro.
fonte
@ManyToMany
relacionamentos também têm lados proprietários. Da mesma forma, os@OneToMany
relacionamentos podem usar tabelas de junção, e você ainda precisa especificar um lado proprietário.