Creato da pastuweb.com
Share My Page
My Social Accounts
Account FaceBook Account LinkedIn Account Twitter Account Google Plus Account Git Hub

In questo esempio vi mostrerò l'utilizzo di Spring e Hibernate per operare su un database MYSQL.

Esempio Spring e HibernateHo creato due cartelle sorgenti:

  • src
  • config

e diversi package all'interno di esse:

  • appuntivari.spring.x (per DTO, DAO e Test)
  • appuntivari.config.x (per i descrittori di configurazione sia di spring che di hibernate)
  1. Prima cosa creaiamo, in MySQL, il database "appunti" con le relative tabelle "autori", "notes" e "siti".
  2. Modifichiamo il file hibernate.properties.
  3. Creaiamo i DTO, cioè le classi che mapperanno le tre tabelle del database.
  4. Definiamo i descrittori per Hibernate (i files all'interno di appuntivari.config.hibernate)
  5. Scriviamo la logica, cioè il Service che andrà ad operare sul database
  6. Definiamo il descrittore Spring: spring_hibernate_config.xml

Infine scriviamo una Main class per testare il Service DAO.

Nota: quando uso Hibernate preferisco usare descrittori XML per descrivere il mappaggio dei DTO con le tabelle fisiche dela database. Ma volendo si possono anche usare le Annotazioni. Scegliete il metodo che preferite. Con l'XML rimane più ordinato.

 

 

 

hibernate.properties
In questo file definisco delle "costanti" usate poi nel descrittore di Spring: spring_hibernate_config.xml.
 
#hibernate properties
connection.driverClassName=com.mysql.jdbc.Driver
connection.username=root
connection.password=
connection.url=jdbc:mysql://localhost/appunti
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.transaction.factory_class=org.hibernate.transaction.JDBCTransactionFactory

 

DTO
Le classi mostrate qui sotto mappano le colonne/attributi delle tabelle fisiche. 
In più essendo un database relazionale, vengono usati come Foreign_Key delle istanze delle classi appropriate. Si veda la classe Autori con la proprietà "sito" che mappa la relazione id_sito di Autori con id_sito di Siti.
 
package appuntivari.spring.hibernate.dto;
 
import java.util.List;
 
public class Autori {
 
private Integer id_autore;
private String nome;
private String cognome;
private Siti sito;
private List<Notes> elencoNotesScritte;
 
public Integer getId_autore() {
return id_autore;
}
public void setId_autore(Integer id_autore) {
this.id_autore = id_autore;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
public List<Notes> getElencoNotesScritte() {
return elencoNotesScritte;
}
public void setElencoNotesScritte(List<Notes> elencoNotesScritte) {
this.elencoNotesScritte = elencoNotesScritte;
}
public Siti getSito() {
return sito;
}
public void setSito(Siti sito) {
this.sito = sito;
}
 
}

 

--------------------

 

package appuntivari.spring.hibernate.dto;
 
 
public class Notes{
 
private Integer id_note;
private String note;
private Autori autore;
 
public Integer getId_note() {
return id_note;
}
public void setId_note(Integer id_note) {
this.id_note = id_note;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public Autori getAutore() {
return autore;
}
public void setAutore(Autori autore) {
this.autore = autore;
}
 
}
 

--------------------

 

package appuntivari.spring.hibernate.dto;
 
public class Siti{
 
private Integer id_sito;
private String dominio;
private String tipologia;
 
public Integer getId_sito() {
return id_sito;
}
public void setId_sito(Integer id_sito) {
this.id_sito = id_sito;
}
public String getDominio() {
return dominio;
}
public void setDominio(String dominio) {
this.dominio = dominio;
}
public String getTipologia() {
return tipologia;
}
public void setTipologia(String tipologia) {
this.tipologia = tipologia;
}
 
}
 
Descrittori XML per Hibernate
Questi descrittori informano Spring su come mappare i DTO con le tabelle fisiche del database. Si poteve fare anche con le Annotazioni all'interno degli stessi DTO.
 
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="appuntivari.spring.hibernate.dto.Autori" table="autori" catalog="appunti">
<id name="id_autore" type="java.lang.Integer">
<column name="ID_AUTORE" />
<generator class="identity" />
</id>
<property name="nome" type="string">
<column name="NOME" length="40" not-null="true"/>
</property>
<property name="cognome" type="string">
<column name="COGNOME" length="256" not-null="true"/>
</property>
 
<many-to-one name="sito" class="appuntivari.spring.hibernate.dto.Siti" cascade="save-update">
            <column name="id_sito" not-null="true" />
        </many-to-one>
        
<bag name="elencoNotesScritte" table="notes" inverse="true" cascade="save-update,delete">      
            <key column="ID_NOTE" not-null="true" />                             
       <one-to-many class="appuntivari.spring.hibernate.dto.Notes" />
  </bag>   
</class>
 
</hibernate-mapping>

 

--------------------

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="appuntivari.spring.hibernate.dto.Notes" table="notes" catalog="appunti">
<id name="id_note" type="java.lang.Integer">
<column name="ID_NOTE" />
<generator class="identity" />
</id>
<property name="note" type="string">
<column name="NOTE" length="40" not-null="true"/>
</property>
 
<many-to-one name="autore" class="appuntivari.spring.hibernate.dto.Autori" cascade="save-update">
            <column name="id_autore" not-null="true" />
        </many-to-one>
        
</class>
 
</hibernate-mapping>
 
 

--------------------

 
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="appuntivari.spring.hibernate.dto.Siti" table="siti" catalog="appunti">
<id name="id_sito" type="java.lang.Integer">
<column name="ID_SITO" />
<generator class="identity" />
</id>
<property name="dominio" type="string">
<column name="DOMINIO" length="40" not-null="true"/>
</property>
<property name="tipologia" type="string">
<column name="TIPOLOGIA" length="256" not-null="true"/>
</property>
  
</class>
 
</hibernate-mapping>
 
 
Parte logica: ServiceImpl.java
Questa classe è la logica vera e propria del programma. Vengono definiti dei metodi di interrogazione sul database.
 
package appuntivari.spring.hibernate.dao;
 
 
import java.util.List;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.hibernate3.HibernateOperations;
 
import appuntivari.spring.hibernate.dto.Autori;
import appuntivari.spring.hibernate.dto.Notes;
import appuntivari.spring.hibernate.dto.Siti;
 
 
public class ServiceImpl implements Service{
 
public static Log log = LogFactory.getLog("Service");
protected HibernateOperations hibernateTemplate;
public HibernateOperations getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateOperations hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
 
@Override
public void createAutore(Autori autore) {
hibernateTemplate.saveOrUpdate(autore);
}
 
@Override
public void createSito(Siti sito) {
hibernateTemplate.save(sito);
}
 
@Override
public void createNote(Notes nota) {
hibernateTemplate.save(nota);
}
 
@SuppressWarnings("unchecked")
@Override
public List<Autori> elencoAutori() {
return (List<Autori>) hibernateTemplate.find("from Autori");
}
 
}
 
 
Parte Spring: spring_hibernate_config.xml
In questo file configuro Spring andando ad impostare il dataSource, il sessioneFactory con riferimento ad Hibernate al posto di JDBC. In più creo il bean "dbService" che mi servirà all'interno della classe TestVari.java nel metodo Main per richiamare i metodi ad-hoc di accesso al database, come: createAutore(), elencoAutori(), createSito() ecc.
 
<?xml version="1.0"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
       
      
      <bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:hibernate.properties" />
  <property name="placeholderPrefix" value="$HIBERNATE{" />
    </bean>
 
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="$HIBERNATE{connection.driverClassName}"/>
<property name="url" value="$HIBERNATE{connection.url}"/>
<property name="username" value="$HIBERNATE{connection.username}"/>
<property name="password" value="$HIBERNATE{connection.password}"/>
 </bean>
 
       
      <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     <property name="dataSource" ref="dataSource"/>
     <property name="mappingResources">
       <list>
         <value>appuntivari/config/hibernate/autori.hbm.xml</value>
        <value>appuntivari/config/hibernate/notes.hbm.xml</value>
        <value>appuntivari/config/hibernate/siti.hbm.xml</value>        
       </list>
     </property>
     <property name="hibernateProperties">
       <value>
         hibernate.dialect=$HIBERNATE{hibernate.dialect}
       </value>
     </property>
     </bean>
     
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
   </bean>
      
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
   </bean>   
      
    <bean id="dbServiceTarget" class="appuntivari.spring.hibernate.dao.ServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
    </bean>
                         
    <bean id="dbService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" ref="dbServiceTarget"/>
<property name="transactionAttributes">
 <props>
   <prop key="*">PROPAGATION_REQUIRED</prop>
 </props>
</property>
   </bean>
     
      
</beans>
 
Classe di Test: TestVari.java
 
package appuntivari.spring.hibernate.test;

import java.util.ArrayList;
import java.util.List;


import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import appuntivari.spring.hibernate.dao.Service;
import appuntivari.spring.hibernate.dto.Autori;
import appuntivari.spring.hibernate.dto.Notes;
import appuntivari.spring.hibernate.dto.Siti;

public class TestVari {

    
    public static void main(String[] args) {
        
        /* Carico il contesto di Spring */
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext(
                new String[]{
                "appuntivari/config/spring/spring_hibernate_config.xml"                
        });
        Service service = (Service) ctx.getBean("dbService");

        
/* TEST INSERIMENTO o AGGIORNAMENTO DI UN Autore E di un Sito */
        //Creo un Autore
        Autori autore = new Autori();
        autore.setId_autore(14); //se settato, createAutore() va in UPDATE
        autore.setNome("Francesco");
        autore.setCognome("Pasturenzi");
                
        
        //Creo un Sito
        Siti sito = new Siti();
        sito.setDominio("www.pastuweb.it");
        sito.setTipologia("personale");
        
        autore.setSito(sito);

        //INSERIMENTO DI TANTE Note associate allo stesso Autore
        List<Notes> listaNotes = new ArrayList<Notes>();
        Notes nota1 = new Notes();
        nota1.setNote("nota5");
        nota1.setAutore(autore);
        Notes nota2 = new Notes();
        nota2.setAutore(autore);
        nota2.setNote("nota6");
        listaNotes.add(nota1);
        listaNotes.add(nota2);
        
        autore.setElencoNotesScritte(listaNotes);
        service.createAutore(autore);
        
        System.out.println("Autore ISNERITO, Sito INSERITO, NOTES INSERITE");
        
/* TEST per Visualizzare TUTTI gli ID Autori */
        System.out.println("Elenco Autori:");
        List<Autori> elenco = (List<Autori>) service.elencoAutori();
        for (Autori item : elenco) {
            System.out.println("id_autore: "+item.getId_autore());
        }
        
    }
    
}
 
QUI potete scaricare i JARs usati all'interno del progetto. E' particolarmente importante antlr.jar perchè altrimenti non si riesce a collegare Hibernate al Database attraverso Spring.
 
You can find this project on my GitHub Repository at this repository URL: https://github.com/pastuweb/java-spring-examples/tree/master/EsempioSpringHibernate