[quote=derlon][quote=garcia-jj]…Injeção de EJB no Vraptor não tem, o que você consegue fazer é usar um service locator (eu uso isso).
…[/quote]Usando EJB3 ou JPA é 1 prática comum injetar o @PersistenceContext na DAO (ou no Repository) => no caso do EJB, quando 1 atributo settado load=lazy é refenciado e o Objeto Entidade já está fora do Contexto EJB, o Hibernate (ou framework JPA) “sai de cena”. Uhm, …[/quote]
Vocẽ está confundindo as coisas. Service locator para buscar seus session beans, e não o persistence context e afins. Não há como injetar session beans em classes que não sejam controladas pelo container. No caso em servlets e backing beans você consegue injetar stateless-session-beans sem problemas.
[quote=derlon]@garcia-jj, tenho q concordar (em gênero, grau e número) com o Lucas quando ele diz: "a maioria das vezes o que vc tem que se perguntar é: vc precisa mesmo de EJB? seu sistema é distribuido? seu sitema tem clientes (outros sistemas) diferentes acessando o mesmo ejb?"
Digo isto pq: o EB3 sim fornece os mesmos recursos q o Spring fornece (e com a mesma simplicidade), mas por questões, como a descrita loga acima, temos sim q refletir muito antes de decidir adotar EJB 3: p/ex., 1 cenário simples, como o de LazyLoadExcecption, já obriga a usar o famigerado DTO (e, olha q neste caso, apenas para contornar o problema do ‘LazyLoadExcecption’).[/quote]
Derlon, sem querer causar flamewars, mas isso é pensamento de programador pequeno. EJB3 está longe de ser burocrático, e é até mais simples que usar Spring. Se você está com esse pensamento é porque realmente não conhece o suficiente de EJB. No caso do comentario que o Lucas fez me abstive de opinar porque pensei que o Lucas estava falando de EJB2, que aí sim eu concordo.
EJB não é apenas para aplicações distribuídas. Você pode facilmente trabalhar com aplicações simples usando EJB e ainda com performance melhor ainda que o Spring. Basta o programador saber o que está fazendo.
Quando ao lazy-exception, eu já repetí inúmeras vezes aqui no GUJ sobre isso, vocẽ pode dar uma pesquisada do meu histórico. É uma put* gambiarra você exportar suas entidades direto na web. Isso, na minha opinião falando em termos bem genéricos, é errado, é erro de desenho do projeto. Como que você simplesmente sai por aí largando todas suas classes persistences para a camada web sem dó nem piedade? Aí na web por alguma razão é feito um User.getRoles().clear() e o Spring/Hibernate exclui todas as roles do banco? Isso é certo? Ou então expor para a camada web a senha do usuário via Usuario.getPassword?
Se você tem esse pensamento, creio que você precisa ler realmente para que serve o DTO. É para transformação, e não para contornar o lazy-load. DTO existe muito antes dos tais “problemas” de lazy-load.
Estudar um pouco a especificação para entender os comportamentos é sempre bom. Assim evita que você tenha más interpretações de uma tecnologia.