ORM: proxies de tempo de execução versus instrumentação de bytecode

5
Quais são os benefícios de usar proxies de tempo de execução com um provedor ORM como o Hibernate ou o EclipseLink em comparação com instrumentação / aprimoramento de bytecode?

Eu sei que a instrumentação bytecode ajuda a otimizar a verificação suja. Como ele pode interceptar modificações, o provedor ORM não precisa percorrer todos os objetos no contexto de persistência e comparar os valores atuais com o instantâneo capturado quando os objetos foram carregados (evitando assim também o consumo de memória adicional, suponho).

Além disso, sei que isso pode ajudar em situações nas quais consultas adicionais precisam ser executadas porque o provedor ORM não sabe se um proxy precisa ser criado ou qual é o valor da chave primária no proxy, como em < um href="https://stackoverflow.com/questions/1444227/making-a-onimao-uma-relação-lazy"> preguiçoso um-para-um associações, tornando assim as associações efetivamente ansioso em algumas situações. / p>

Algumas outras armadilhas de proxy foram descritas neste blog , como acesso direto ao campo (nos métodos equals e hashCode ) e uso do operador instanceof .

Parece-me que a instrumentação bytecode é uma alternativa melhor. Tem alguma armadilha própria em comparação com a abordagem de proxies de tempo de execução? Existe alguma regra que deve ser seguida ao escolher uma em vez da outra?

    
por Dragan Bozanovic 14.07.2015 / 13:58
fonte

1 resposta

2

Tanto o Hibernate quanto o EclipseLink usam o padrão de design Proxy para implementar o carregamento lento / ansioso de relacionamentos de entidade. Os proxies são entrelaçados no bytecode do Java no momento da construção (estaticamente) ou no tempo de execução (dinamicamente) - basicamente aprimorando seus POJOs da Entidade. Outras características, como a verificação suja, também são tecidas no bytecode.

Esta é uma aplicação do Aspect Oriented Programming (AOP). Todas as mesmas armadilhas (por exemplo, classes inesperadas em tempo de execução) e vantagens (por exemplo, código-fonte mais limpo, injeção de código em tempo de execução) se aplicam.

Então a questão é: quais são as alternativas? Você pode desabilitar a tecelagem e implementar os mesmos recursos (carregamento lento, verificação suja, etc.) em seu próprio código - sem surpresas de tempo de execução, mas com maior esforço de desenvolvimento.

Como regra geral, use anotações, evite a inspeção de classe de entidade em tempo de execução e confie em tecelagem de código Hibernate ou Eclipselink para entregar o que você deseja. Observe que você sempre tem a opção de implementar seus próprios proxies, etc., se a complexidade exigir isso.

    
por 22.07.2015 / 02:03
fonte