Utilizzo combinato di Spring, Hibernate e EJB/JPA

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