Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Onde colocar o mappedBy

No decorrer do vídeo da explicação, fizemos o mapeamento na classe Conta, que possui uma lista de movimentações:

@OneToMany(mappedBy="conta")
    private List<Movimentacao> movimentacoes;

E aqui o instrutor fala para inserirmos o atributo mappedBy deste lado do relacionamento, sendo que ficamos com o seguinte relacionamento na classe Movimentacao:

@ManyToOne
    private Conta conta;

Porém, no exercício, temos:

public class Post {

    @ManyToOne
    private Escritor escritor;

}

public class Escritor {

    @OneToMany
    private List<Post> posts;

}

E nos é indicado que foi criada uma tabela no banco, Escritor_Post, que indica o relacionamento. Porém, na resposta nos é indicado que devemos colocar mappedBy="escritores", ou seja, este mapeamento deve ocorrer na classe Post, que possui o relacionamento @ManyToOne com Escritor, o que é o contrário do que está no vídeo. Para este caso, tanto faz onde eu coloco o mapeamento (seja onde está anotado @OneToMany ou @ManyToOne)?

4 respostas

Olá Matheus. Deve-se realizar o mapeamento apenas na entidade que contém o atributo relacionado. Por exemplo, Se escritor tem o atributo "Post" que representa uma outra entidade, deve-se especificar a cardinalidade . Agora se a entidade "Post" não apresentar o atributo escritor não é necessário mapeá-la. Pelo entendimento que eu tive a maneira apresentada no exercício está correta. Deve-se mapear as duas entidades pois uma se relaciona com a outra.

Olá Matheus e Jamile. Creio que o que confundiu o Matheus foi um erro no exercício, onde ele diz na resposta que devemos colocar mappedBy="escritores" no atributo posts da classe Escritor, mas o correto deveria ser mappedBy="escritor" no singular. Salvo engano meu, provavelmente houve um erro de digitação aí. Espero ter ajudado. Até mais

Obrigado pelas respostas, Jamile e João. A minha dúvida era se eu poderia mapear,com o atributo mappedBy em qualquer lado do relacionamento, ou seja, em Post, eu tenho uma anotação @ManyToOne que indica um relacionamento com outra entidade, e em Escritor, eu tenho a anotação @OneToMany que indica um relacionamento com outra entidade. Após, ler o conteúdo deste link: https://en.wikibooks.org/wiki/Java_Persistence/OneToMany, eu vi que as relações são unidirecionais, e ao indicar elas utilizando as anotações, podemos torná-la bidirecional, indicando no lado fraco da relação (onde anotamos como @ManyToOne) com o atributo mappedBy, a que atributo ela se relaciona. E houve o erro de digitação que me confundiu também.

solução!

Mateus, quando você coloca o mappedBy, você torna o relacionamento bidiricional, onde os dois lados do relacionaomento se convesam, você sempre vai colocar o mappedby sempre na tabela que não for levar a fk da outra tabela, no seu caso, o seu mappedby seria nessa tabela.

 @OneToMany(mappedby="escritor")
private List<Post> posts;