(http://sobrejava.
com/)
Java SE (http://sobrejava.com/categoria/java-se)
Ejemplo de DAO genrico con JPA
Java EE (http://sobrejava.com/categoria/java-ee)
Oracle (http://sobrejava.com/categoria/oracle)
(http://sobrejava.com/autor/carlos.quijano) Spring (http://sobrejava.com/categoria/spring) JPA (http://sobrejava.com/categoria/jpa)
JSF (http://sobrejava.com/categoria/jsf)
Publicado last month Por Carlos Quijano (http://sobrejava.com/autor/carlos.quijano) Android (http://sobrejava.com/categoria/android) Otros (http://sobrejava.com/categoria/otros)
Tw eet 0 19 1
Anuncios Google
Maven Java Java Build Java Spring Java plugin
Ejemplo de DAO genrico con JPA
En este ejemplo se muestra como utilizar el Patrn de DAO (http://www.oracle.com/technetwork/java/dataaccessobject-138824.html) utilizando JPA para crear un modelo de acceso datos genrico para la gestin de entidades de una manera centralizada y efectiva, para ello vamos a necesitar y realizar los siguientes
Pre-requisitos
1. Java 5 o superior 2. NetBeans IDE 7 o superior 3. Esquema de Base de Datos En este ejemplo se utiliza el esquema APP de Derby el cual ya esta integrado como servicio en NetBeans 7.
Pasos
1. Crear un proyecto utilizando NetBeans IDE y Apache Maven. 2. Crear una Interfase Base (BaseGenericDAO). 3. Crear una Implementacin Abstracta (AbstractBaseGenericDAOImpl) que implemente la interfase BaseGenericDAO. 4. Crear un DAO Concreto que extienda AbstractBaseDAOImpl para persistir una entidad Evento. 5. Crear una Unidad de Persistencia de pruebas y su respectiva Prueba Unitaria El cdigo fuente del proyecto puede ser explorado en el https://github.com/carlosquijano/genericdao (https://github.com/carlosquijano/generic-dao) y/o descargado directamente aqu https://github.com/carlosquijano/generic-dao/archive/master.zip (https://github.com/carlosquijano/generic-dao/archive/master.zip). 1. Crear un nuevo Proyecto con NetBeans y Maven En este ejemplo vamos a utilizar NetBeans 7.3 para crear un nuevo proyecto utilizando Maven para gestionar los perfiles y dependencias del proyecto, para iniciar seleccionamos la siguiente opcin de men
M e n u>F i l e>N e wP r o j e c t>M a v e n>J a v aA p p l i c a t i o n
Etiquetas
wlst (/tag/wlst/), weblogic
(/tag/weblogic/), web (/tag/web/), unity
(/tag/unity/), top (/tag/top/), social (/tag/social/), sha (/tag/sha/), rmi (/tag/rmi/), referencia (/tag/referencia/), redhat (/tag/redhat/),
oracle
(/tag/oracle/), maven (/tag/maven/),
login (/tag/login/), linux (/tag/linux/), libros (/tag/libros/), juegos (/tag/juegos/), jsf (/tag/jsf/), jrockit (/tag/jrockit/), jpa (/tag/jpa/),
jee
(/tag/jee/), jdeveloper (/tag/jdeveloper/),
jdbc (/tag/jdbc/), intro
(/tag/intro/), instalar
(/tag/instalar/), hash (/tag/hash/), facebook (/tag/facebook/), exceptions (/tag/exceptions/), ejb
(/tag/ejb/), eclipse-link (/tag/eclipse-link/), config
(/tag/config/), commons (/tag/commons/),
android (/tag/android/), (/tag/10g/),
11g (/tag/11g/), 10g
Popular
Ejemplo de DAO genrico con JPA (http://sobrejava. Top 5 Libros Sobre Java (http://sobrejava.com/articu Autenticacin a Facebook Utilizando Java (http://sob Top 5 Libreras y Componentes JSF (http://sobrejav Configurar JRockit como JVM Alternativa en Oracle L
En la pantalla de configuracin del proyecto ingresamos datos tales como nombre , ubicacin, arquetipo, grupo, versin y paquete del proyecto.
Utilizando el archivo POM vamos a importar las dependencias necesarias en un perfil que nos permita "cambiar" de implementaciones en algn momento dado, en este ejemplo vamos a utilizar JPA 2.1 con Eclipse Link 2.5, jUnit 4 y Apache Derby respectivamente, para ello utilizaremos un POM como el siguiente pom.xml
< p r o j e c tx m l n s = " h t t p : / / m a v e n . a p a c h e . o r g / P O M / 4 . 0 . 0 "x m l n s : x s i = " h t t p : / / w w w . w 3 . o r g / 2 0 0 1 / X M L S c h e m a i n s t a n c e "x s i : s c h e m a L o c a t i o n = " h t t p : / / m a v e n . a p a c h e . o r g / P O M / 4 . 0 . 0h t t p : / / m a v e n . a p a c h e . o r g / x s d / m a v e n 4 . 0 . 0 . x s d " > < m o d e l V e r s i o n > 4 . 0 . 0 < / m o d e l V e r s i o n > < g r o u p I d > c o m . s o b r e j a v a . j e e < / g r o u p I d > < a r t i f a c t I d > g e n e r i c d a o < / a r t i f a c t I d > < v e r s i o n > 1 . 0 S N A P S H O T < / v e r s i o n > < p a c k a g i n g > j a r < / p a c k a g i n g > < n a m e > G e n e r i c D A O < / n a m e > < u r l > h t t p : / / w w w . s o b r e j a v a . c o m / a r t i c u l o s / e j e m p l o d e d a o g e n e r i c o c o n j p a < / u r l > < p r o p e r t i e s > < p r o j e c t . b u i l d . s o u r c e E n c o d i n g > U T F 8 < / p r o j e c t . b u i l d . s o u r c e E n c o d i n g > < / p r o p e r t i e s > < p r o f i l e s > < p r o f i l e > < i d > j p a e c l i p s e l i n k < / i d > < d e p e n d e n c i e s > < d e p e n d e n c y > < g r o u p I d > o r g . e c l i p s e . p e r s i s t e n c e < / g r o u p I d > < a r t i f a c t I d > o r g . e c l i p s e . p e r s i s t e n c e . j p a < / a r t i f a c t I d > < v e r s i o n > 2 . 5 . 0 < / v e r s i o n > < / d e p e n d e n c y > < d e p e n d e n c y > < g r o u p I d > o r g . e c l i p s e . p e r s i s t e n c e < / g r o u p I d > < a r t i f a c t I d > j a v a x . p e r s i s t e n c e < / a r t i f a c t I d > < v e r s i o n > 2 . 1 . 0 < / v e r s i o n > < / d e p e n d e n c y > < / d e p e n d e n c i e s > < / p r o f i l e > < / p r o f i l e s > < d e p e n d e n c i e s > < d e p e n d e n c y > < g r o u p I d > j u n i t < / g r o u p I d > < a r t i f a c t I d > j u n i t < / a r t i f a c t I d > < v e r s i o n > 4 . 8 . 1 < / v e r s i o n > < s c o p e > t e s t < / s c o p e > < / d e p e n d e n c y > < d e p e n d e n c y > < g r o u p I d > o r g . a p a c h e . d e r b y < / g r o u p I d > < a r t i f a c t I d > d e r b y c l i e n t < / a r t i f a c t I d > < v e r s i o n > 1 0 . 1 0 . 1 . 1 < / v e r s i o n > < s c o p e > t e s t < / s c o p e > < / d e p e n d e n c y > < / d e p e n d e n c i e s > < / p r o j e c t >
Notar que el POM hace uso de perfiles, es decir, que las depedencias sern descargadas/utilizadas segn el perfil. Es posible crear otro perfil que utilize Hibernate por ejemplo. Ahora informamos a NetBeans IDE que utilize el perfil jpa-eclipselink , para ello es necesario seleccionarlo del menu contextual Set Configuration del proyecto (Click Derecho)
M e n uC o n t e x t u a lP r o y e c t o>S e tC o n f i g u r a t i o n>j p a e c l i p s e l i n k
2. Interfase Base Una vez configurado el proyecto, iniciaremos el desarrollo de la interfase BaseGenericDAO la cual se utilizara genricamente para las operaciones CRUD (Create, Update, Delete) de las entidades a persistir con JPA. BaseGenericDAO.java
p a c k a g ec o m . s o b r e j a v a . j a v a e e . d a o ; i m p o r tj a v a . i o . S e r i a l i z a b l e ; p u b l i ci n t e r f a c eB a s e G e n e r i c D A O < T ,Ke x t e n d sS e r i a l i z a b l e >{ Tc r e a t e ( Te n t i t y ) ; Tu p d a t e ( Te n t i t y ) ; v o i dd e l e t e ( Te n t i t y ) ; Tf i n d B y I d ( Kk e y ) ; }
Notar que la interfase hace uso de tipos genricos <T, K> , donde "T" representa la entidad a persistir y "K" el tipo de la llave primaria de la entidad. De esta manera se "generaliza" el uso de la interfase para casi cualquier entidad. 3. Implementacin Abstracta Tomando en cuenta que BaseDAO es una interfase y que debe de ser implementada para darle funcionalidad, creamos una nueva clase abstracta AbstractBaseGenericDAOImpl que implemente los mtodos definidos en BaseDAO utilizando JPA como motor de persistencia. AbstractBaseGenericDAOImpl.java
p a c k a g ec o m . s o b r e j a v a . j a v a e e . d a o . j p a ; i m p o r tc o m . s o b r e j a v a . j a v a e e . d a o . B a s e G e n e r i c D A O ; i m p o r tj a v a . i o . S e r i a l i z a b l e ; i m p o r tj a v a . l a n g . r e f l e c t . P a r a m e t e r i z e d T y p e ; i m p o r tj a v a x . p e r s i s t e n c e . E n t i t y M a n a g e r ; i m p o r tj a v a x . p e r s i s t e n c e . P e r s i s t e n c e C o n t e x t ; p u b l i ca b s t r a c tc l a s sA b s t r a c t B a s e G e n e r i c D A O I m p l < T ,Ke x t e n d sS e r i a l i z a b l e >i m p l e m e n t sB a s e G e n e r i c D A O < T ,K >{ @ P e r s i s t e n c e C o n t e x t p r o t e c t e dE n t i t y M a n a g e re m ; p r o t e c t e dC l a s s < T >c l a s s T y p e ; p u b l i cA b s t r a c t B a s e G e n e r i c D A O I m p l ( ){ s u p e r ( ) ; t h i s . c l a s s T y p e=( C l a s s < T > ) g e t P a r a m e t e r C l a s s ( g e t C l a s s ( ) ,0 ) ; } @ O v e r r i d e p u b l i cTc r e a t e ( Te n t i t y ){ t h i s . e m . p e r s i s t ( e n t i t y ) ; r e t u r ne n t i t y ; } @ O v e r r i d e p u b l i cTu p d a t e ( Te n t i t y ){ r e t u r nt h i s . e m . m e r g e ( e n t i t y ) ; } @ O v e r r i d e p u b l i cv o i dd e l e t e ( Te n t i t y ){ t h i s . e m . r e m o v e ( e n t i t y ) ; } @ O v e r r i d e p u b l i cTf i n d B y I d ( Kk e y ){ r e t u r nt h i s . e m . f i n d ( c l a s s T y p e ,k e y ) ; } p r i v a t es t a t i cC l a s s < ? >g e t P a r a m e t e r C l a s s ( C l a s s < ? >c l a z z ,i n ti n d e x ){ r e t u r n( C l a s s < ? > ) ( ( ( P a r a m e t e r i z e d T y p e ) c l a z z . g e t G e n e r i c S u p e r c l a s s ( ) ) . g e t A c t u a l T y p e A r g u m e n t s ( ) [ i n d e x ] ) ; } }
Lo nico especial a notar en la clase AbstractBaseGenericDAOImpl es el uso del mtodo privado getParameterClass el cual se utiliza para obtener el tipo de objeto de la clase parametrizada K. 4. DAO Concreto Una vez definida la clase abstracta AbstractBaseGenericDAOImpl es necesario extenderla en un DAO Concreto es decir en un DAO con sentido ya orientado a una entidad en especfico, en este ejemplo, vamos a crear un DAO que persista una entidad Evento la cual es la representacin de una tabla APP.EVENTS en el esquema APP del Derby integrado de NetBeans. Evento.java
p a c k a g ec o m . s o b r e j a v a . j a v a e e . e v e n t o s . m o d e l ; i m p o r tj a v a . i o . S e r i a l i z a b l e ; i m p o r tj a v a . s q l . T i m e s t a m p ; i m p o r tj a v a x . p e r s i s t e n c e . C o l u m n ; i m p o r tj a v a x . p e r s i s t e n c e . E n t i t y ; i m p o r tj a v a x . p e r s i s t e n c e . G e n e r a t e d V a l u e ; i m p o r tj a v a x . p e r s i s t e n c e . G e n e r a t i o n T y p e ;
i m p o r tj a v a x . p e r s i s t e n c e . I d ; i m p o r tj a v a x . p e r s i s t e n c e . T a b l e ; @ E n t i t y @ T a b l e ( n a m e=" E V E N T S " ) p u b l i cc l a s sE v e n t oi m p l e m e n t sS e r i a l i z a b l e{ p u b l i cs t a t i cf i n a lS t r i n gS E V E R I D A D _ I N F O=" I N F O " ; p u b l i cs t a t i cf i n a lS t r i n gS E V E R I D A D _ E R R O R=" E R R O R " ; p u b l i cs t a t i cf i n a lS t r i n gS E V E R I D A D _ D E B U G=" D E B U G " ; p u b l i cs t a t i cf i n a lS t r i n gS E V E R I D A D _ F A T A L=" F A T A L " ; @ I d @ C o l u m n ( n a m e=" E V E N T _ I D " ) @ G e n e r a t e d V a l u e ( s t r a t e g y=G e n e r a t i o n T y p e . I D E N T I T Y ) p r i v a t eL o n ge v e n t o I d ; @ C o l u m n ( n a m e=" S E V E R I T Y " ,l e n g t h=3 2 ) p r i v a t eS t r i n gs e v e r i d a d ; @ C o l u m n ( n a m e=" M E S S A G E " ,l e n g t h=5 1 2 ) p r i v a t eS t r i n gm e n s a j e ; @ C o l u m n ( n a m e=" S T A M P " ) p r i v a t eT i m e s t a m pf e c h a ; p u b l i cL o n gg e t E v e n t o I d ( ){ r e t u r ne v e n t o I d ; } p u b l i cv o i ds e t E v e n t o I d ( L o n ge v e n t o I d ){ t h i s . e v e n t o I d=e v e n t o I d ; } p u b l i cS t r i n gg e t S e v e r i d a d ( ){ r e t u r ns e v e r i d a d ; } p u b l i cv o i ds e t S e v e r i d a d ( S t r i n gs e v e r i d a d ){ t h i s . s e v e r i d a d=s e v e r i d a d ; } p u b l i cS t r i n gg e t M e n s a j e ( ){ r e t u r nm e n s a j e ; } p u b l i cv o i ds e t M e n s a j e ( S t r i n gm e n s a j e ){ t h i s . m e n s a j e=m e n s a j e ; } p u b l i cT i m e s t a m pg e t F e c h a ( ){ r e t u r nf e c h a ; } p u b l i cv o i ds e t F e c h a ( T i m e s t a m pf e c h a ){ t h i s . f e c h a=f e c h a ; } }
EventoDAO.java
p a c k a g ec o m . s o b r e j a v a . j a v a e e . e v e n t o s . d a o ; i m p o r tc o m . s o b r e j a v a . j a v a e e . d a o . B a s e G e n e r i c D A O ; i m p o r tc o m . s o b r e j a v a . j a v a e e . e v e n t o s . m o d e l . E v e n t o ; p u b l i ci n t e r f a c eE v e n t o D a oe x t e n d sB a s e G e n e r i c D A O < E v e n t o ,L o n g >{ }
EventoDAOImpl.java
p a c k a g ec o m . s o b r e j a v a . j a v a e e . e v e n t o s . d a o . j p a ; i m p o r tc o m . s o b r e j a v a . j a v a e e . d a o . j p a . A b s t r a c t B a s e G e n e r i c D A O I m p l ; i m p o r tc o m . s o b r e j a v a . j a v a e e . e v e n t o s . d a o . E v e n t o D a o ; i m p o r tc o m . s o b r e j a v a . j a v a e e . e v e n t o s . m o d e l . E v e n t o ; p u b l i cc l a s sE v e n t o D a o I m p le x t e n d sA b s t r a c t B a s e G e n e r i c D A O I m p l < E v e n t o ,L o n g >i m p l e m e n t sE v e n t o D a o { }
Notar que la interfase EventoDAO extiende a BaseGenericDAO tipificandola con la entidad Evento y Long, es decir, es un DAO concreto para la entidad Evento y su llave primaria del tipo Long. Asimismo la implementacin JPA de dicha interfase EventoDAOImpl extiende a AbstractBaseGenericDAOImpl la cual hereda su funcionalidad. 5. Unidad de Persistencia y Prueba Unitaria Finalmente vamos a crear una unidad de persistencia (Persistence Unit) de pruebas y una prueba unitaria con jUnit para probar el EventoDAO. META-INF/persistence.xml
< ? x m lv e r s i o n = " 1 . 0 "e n c o d i n g = " U T F 8 " ? > < p e r s i s t e n c ev e r s i o n = " 2 . 1 "x m l n s = " h t t p : / / x m l n s . j c p . o r g / x m l / n s / p e r s i s t e n c e "x m l n s : x s i = " h t t p : / / w w w . w 3 . o r g / 2 0 0 1 / X M L S c h e m a i n s t a n c e "x s i : s c h e m a L o c a t i o n = " h t t p : / / x m l n s . j c p . o r g / x m l / n s / p e r s i s t e n c eh t t p : / / x m l n s . j c p . o r g / x m l / n s / p e r s i s t e n c e / p e r s i s t e n c e _ 2 _ 1 . x s d " > < p e r s i s t e n c e u n i tn a m e = " p u g e n e r i c d a o t e s t "t r a n s a c t i o n t y p e = " R E S O U R C E _ L O C A L " > < p r o v i d e r > o r g . e c l i p s e . p e r s i s t e n c e . j p a . P e r s i s t e n c e P r o v i d e r < / p r o v i d e r > < c l a s s > c o m . s o b r e j a v a . j a v a e e . e v e n t o s . m o d e l . E v e n t o < / c l a s s > < p r o p e r t i e s > < p r o p e r t yn a m e = " j a v a x . p e r s i s t e n c e . j d b c . u r l "v a l u e = " j d b c : d e r b y : / / l o c a l h o s t : 1 5 2 7 / s a m p l e " / > < p r o p e r t yn a m e = " j a v a x . p e r s i s t e n c e . j d b c . p a s s w o r d "v a l u e = " a p p " / > < p r o p e r t yn a m e = " j a v a x . p e r s i s t e n c e . j d b c . d r i v e r "v a l u e = " o r g . a p a c h e . d e r b y . j d b c . C l i e n t D r i v e r " / > < p r o p e r t yn a m e = " j a v a x . p e r s i s t e n c e . j d b c . u s e r "v a l u e = " a p p " / > < p r o p e r t yn a m e = " e c l i p s e l i n k . d d l g e n e r a t i o n "v a l u e = " c r e a t e t a b l e s " / > < / p r o p e r t i e s > < / p e r s i s t e n c e u n i t > < / p e r s i s t e n c e >
EventoDAOTest.java
p a c k a g ec o m . s o b r e j a v a . d a o ; i m p o r tc o m . s o b r e j a v a . j a v a e e . e v e n t o s . m o d e l . E v e n t o ; i m p o r tj a v a . s q l . T i m e s t a m p ; i m p o r tj a v a x . p e r s i s t e n c e . E n t i t y M a n a g e r ; i m p o r tj a v a x . p e r s i s t e n c e . E n t i t y M a n a g e r F a c t o r y ; i m p o r tj a v a x . p e r s i s t e n c e . E n t i t y T r a n s a c t i o n ; i m p o r tj a v a x . p e r s i s t e n c e . P e r s i s t e n c e ; i m p o r to r g . j u n i t . A f t e r ; i m p o r to r g . j u n i t . A s s e r t ; i m p o r to r g . j u n i t . B e f o r e ; i m p o r to r g . j u n i t . T e s t ; p u b l i cc l a s sE v e n t o D a o T e s t{ S t r i n gp u=" p u g e n e r i c d a o t e s t " ; E n t i t y M a n a g e re m ; E n t i t y M a n a g e r F a c t o r ye m f ; @ B e f o r e p u b l i cv o i db e f o r e ( ){ t h i s . e m f=P e r s i s t e n c e . c r e a t e E n t i t y M a n a g e r F a c t o r y ( p u ) ; t h i s . e m=e m f . c r e a t e E n t i t y M a n a g e r ( ) ; } @ T e s t p u b l i cv o i dt e s t S a v e E v e n t s ( ){ A s s e r t . a s s e r t N o t N u l l ( e m ) ; T i m e s t a m ps t a m p ; E n t i t y T r a n s a c t i o nt r x=n u l l ; t r y{ t r x=e m . g e t T r a n s a c t i o n ( ) ; s t a m p=n e wT i m e s t a m p ( S y s t e m . c u r r e n t T i m e M i l l i s ( ) ) ; E v e n t oe v e n t o=n e wE v e n t o ( ) ; e v e n t o . s e t F e c h a ( s t a m p ) ; e v e n t o . s e t M e n s a j e ( " E s t ee su nm e n s a j eg e n e r a d oe n"+s t a m p ) ; e v e n t o . s e t S e v e r i d a d ( E v e n t o . S E V E R I D A D _ I N F O ) ; t r x . b e g i n ( ) ; e m . p e r s i s t ( e v e n t o ) ; t r x . c o m m i t ( ) ; }c a t c h( R u n t i m e E x c e p t i o ne ){ i f( t r x! =n u l l& &t r x . i s A c t i v e ( ) ){ t r x . r o l l b a c k ( ) ; } } } @ A f t e r p u b l i cv o i da f t e r ( ){ e m . c l o s e ( ) ; e m f . c l o s e ( ) ; } }
Notar que es antes de ejecutar la prueba unitaria es necesario iniciar la base de datos Al ejecutar la prueba unitaria, de no existir problemas se puede observar algo similar a lo siguiente: APP.EVENTS
Conclusiones
Con la estrategia anterior es posible generar un DAO para cada entidad, prcticamente copiando y pegando las 3 clases anteriores (Evento, EventoDAO, EventoDAOImpl) y aunque exista cierto grado de trabajo, el nivel de flexibilidad que se obtiene es de gran escala, ya que podemos extender e implementar ms mtodos tales como count, findAll, findBy, etc. utilizando las mismas clases dependiendo de la necesidad de una manera simple, elegante y fcil de entender.
Referencias
1. Core J2EE Patterns - Data Access Object http://www.oracle.com/technetwork/java/dataaccessobject-138824.html (http://www.oracle.com/technetwork/java/dataaccessobject-138824.html)
Tags
jee (/tag/jee) jpa (/tag/jpa) eclipse-link (/tag/eclipse-link)
Anuncios Google
Java plugin
Java JPA
Java IDE
Java Jquery
0 comentarios Deja un comentario...
Mejor Comunidad Compartir
Nadie ha comentado an.
C a n a l d e co m e n ta ri o s
Su s crb e te p o r e -m a i l
Inicio (http://sobrejava.com/) Acerca de (http://sobrejava.com/acerca-de) Contacto (http://sobrejava.com/contacto) Copyright 2013 SobreJava.com. Carlos Quijano. Todos los derechos reservados. Marcas Registradas como Java y Oracle son propiedad de Oracle Corportation y/o sus respectivos propietarios intelectuales.