[quote=Alexsandro Lopes]Estou estudando Hibernate e vi que há mapeamentos unidirecional: um modelo tendo acesso a outro modelo. e bidirecional ambos tendo acesso aos dados dos modelos.
Mas isso é uma boa prática de arquitetura e regra de negócio? (bidirecional)
Não é delegar responsabilidades demais? uma classe alterar valores de outra e vice versa?
Não haverá inconsistência na base de dados que condenará toda a aplicação que irá gerar dados incorretos.
ou o desenvolvedor deve amarrar essas “vulnerabilidades” na regra de negócio?
ou vai de caso a caso dependendo do modelo de negócio que o projeto está realizando?
Sabendo que a maioria das aplicações são desenvolvidas no modo “botton-up” iniciando com o projeto de banco de dados.
Qual o conhecimento e opinião de vocês a respeito?[/quote]
Se A têm B e B tem A o problema não de birirecinalidade, é de lógica.
é muito raro que seja necessário ter navegação (a palavra OO é navegação entre A e B) bidirecional. Não pela tecnologia, mas pela lógica da coisa.
As entidades têm relações e agregação ou seja, umas estão contidas nas outras. Tanto no sentido físico, como no sentido de lógica.
Por exemplo, Empresas (clientes) e Pedidos. Pedidos são para uma empresa e empresas fazem pedidos. Parece que é necessário anvegação bidirecional, mas não. Pedidos precisam de uma empresa para serem completos. empresas não precisam de pedidos para serem completas. Logo, existe pedidos.getEmpresa, mas não empresa.getPedidos.
Em modelos avançados de domínio onde se usa o padrão memento, ou seja, a entidades do domínio não são as mesmas entidades (active record me vêm à cabeça) , seria possivel que empresa.getPedidos existisse. Seria até ideal , do ponto de vista do dominio, afinal essa é a relação real. Mas na prática isso seria mediado por um serviço/repositorio o que significa que não é uma relação “natural”, é apenas uma query. E é uma query porque eu não quero saber todos os pedidos de uma vez. normalmente quero filtrar. então é irrelevante que obtenha todos os pedidos. Ou seja, eu não faria um emprea.getPedidos e depois iria filtrar com for e if, eu simplemente pediria ao repositorios que me desse os pedidos conforme o filtro X.
Poderiamos argumentar que um modelo é DDD e o outro não é, mas o fato é que isso é irrelevante pois não trabalhamos com DDD de verdade onde o modelo não tem nada que ver com a persistência e vice-versa. Então no nosso mundo onde a entidade persistente e a de dominio são a mesma coisa, o modelo com uma só direção e queries à parte é mais gerenciável. Mas por exemplo, isto via para o espaço se vc tiver uma relaçao de arvore. Ai vc precisa que haja navegação bidirecional (o pai tem parent.GetChildren e o filho tem child.getParent ) e ai é um desafio. Mas vejam que isto é devido à estrutrua e não ao dominio em si.