Está en la página 1de 9

Spring,JPA,

Hibernate y

Annotations

Continuandoconlaseriedeartculosqueestoyhaciendosobrepersistenciaen
JavaconSpringyunXMLmnimo,primerofueSpringJDBC,luegoSpringy
Mybatis,despusSpringeHibernateyestavezyparacerrarelcrculolehatocadoel
crculoaJPA.ParalosquenolohayaisusadonuncaJPAesunacapaqueaislala
persistenciadelORMqueestemosutilizando,detalmaneraquesiundacambiamos
deORMconcambiarlaconfiguracinserasuficienteynoharafaltatocarelcdigo
delacapadepersistencia,uncoceptoparecidoalqueimplementaHibernateconlos
lenguajesdelasdiferentesbasesdedatos.TieneunlenguajeobjetorelacionalelJPL
(primohermanodelHQL,yoalmenosnohevistodiferenciasdemasiadograndes)y
sepuedenmapearlastablasutilizandoannotationsenlospropiosbeans.Dehecho,en
elartculodeHibernatecomentqueutilizabalasannotationsdeJPAque
implementaHibernate.Comoenloscasosanterioresircomentandoelcdigosobre
lamarcha.

Contodoloquehecontadohayunapalabradelttuloquenosesabededondesale
Hibernate,biencomoyahedajadocaervoyautilizarHibernatecomoORM,pero
comoverisnovoyautilizarcdigopropiodeHibernatesinoquevoyadejarqueJPA
logenereporm.Comosonmuchascosasvoyairpasoapaso.

1)Creamoslosbeansconlosmapeos.Voyautilizarelejemplodelinstitutoaligual
queenlosotroscasoymostrarelcdigodelaclaseAlumno,laclaseAsignaturasera
igualperoensentidocontrario

packageorg.junit.spring.jpa.beans;

importjava.io.Serializable;
importjava.util.List;

importjavax.persistence.CascadeType;
importjavax.persistence.Column;
importjavax.persistence.Entity;
importjavax.persistence.Id;
importjavax.persistence.JoinColumn;
importjavax.persistence.JoinTable;
importjavax.persistence.ManyToMany;
importjavax.persistence.Table;
importjavax.persistence.UniqueConstraint;

@Entity
@Table(name="alumnos",catalog="instituto",uniqueConstraints={
@UniqueConstraint(columnNames="DNI")
})
publicclassAlumnoimplementsSerializable{

privatestaticfinallongserialVersionUID=1390200186873133294L;

privateStringdni;
privateStringnombre;
privateStringapellidos;
privateStringdireccion;
privateList<Asignatura>asignaturas;

publicAlumno(){

}

@Id
@Column(name="DNI",unique=true,nullable=false)
publicStringgetDni(){
returndni;
}
publicvoidsetDni(Stringdni){
this.dni=dni;
}
@Column(name="NOMBRE",unique=true,nullable=false)
publicStringgetNombre(){
returnnombre;
}
publicvoidsetNombre(Stringnombre){
this.nombre=nombre;
}
@Column(name="APELLIDOS",unique=true,nullable=false)
publicStringgetApellidos(){
returnapellidos;
}
publicvoidsetApellidos(Stringapellidos){
this.apellidos=apellidos;
}
@Column(name="DIRECCION",unique=true,nullable=false)
publicStringgetDireccion(){
returndireccion;
}
publicvoidsetDireccion(Stringdireccion){
this.direccion=direccion;
}
@ManyToMany(
targetEntity=Asignatura.class,
cascade={CascadeType.PERSIST,CascadeType.MERGE}
)
@JoinTable(
name="ALUMNOS_ASIGNATURAS",
joinColumns=@JoinColumn(name="DNI"),
inverseJoinColumns=@JoinColumn(name="ID")
)
publicList<Asignatura>getAsignaturas(){
returnasignaturas;
}
publicvoidsetAsignaturas(List<Asignatura>asignaturas){
this.asignaturas=asignaturas;
}



Alumno.javahosted with byGitHub view raw

ElbeanesexctamenteidnticoalquehicimosenelcasodeSpring+Hibernate.
Simplementecomentarquemapeamoscadacolumnadelatablaconcadapropieadad
yquemapeamoslarelacinM:Nentealumnosyasignaturas.2)Programamosla
interfazdelDAOparalosalumnos
packageorg.junit.spring.jpa.dao;

