4
respostas

Mapeando relacionamentos Muitos-para-Muitos

Ví que no vídeo há o comentário de usar mappedBy, ou seja, o relacionamento Bidirecional.

Neste caso devemos ou não usar o relacionamento Bidirecional?

E qual é a melhor estratégia a adotar de forma a não ficar a cargo do desenvolvedor cuidar desse relacionamento?

4 respostas

para definir um poucos as coisas, o mappedBy é anotado na entidade que é dominante na ação, ou seja, isso indica que caso você defina uma deleção em cascata por exemplo. e tentar apaga a dominante da relação , ele irá excluir todas as associadas...

Emiliano um exemplo para o uso de mappedBy seria também para um @OneToOne, imagine que temos uma classe Pessoa:

public class Pessoa {
    // atributos
}

Porém também temos classes e tabelas no banco de dados separadas para salvar o Endereço e Documentos:

public class PessoaEndereco {
    private Pessoa idpessoa;
    // atributos
}

public class PessoaDocumento {
    private Pessoa idpessoa;
    // atributos
}

Porém queremos em apenas um formulário e uma requisição salvar nas 3 tabelas, para isso precisamos mapear um @OneToOne dentro da classe de Pessoa apontando para o Endereco e Documento:

public class Pessoa {
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "idpessoa")
private PessoaEndereco pesendereco;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "idpessoa")
private PessoaDocumento pesdocumento;
    // atributos
}

Ai dentro do formuário você pode por exemplo fazer:

<input name="pessoa.pesendereco.logradouro" value="${pessoa.pesendereco.logradouro}">
<input name="pessoa.pesdocumento.cpf" value="${pessoa.pesdocumento.cpf}">

Assim conseguira salvar nas três tabelas de uma unica vez.

Espero ter ajudado

Bem interessante Matheus vou verificar aqui como funcionaria.

Tenho encontrado uma dificuldade em entender a questão de um master detail, tipo nota fiscal e itens da nota, sendo no caso um OneToMany ou ManyToMany.

Usando VRaptor com JPA / Hibernate como implementar esse mapeamento Matheus? Você pode me ajudar a entender como solucionar esse problema?

Emiliano para fazer amarrações @ManyToMany ou @OneToMany devemos usar collections como atributos:

private Pessoa idpessoa;
@OneToMany
@JoinColumn(name = "id", referencedColumnName = "idpessoa")
private List<Pessoa> pessoas;

Repare que a amarração é ao contrário das @OneToOne ou @ManyToOne onde no name passamos o atributo da própria classe e no referencedColumnName passamos o atributo da classe alvo:

@ManyToOne
@JoinColumn(name = "idpessoa", referencedColumnName = "id")
private Pessoa idpessoa;

@OneToMany
@JoinColumn(name = "id",  referencedColumnName = "idpessoa")
private List<Pessoa> pessoas;

Espero ter ajudado