Olá, tudo bem?
Quando devo utilizar relacionamento unidirecional e quando utilizar bidirecional para relacionar minhas entidades?
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!