importjava.util.List;

importorg.junit.spring.jpa.beans.Alumno;
publicinterfaceIAlumnoDao{

publicList<Alumno>getAlumnos();
publicvoidaddAlumno(Alumnoalumno);
publicAlumnogetAlumno(Stringdni);

IAlumnoDao.javahosted with byGitHub view raw

Estainterfazesigualparatodoslosejemplosysimplementecontieneladefinicinde
lasoperacionesarealizarsobrelosalumnos.

3)ImplementamoslainterfazIAlumnoDao

packageorg.junit.spring.jpa.dao.impl;

importjava.util.List;

importjavax.persistence.EntityManager;
importjavax.persistence.PersistenceContext;
importjavax.persistence.Query;

importorg.junit.spring.jpa.beans.Alumno;
importorg.junit.spring.jpa.dao.IAlumnoDao;
importorg.springframework.stereotype.Repository;

@Repository
publicclassAlumnoDaoimplementsIAlumnoDao{

@PersistenceContext
privateEntityManagerentityManager;

publicList<Alumno>getAlumnos(){
//TODOAutogeneratedmethodstub
Queryquery=this.entityManager.createQuery("fromAlumno");
returnquery.getResultList();
}


publicvoidaddAlumno(Alumnoalumno){
//TODOAutogeneratedmethodstub
this.entityManager.persist(alumno);
this.entityManager.flush();
//entityManager.removeparaborrar
//entityManager.mergeparaupdate

}

publicAlumnogetAlumno(Stringdni){

Alumnoalumno=null;
Queryquery=this.entityManager.createQuery("fromAlumnowheredni=:dni");
query.setParameter("dni",dni);
List<Alumno>alumnos=query.getResultList();
if(alumnos!=null&&alumnos.size()>0){
alumno=alumnos.get(0);
}
returnalumno;

}

AlumnoDao.javahosted with byGitHub view raw

Comosiempreutilizamoslaannotation@RepositoryparaindicarleaSpringquees
unaclaseDAO,yenestecasoutilizamoslaannotation@PersistenceContextpara
inyectarelobjetoEntityManagerqueeselquenospermitelanzarquerysenJPL.Esta
annotationslovaleparaJPA.

4)Implementamoslainterfazconlasoperacionesdelalgicadenegocio

packageorg.junit.spring.jpa.facade;

importjava.util.List;

importorg.junit.spring.jpa.beans.Alumno;

publicinterfaceIFacade{

publicList<Alumno>obtenerTodosAlumnos();
publicvoidinsertarAlumno(Alumnoalumno);
publicAlumnoobtenerAlumno(Stringdni);
}

IFacade.javahosted with byGitHub view raw

Estainterfazescomnalrestodelosejemplosytampocohacequelaexpliquemucho
asqeunomeenrollo.

5)ImplementamoslainterfazIFacade

packageorg.junit.spring.jpa.facade.impl;

importjava.util.List;

importorg.junit.spring.jpa.beans.Alumno;
importorg.junit.spring.jpa.dao.IAlumnoDao;
importorg.junit.spring.jpa.facade.IFacade;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
importorg.springframework.transaction.annotation.Isolation;
importorg.springframework.transaction.annotation.Propagation;
importorg.springframework.transaction.annotation.Transactional;

@Service
publicclassFacadeimplementsIFacade{

@Autowired
privateIAlumnoDaoalumnoDao;

publicList<Alumno>obtenerTodosAlumnos(){
//TODOAutogeneratedmethodstub
returnthis.alumnoDao.getAlumnos();
}

@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_UNCOMMITTED)
publicvoidinsertarAlumno(Alumnoalumno){
//TODOAutogeneratedmethodstub
this.alumnoDao.addAlumno(alumno);

}


