Utilizzo combinato di Spring, Hibernate e EJB/JPA nel contesto enterprise Scritto da Douglas Oviche Venerdì 24 Febbraio 2012 17:37 Utilizzo combinato di Spring, Hibernate e EJB/JPA nel contesto enterprise {googleAds} // {/googleAds} L'articolo che state per consultare è il risultato di una estenuante ricerca di combinazione ed assemblaggio di specifiche e framework basate su tecnologia Java. Lo scopo di questa ricerca è stato realizzare un applicativo distribuito utilizzando le cutting edge technologies o tecnologie all'avanguardia. Quando si parla di tecnologie all'avanguardia nell'ambiente java, il pensiero ci porta immediatamente alle specifiche J2EE, ma soprattutto alle specifiche principali che ne fanno parte come EJB e JPA. Oltre a queste specifiche, ci sono delle piattaforme e framework che implementano meccanismi di iniezione DI e IOC con il supporto di sistemi e provider di persistenza che inizialmente possono risultare difficili da configurare per le nostre particolari esigenze, ma, nel corso dello sviluppo di un progetto di complessità media o alta, possono portare dei vantaggi significativi accelerando il rilascio dei diversi moduli architetturali che costituiscono il sistema. Personalmente mi sono sempre domandato come abbinare i framework spring, hibernate, jpa e gli enterprise java beans, affinché potessi ottenere il massimo da ognuna di queste tecnologie all'avanguardia. Ad esempio, mi sono chiesto come potevo fare per riuscire a fornire una totale configurazione dei miei componenti di servizio, persistenza (ecc...) tramite il framework spring e soprascrivere il meccanismo di iniezione svolto dagli intercettori forniti nella specifica EJB, permettendo a quelli di spring di subentrare in questo processo. Un'osservazione importante che riporto in questo articolo sono gli aspetti relativi alla normalizzazione delle banca dati: spesso ci imbattiamo nella progettazione di entità di persistenza in JPA, senza mai prendere in considerazione la normalizzazione presente nel sistema relazionale. Non bisogna mai dimenticare che tale normalizzazione deve essere estesa nel contesto applicativo, altrimenti commettiamo un gravissimo errore di progettazione. Dunque, l'intenzione dell'articolo è spiegare come avviene la progettazione di questo mix tecnologico tramite un pratico esempio applicativo che è possibile verificare scaricando il file compresso e provando voi stessi. Attualmente la soluzione è stata da me collaudata su glassfish, ma nulla impedisce la possibilità di schierare l'applicazione su JBoss od altri AS con supporto EJB container. Pre requisiti: Glassfish 3v Jdk 1.6 o + Hibernate 3 o + Springframework qualsiasi versione Specifiche J2EE (EJB 3.0, JPA 1.0/2.0) Struttura del progetto: 1/2 Utilizzo combinato di Spring, Hibernate e EJB/JPA nel contesto enterprise Scritto da Douglas Oviche Venerdì 24 Febbraio 2012 17:37 Intefaccia DAO: ClienteDAO findPagamentiByIdCliente(BigInteger {codecitation {=verrà style="brush: public Cliente java;"} findCliente(BigInteger package idCliente); com.soluzionijava.sample.dao; }ma {/codecitation} idCliente); public List public interface L'implementazione dell'interfaccia ClienteDAO: ClienteDAOImpl String em.createNamedQuery(namedQuery); (Cliente)query.getSingleResult(); return @Override {codecitation cliente; namedQuery public style="brush: implements …........... = Cliente "findClienteById"; }vincino findCliente(BigInteger ClienteDAO java;"} {/codecitation} }coinvolta package catch {bensì query.setParameter(1, (NoResultException @PersistenceContext com.soluzionijava.sample.dao; {id; idCliente) Query query {{/codecitation} e) = idCliente); {Cliente private cliente cliente EntityManager cliente = public null; = null; =classe class }nella l'utilizzo nostra effettuate Ci sono implementazione dell'annotazione degli tutte elementi le operazioni che DAO @PersistenceContext: spiccano d'accesso l'elemento all'interno al JPA dato EntityManager. come di tale questa ad annotazione esempio: implementazione, Tramite mette l'EntityManager adiscutiamoli disposizione uno di questi vengono èem; javax.persistence.Query query = em.createNamedQuery(namedQuery); createNamedQuery Viene trovato il}quelli Cliente ci permette per id tramite di effettuare JPA EntityManger l'esecuzione che di EJB a sua QL. volta attraverso ilapplicativo, metodo tecnologie. ossia non In questo si namedQuery sofferma particolare sui fornite esempio nell'entità di viene JPA, utilizzato ma nell'operazione, quello sulla progettazione per le invocazioni ma, di quest'insieme delle prototipo query nominate divengono Osserviamo un po' più da l'entità Cliente, entità principale nel nostro articolo: @Entity(name="Cliente") query="select java.io.Serializable nullable=false) clientiPagamenti; nome; odi @OneToMany(fetch=FetchType.EAGER, from private {particolari […] @Id }che @Table(name="clienti") o private cognome; where BigInteger o.id = @Column(name="NOME", ?") com.soluzionijava.sample.entity; public @NamedQuery(name="findClienteById", @Column(name="COGNOME", class mappedBy="cliente") Cliente implements nullable=false) private private Set campi(Field), presenti. frammento itale setters codice e di getters sopra sono riportato stati ci omessi, mostra l'entità devono Cliente essere con obbligatoriamente igli suoi diversi che •IlPer Prima ovunque osservazione: utilizzata @Entity(name="Cliente"). questa entità dovrà essere Questa chiamata dichiarazione con questo annotata nome. determina Seconda osservazione: @Table(name="clienti"). Correla ad una tabella relazionale. o where Terza o.id osservazione: ?"). @NamedQuery(name="findClienteById", ed associa all'entità una NAMED_QUERY. query="select o from Cliente relazionale. •Ilpersistence.xml Quarta osservazione: ogni singolo campo viene ad un campo di una tabella File di configurazione ORM: xml;"} FIELD {/codecitation} java Andando bean che avanti viene nel iniettato nostro mix da tecnologico, spring con l'implementazione arriviamo finalmente del nostro al servizio eintercezione cioè l'enterprise @Stateless(mappedName="ClienteService", @Interceptors(SpringBeanAutowiringInterceptor.class) ClienteServiceRemote, […] clienteDAO.findCliente(idCliente); findPagamentiByIdCliente(BigInteger clienteDAO.findPagamentiByIdCliente(idCliente); {codecitation @Override style="brush: ClienteServiceLocal Cliente java;"} findCliente(BigInteger }contesto package idCliente){ @Override {try name="ClienteService") com.soluzionijava.sample.service; @Autowired }associato public […] public idCliente) List }l'entità private class {questo ClienteService ClienteDAO return clienteDAO; implements volta questa affinché classe ci importanza sono due possa elementi essere di fondamentale capita esaustivamente. importanza, ma uno alla questo sovrascritti @Interceptors(SpringBeanAutowiringInterceptor.class). In questo articolo: componente con guardiamo avviene framework con lamanifestazioni attenzione vera spring manifestazione possiamo osservare di mischia che tecnologica intercettori promessa in possono @Autowired. Una volta essere che osservate spring èString subentrato le{/codecitation} sue nel meccanismo attraverso di iniezione, l'utilizzo lungo dell'annotazione ilDAO. corpo della configurazioni iniezione(DI/IOC). completare contestuali èDefinisce rendere finalmente mettono a possibile disposizione questo l'intero mix, meccanismo bisogna però di fornire le ed applicativo Una volta una che ise serie nostri di componenti file. java sono pronti per l'uso, portare nel contesto Di seguito vi elenco idel file mancanti che chiudono ilreturn puzzle: beanRefContext.xml xml;"} {/codecitation} usufruire Questo file dei definisce beans epublic pojo le factory definiti nel nel contesto business, business. in effetti viene usato dagli ejb per file soluzionijava-enterprise.xml {/codecitation} Il file soluzionijava-dao.xml {/codecitation} Per l'ultimo il file di persistenza: {codecitation style="brush: xml;"} org.hibernate.ejb.HibernatePersistence a.sample.entity.Cliente com.soluzionijav com.soluzionijava.sample.entity.RClientiPagamenti com.soluzionijava.sample.entity.Pagamento com.soluzionijava.sample.entity.RClientiPagamentiPK {/codecitation} Promemoria: occorrono Ricordate per di includere nel nelle contesto intestazioni applicativo dei file dicapacità configurazione dichiarate i èdiversi all'interno schemi deicollaudato che file. ed Prima attualmente diSorgente salutarvi esistono volevo dei ricordarvi progetti nei chequali questo èlestato mix già di tecnologie applicato. stato da me e Buon lavoro eportare al ([email protected]) prossimo articolo Douglas Oviche Scarica {jcomments on} 2/2