Questão nº 24
Questão de Tecnologia da Informação · FCC TRE-PR 2017 (nº 24)
Em uma relação Many-to-Many bidirecional entre as entidades Produto e Cliente, deseja-se possibilitar a consulta de quais produtos um determinado cliente adquiriu e quais clientes possuem determinado produto.
Na classe dominante Cliente, em Java, foi utilizada a seguinte notação:
```
@ManyToMany
@JoinTable(name="cliente_has_produto", joinColumns=
{@JoinColumn(name="cliente_id")}, inverseJoinColumns=
{@JoinColumn(name="produto_id")})
private List produtos;
```
A notação equivalente, na classe Produto, deve ser:
- A`@ManyToMany(mappedBy="produtos") private List clientes;` (alternativa correta)
- B`@ManyToMany(cascade = CascadeType.ALL) private ArrayList clientes;`
- C`@OneToMany(cascade=ALL, mappedBy="clientes") private Set clientes;`
- D`@ManyToMany(referredBy="clientes") private List clientes;`
- E`@ManyToOne(cascade=ALL, mappedBy="produtos") private ArrayList clientes;`
Resposta comentada
Gabarito Alternativa A
Em uma relação Many-to-Many bidirecional com JPA, uma das entidades (o lado "dono") define a tabela de junção, enquanto a outra (o lado "inverso") usa o atributo mappedBy para indicar qual campo na entidade dona gerencia essa relação, evitando duplicação.
- (A) Correta: O atributo
mappedBy="produtos"indica corretamente que a relação é gerenciada pelo campoprodutosna classeCliente, que é o lado dono e onde a tabela de junçãocliente_has_produtofoi definida. - (B) Incorreta: Embora
@ManyToManyesteja correto, a ausência demappedByfaria com que o Hibernate tentasse criar uma segunda tabela de junção para a mesma relação, gerando erro ou comportamento inesperado.cascadedefine o comportamento em cascata, não a inversão da relação. - (C) Incorreta: A anotação
@OneToManyestá errada, pois a relação é Many-to-Many. Além disso,mappedBynão é usado dessa forma em@OneToManyquando a relação é bidirecional de um para muitos. - (D) Incorreta: O atributo
referredBynão existe nas especificações JPA para mapeamento de relações. A palavra-chave correta para o lado inverso de uma relação bidirecional émappedBy. Essa é a armadilha da banca, usando um termo que soa similar, mas é inválido. - (E) Incorreta: A anotação
@ManyToOneestá errada, pois a relação é Many-to-Many. O atributomappedBytambém não é utilizado com@ManyToOne, que é sempre o lado dono da relação.
Fonte: FCC TRE-PR 2017 Técnico Judiciário - Área Apoio Especializado - Especialidade Programação de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.