publicAlumnoobtenerAlumno(Stringdni){
//TODOAutogeneratedmethodstub
returnthis.alumnoDao.getAlumno(dni);
}

Facade.javahosted with byGitHub view raw

Utilizamoslaannotation@Serviceparaindicarqueesunbeanquetienequemanejar
Springylaannotation@AutowiredparainyectarlaclaseDAO,ycomonola
annotation@Transactionparamarcarlastransaccionesdemaneradeclarativa.6)
Creamoselficheropersistence.xmltpicodeJPA.YohecreadounacarpetaMETA
INFbajolacarpetasource,peroestearchivopodrairencualquierlado.
<persistencexmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_
<persistenceunitname="MyPersistenceUnit"transactiontype="RESOURCE_LOCAL">
<properties>
<propertyname="hibernate.hbm2ddl.auto"value="update"/>
<propertyname="hibernate.archive.autodetection"value="class,hbm"/>
<propertyname="hibernate.c3p0.min_size"value="5"/>
<propertyname="hibernate.c3p0.max_size"value="20"/>
<propertyname="hibernate.c3p0.timeout"value="300"/>
<propertyname="hibernate.c3p0.max_statements"value="50"/>
<propertyname="hibernate.c3p0.idle_test_period"value="3000"/>
</properties>
</persistenceunit>
</persistence>

persistence.xmlhosted with byGitHub view raw

Enestearchivoindicamosqueelrecursoeslocal,vamosqueseencuentraenlapropia
mquinayleponemosunnombrealaunidaddepersistencia.Estearchivotambin
nosvaleparaconfigurarlaspropiedadesdelORMennuestrocasoHibernate.

7)ArchivodeconfiguracindeSpring

<?xmlversion="1.0"encoding="UTF8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/springbeans3.
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/springcontex

<context:componentscanbasepackage="org.junit"/>
<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroymethod="close">
<propertyname="driverClassName"value="${jdbc.driverClassName}"/>
<propertyname="url"value="${jdbc.url}"/>
<propertyname="username"value="${jdbc.username}"/>
<propertyname="password"value="${jdbc.password}"/>
</bean>
<context:propertyplaceholderlocation="org/junit/spring/jpa/resources/jdbc.properties"/>
<beanid="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryB
<propertyname="persistenceXmlLocation"value="classpath:METAINF/persistence.xml"/>
<propertyname="persistenceUnitName"value="MyPersistenceUnit"/>
<propertyname="dataSource"ref="dataSource"/>
<propertyname="jpaVendorAdapter">
<beanclass="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<propertyname="showSql"value="false"/>
<propertyname="generateDdl"value="true"/>
<propertyname="databasePlatform"value="org.hibernate.dialect.MySQLDialect"/>
</bean>
</property>
</bean>
<beanid="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager">
<propertyname="entityManagerFactory"ref="entityManagerFactory"/>
<propertyname="dataSource"ref="dataSource"/>
</bean>
</beans>

applicationContext.xmlhosted with byGitHub view raw

EnestearchivosedefinenelDataSourcecomoenlosotroscasos,la
EntityManagerFactoryalaqueseleinyectanlaURLdenuestroficherode
persistencia,elnombredelaunidaddepersistenciaylosdatosasociadosanuestro
ORM.Porltimoconfiguramoseltransactionmanager.

Yestoestodoamigosasconseguimosunacapadenegociocon2xmlquenosonmuy
largosyquenohabrquetocarmientrasnocambiemoselORM,elrestodelcdigoes
programablemedianteannotations.Laverdadesquemehequedadoimpresionado
conelresultado,lasolucineslimpiayacabacontodoloquenomegustabade
Spring.Laverdadesqueparaproyectosgrandeslautilizarasindudar.

Osdejounalistadelinksquemehanresultadotilespararealizaresteartculo