Vediamo ora come creare un ORM layer usando Hibernate 3 e JPA 2 (per la corretta comprensione di questa lezione, si suppone che il lettore abbia delle conoscenze di base riguardanti i data source e il funzionamento di Hibernate e JPA).
Supponiamo di avere un DB MySql installato sulla nostra macchina; per prima cosa definiamo nel nostro applicationContext.xml un data source che si collega al nostro db:
<!-- DATA SOURCE -->
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mrweb" />
<property name="username" value="mrweb" />
<property name="password" value="s3cret" />
</bean>
Una volta creato il data source creaiamo una persistence unit per JPA situata nel file META-INF/persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="pu" transaction-type="RESOURCE_LOCAL" />
</persistence>
A questo punto siamo pronti per integrare Hibernate e JPA insieme:
<!-- JPA E HIBERNATE -->
<bean id="jpaVendorAdapter"class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
</bean>
Fatto questo creaimo il nostro EntityManagerFactory che ci consentirà di iniettare nei nostri DAO l'EntityManger:
<!-- ENTITY MANAGER FACTORY -->
<bean id="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="persistenceUnitName" value="pu" />
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
</bean>
Creaiamo ora una Entity di esempio Car:
package it.mrwebmaster.hibernate;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PersistenceUnit;
@Entity
@PersistenceUnit(unitName="pu")
public class Car {
@Override
public String toString() {
return "Car [id=" + id + ", name=" + name + ", year=" + year + "]";
}
@Id
@GeneratedValue
private Integer id;
@Column
private String name;
@Column
private Date year;
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public Date getYear() {
return year;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setYear(Date year) {
this.year = year;
}
}
La nostra Entity ha solo tre colonne: Id, Name e Year, dove la colonna Id sarà la nostra Primary Key che verrà generata automaticamente da Hibernate. Avendo specificato nella nostra configurazione il parametro "ddl=true", Hibernate provvederà ad aggiornare le tabelle nel nostro DB in maniera automatica. L' uso della annotation @PersistenceUnit insieme a questa riga di configurazione nell'applicationContext.xml:
<!-- JPA ANNOTATION -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
consente di evitare di specificare, all'interno della Persistence Unit, l'elenco delle entity della nostra applicazione.