Pergunta

Eu estou no processo de desenvolvimento de uma aplicação de processamento financeiro hierárquico-multi em Java utilizando EJB3 (Hibernate + GlassFish para a camada de serviços de aplicativos e web, Elevador no GlassFish para a interface web) e eu estou lutando com a questão de onde colocar a minha lógica de negócios.

Quando o projeto começou, a nossa primeira ideia era colocar a maior parte da nossa lógica de negócios para os beans de sessão sem estado. Como o passar do tempo, porém, nós encontramos a injeção de dependência fornecido pelo framework EJB muito limitante, então um monte de nossa lógica de negócios acabou em POJOs que são montados por Guice no método @PostConstruct dos beans de sessão sem estado . Este progresso levou à fragmentação da nossa lógica de negócios entre os beans de sessão e os POJOs, e eu estou tentando descobrir uma abordagem para corrigir isso.

Inicialmente, tentamos ter a nossa camada da web usar as interfaces remotas dos beans de sessão para executar algumas funções que são acessíveis tanto a partir da interface do usuário e da camada de serviço web, que é fornecido pelo @ WebService-anotada beans de sessão sem estado. Este acabou por ser um pesadelo de uma perspectiva de persistência e desempenho, porque nosso gráfico entidade pode crescer bastante grande e recolocar o gráfico entidade destacado para o contexto de persistência acabou por ser altamente propenso a erros, de modo que a nossa solução era começar apenas passando objeto identificadores ao redor e olhando para cima as entidades do banco de dados onde quer que eles eram necessários.

A minha pergunta básica é esta: que princípios e diretrizes que você pode sugerir para decidir se a lógica de negócios deve ir em um bean de sessão ou um POJO? Quando será que faz sentido para passar beans de entidade ao redor, dado um gráfico de objeto complexo?

Foi útil?

Solução

Lutei com isso enquanto construindo um webapp usando JPA, EJB3 e Wicket. Desde bater meu banco de dados duro com consultas repetidas foi mais escalável do que segurar lotes de grandes entidades na memória, decidi passar apenas em torno de seus ids e nunca a entidade em si.

Wicket e seu conceito de modelos teve muito a ver com esta decisão. Sua loadableDetachableModel limpa entidades quando eles não estão em uso, enquanto ainda segurando a id. Um método load () é implementado que sabe como conseguir a entidade quando é necessário mais uma vez, no meu caso, chamando um bean de sessão sem estado; e uma persist () método chama o bean sem estado para manter as alterações. Esta classe de modelo é o que eu realmente passar ao redor. Wicket lida apenas com a lógica pertencente a exibição e validação de entrada, e eu só precisa injetar o EJB para as classes de modelo. Talvez você poderia criar algo semelhante em seu aplicativo (Eu não tenho idéia do que elevador tem para oferecer ...).

Este tem funcionado muito bem para mim, mas eu não tenho lógica de negócios particularmente complexa e pode isolar as alterações que precisam ser persistentes em pequenas unidades de lógica e de páginas únicas.

Outras dicas

Sempre que precisar de muitos serviços "sistema" (injecções, etc) de feijão uso apátrida. Caso contrário - POJOs. POJOs são muito mais flexíveis.

No entanto simples métodos (por exemplo, em webservices e feijão) (acessor?) Pode apenas fazer alguns trabalhos simples e retornar os resultados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top