Recursividade de classes no Nhibernate


Ao criar classes mapeando-as para NHibernate, tome muito cuidado com a recursividade das classes, que pode lhe causar muita dor de cabeça. Entrei em um projeto onde estavam utilizando NHibernate e ActiveRecord (mapeamento com Attributes, sem usar arquivos XML) e em algumas classes fizeram o mapeamento parecida com a ilustração abaixo:

public class Cliente
{
	public Cliente()
	{
	}

	public string Nome { get; set; }
	public string Email { get; set; }
	public string Endereco { get; set; }
	public List<Produto> ProdutosDesejados { get; set; }
}

public class Produto
{
	public Pedido() { }

	public int ID { get; set; }
	public int PrecoTotal { get; set; }
	public List<Cliente> Clientes { get; set; }
}

Na ilustração acima, parece bem simples, porém, pode causar um baita problema para a sua aplicação na hora que o NHibernate for obter os dados do banco de dados. Quando o Nhibernate trouxer todos os dados do banco e atribuí-las para suas propriedades e classes filhas (conforme exemplo de Produto e Cliente), o objeto entrará numa recursividade absurda. O Nhibernate sabe se virar nessas horas, porém, o tamanho do seu objeto poderá ficar enorme.

Para cada cliente carregado, será retornado a lista de produtos desejados daquele cliente e para cada produto irão ser carregados todos os clientes que desejam aquele Produto, ou seja, é muita informação para ser trafegada para uma aplicação baseada em serviços por exemplo.

Então, ao mapear suas classes utilizando qualquer API de O/R Mapper (NHibernate, Entity Framework, etc), tome cuidado com esses detalhes e evite dores de cabeça que poderão fazer com que você tenha um retrabalho enorme.

, ,

  1. Nenhum comentário ainda.
(não será publicado)