Вы находитесь на странице: 1из 3

EJB3 + DAO Muito se discute na comunidade se devemos usar B3, pois o container EJB somente ir injetar o e EJB) que

so gerenciadas pelo container web, sso DAO no gerenciado pelo container web, e ger. por Ronildo Braga Junior 3 3 0 0 um mecanismo de persistncia com EJ EntityManger nas classes (Servlets ou seja, isso um problema pois o no ele com certeza precisa do EntityMana

Muito se discute na comunidade se devemos usar um mecanismo de persistncia com EJ B3, pois o container EJB somente ir injetar o EntityManger nas classes(Servlets e EJB) que so gerenciadas pelo container web, ou seja, isso um problema pois o nos so DAO no gerenciado pelo container web, e ele com certeza precisa do EntityManag er. Esse problema no existia anteriormente porque o nosso DAO era responsvel por criar a conexo com o banco de dados, o que nos trazia mais problemas, pois tnhamos a qu esto da transao, que no podia ser gerenciada pelo DAO, apesar deste criar a conexo co m o banco de dados. Outro ponto negativo do EJB3 + DAO que o nosso DAO no algo mais complexo, portant o fica simples voc inserir um registro no banco de dados com poucas linhas: @PersistenceContext private EntityManager em; public void persist(Object o){ em.persist(o); } Pois , isso mesmo, o cdigo acima ir gravar qualquer entidade no banco de dados, voc pode colocar essa funo no seu EJB e "eureka" resolvido o nosso mecanismo de persis tncia. Mas nem tudo flores, essa abordagem no serve para ns, pois no estamos fazendo um si stema para a padaria da sua esquina, ou para lojinha do seu tio. O nosso sistema no pode simplismente gravar a entidade no banco de dados e espera r que tudo ocorra normalmente, o mtodo acima pode precisar de uma transao para duas entidades diferentes, ou pior, pode lanar uma exceo do banco de dados para o clien te. Imagina o seu EJB tratando as excees do banco de dados mais as de negcio do EJB , no vai ficar muito elegante n :-/ Portanto aconselho sim, que voc use um mecanismo de persistncia com o seu EJB, e v ou demonstrar abaixo como voc pode fazer isso. Primeiro vamos criar a nossa fbrica de DAO que ser responsvel por injetar o nosso E ntityManager em nossos DAOs. Esta fbrica um EJB local pois no queremos que cliente s fora do nosso container web faam uso dessa classe. Segue abaixo a interface da nossa fbrica. @Local public interface RepositorySession { @TransactionAttribute(TransactionAttributeType.NEVER) public LoginRepository getLoginRepository();

@TransactionAttribute(TransactionAttributeType.NEVER) public TimesheetRepository getTimesheetRepository(); } Agora segue abaixo a nossa implementao da fbrica. @Stateless public class RepositorySessionImpl implements RepositorySession{ @PersistenceContext private EntityManager em; @TransactionAttribute(TransactionAttributeType.NEVER) public LoginRepository getLoginRepository(){ return new LoginDAO().setEntityManager(em); } @TransactionAttribute(TransactionAttributeType.NEVER) public TimesheetRepository getTimesheetRepository(){ return new TimesheetDAO().setEntityManager(em); } } voc precisa reparar em trs anotaes importantes: @Stateless significa que no vamos manter um estado de conversao para um cliente par ticular. Quando um cliente invoca o mtodo de um bean stateless, as variveis do bea n podem conter um estado, mas somente para a durao da chamada. Ao terminar a execuo, o estado encerrado. Exceto durante a chamada do mtodo, todas as instncias de um b ean stateless so equivalentes, permitindo que o container EJB atribua uma instncia a qualquer cliente @PersistenceContext significa que esta varivel deve ser injetada com o EntityMana ger atravs do container web. O PersistenceContext um conjunto de objetos/entidades gerenciadas por um EntityM anager. Objetos que representam entidades sero recuperados, inseridos ou removido s de um banco de dados pelo EntityManager. Estas entidades estaro anexadas ao con texto de persistncia o qual ser fechado/removido quando o EntityManager for fechad o. Se o contexto for mantido ativo porm o objeto/entidade for desanexada do conte xto, ento esta entidade no mais ser gerenciado pelo EntityManager e modificaes na sua instncia no sero refletidos no banco de dados @TransactionAttribute (TransactionAttributeType.NEVER) Isto significa que o nosso mtodo no ir iniciar uma transao para instanciar as classes , pois no faz sentido j que estamos apenas retornando um objeto sem fazer qualquer alterao no banco de dados. Agora que voc j sabe como injetar EntityManager em nossos DAOs, vamos fazer uso de les em nossos EJB, segue abaixo um exemplo: @Local public interface TimesheetFacade { @PostConstruct public void initialize(); @TransactionAttribute(TransactionAttributeType.REQUIRED) public void persist(Timesheet Timesheet); } Veja que eu anotei a minha interface como @Local, mas voc poderia anotar com @Rem

ote pois esta classe pode ser usada por clientes externos, pois esta classe cont em toda a nossa lgica de negocio, validaes e controle das excees e no tem problema em disponibilizar ela fora do nosso container. Agora segue abaixo a nossa implement ao: @Stateless public class TimesheetFacadeImpl implements TimesheetFacade { @EJB RepositorySession repository; TimesheetRepository timesheetRepository; @PostConstruct public void initialize() { timesheetRepository = repository.getTimesheetRepository(); } @TransactionAttribute(TransactionAttributeType.REQUIRED) public void persist(Timesheet timesheet) { timesheetRepository.persist(timesheet); } } Precisamos prestar ateno para 3 anotaes: @EJB isso ir fazer como que a nossa varivel receba a nossa fbrica de DAOs @PostConstruct aqui criamos uma instncia para o nosso repositrio, no podemos coloca r isso no construtor da classe pois precisamos esperar a injeo da nossa fbrica. @TransactionAttribute(TransactionAttributeType.REQUIRED) Agora sim vamos usar um a transao, simples assim, nada de XML, apenas anotamos para que o container web sa iba que aqui ele precisa iniciar uma transao. Pronto, acabamos aqui, voc deve se perguntar: Cade a tal da validao, tratamento de exceo, lgica de negocio e etc? Pois bem... deixamos isso para o prximo artigo pois v amos descrever como voc deve usar os seus EJB, e como configurar a sua aplicao. Read more: http://www.linhadecodigo.com.br/artigo/1734/ejb3-dao.aspx#ixzz230xcGm Aj

Вам также может понравиться