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

quando utilizar relacionamento unidirecional e quando utilizar bidirecional?

Olá, tudo bem?

Quando devo utilizar relacionamento unidirecional e quando utilizar bidirecional para relacionar minhas entidades?

2 respostas
solução!

Oi Michael,

A boa prática é sempre evitar relacionamentos bi-direcionais, pois eles podem causar problemas caso não sejam implementados corretamente.

Eles meio que são "desnecessários", pois podemos recuperar as informações via consulta. A vantagem seria evitar a criação de um método para realizar uma consulta das entidades do relacionamento, já que bastaria acessar o atributo.

Por exemplo, suponha um sistema que tenha as entidades Produto e Categoria, na qual um produto deve ser vinculado à uma categoria. Geralmente fazemos esse mapeamento de forma unidirecional:

@Entity
@Table(name = "produtos")
public class Produto {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private BigDecimal preco;

    @ManyToOne
    private Categoria categoria;

    // outros atributos, getters, setter, etc.
}

@Entity
@Table(name = "categorias")
public class Categoria {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;

    // outros atributos, getters, setter, etc.
}

Esse é jeito mais simples e natural. O problema seria se tivesse uma necessidade na aplicação de listar todos os produtos de uma determinada categoria. Precisariamos ter um método para isso:

public List<Produto> produtosDaCategoria(Categoria categoria) {
    return em
        .createQuery("SELECT p FROM Produto p WHERE p.categoria = :c", Produto.class)
        .setParameter("c", categoria)
        .getResultList();
}

Se o relacionamento tivesse sido mapeado de forma bidirecional, bastaria acessar os produtos da categoria:

List<Produto> produtosDaCategoria = categoria.getProdutos();

Embora seja mais simples, acaba sendo desnecessário, pois com a query mostrada anteriormente teremos o mesmo resultado, sem o risco de mapear e lidar de maneira incorreta o relacionamento bidirecional.

Bons estudos!

Obrigado pela explicação Rodrigo!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software