Olá, tudo bem?
Quando devo utilizar relacionamento unidirecional e quando utilizar bidirecional para relacionar minhas entidades?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Olá, tudo bem?
Quando devo utilizar relacionamento unidirecional e quando utilizar bidirecional para relacionar minhas entidades?
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!