4 Hibernate3 Esempio hello world

Transcript

4 Hibernate3 Esempio hello world
Hibernate
esempio “hello world”
Dott. Doria Mauro
[email protected]
[email protected]
Esempio: Hello World
2
Presentiamo un primo esempio che consente
di gestire un messaggio di testo.
Lo scopo è quello di storare il messaggio
“hello world” sul db per poi recuperarlo e
quindi modificarlo.
[email protected]
Esempio: Hello World
Si crea un nuovo progetto Java stand-alone.
Le librerie di base da importare sono:
–
–
–
–
–
–
–
–
3
–
asm.jar
log4j.jar
cglib.jar
commons-collections.jar
commons-logging.jar
dom4j.jar
hibernate3.jar
mysql-connector-java-5.1.7-bin (per MySQL)
jta.jar
[email protected]
Il file xml di configurazione
4
Il file di configurazione generale si presenta in questa forma:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!– Configura connessione e dialetto -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/helloWorld</property>
<property name="hibernate.connection.username“>root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!– Stampa SQL sulla console-->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
<!-- Lista dei file xml di mapping-->
<mapping resource="hello/Message.hbm.xml"/>
</session-factory>
</hibernate-configuration>
[email protected]
Esempio: Hello World
Consideriamo la seguente classe:
Identificativo univoco
package hello;
public class Message {
private Long id;
private String text;
private Message nextMessage;
private Message() {}
5
public Message(String text) {
this.text = text;
}
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public String getText() {
return text;
Messaggio di testo
Riferimento al succ. messaggio
}
public void setText(String text) {
this.text = text;
}
public Message getNextMessage() {
return nextMessage;
}
public void setNextMessage(Message nextMessage) {
this.nextMessage = nextMessage;
}
}
[email protected]
Esempio: Hello World
Cosa notiamo dalla classe precedente?
–
La classe Message segue le specifiche java-Beans:.
La classe Message possidere i metodi get/set e un costruttore a
zero parametri.
6
–
La classe Message non fa nessun riferimento al framework
Hibernate, pertanto è un POJO (Esattamente il contrario degli EJB
2.1 il cui codice si può utilizzare solo sulla piattaforma EJB).
–
La classe Message possiede una attributo speciale che identifica gli
oggetti come univoci al pari di una chiave primaria: se due oggetti
hanno valori diversi per l’attributo id, allora corrisponderanno a due
righe diverse sul DB.
[email protected]
Esempio: Hello World
Scriviamo una classe di prova per storare un messaggio con Hibernate:
public class ProvaWrite {
public static void main(String args[]) {
Interfaccia Session e
Transaction di Hibernate
SessionFactory sessionFactory = new
Configuration().configure().buildSessionFactory();
Session session =sessionFactory.getCurrentSession();
Transaction newTransaction = session.beginTransaction();
Message message = new Message("Hello World");
session.save(message);
newTransaction.commit();
sessionFactory.close(); } }
7
L’esecuzione produrrà del codice SQL simile a questo:
insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID)
values (1, 'Hello World', null)
Notare il progressivo
[email protected]
Esempio: Hello World
Scriviamo una classe di prova per recuperare messaggi con Hibernate:
Public classe ProvaWrite {
public static void main(String args[]) {
….
session = sessionFactory.getCurrentSession();
Transaction newTransaction = session.beginTransaction();
List messages = session.createQuery("from Message as m order by m.text asc").list();
System.out.println( messages.size() + " messaggio(i) trovato(i) " );
for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
Message message = (Message) iter.next();
System.out.println( message.getText() );
Hibernate query
}
newTransaction.commit();
sessionFactory.close();
}}
8
select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID
from MESSAGES m
order by m.MESSAGE_TEXT asc
[email protected]
Esempio: Hello World
Scriviamo il XML mapping document:
Mapping campo text
<?xml version="1.0"?>
<property
<!DOCTYPE hibernate-mapping PUBLIC
name="text"
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
column="MESSAGE_TEXT"/>
"http://hibernate.sourceforge.net/hibernate<many-to-one
mapping-3.0.dtd">
name="nextMessage"
<hibernate-mapping>
cascade="all"
<class
column="NEXT_MESSAGE_ID"/>
name="hello.Message"
</class>
table="MESSAGES">
</hibernate-mapping>
<id
name="id"
Associazione
Classe Message
column="MESSAGE_ID">
self molti-a-uno
<generator class="increment"/>
Tabella Messages
</id>
9
Mapping campo id
chiave primaria
Autoincremento
chiave
[email protected]
Esempio: Hello World
Scriviamo una classe di prova per gestire con Hibernate un oggetto
messaggio. In particolare vogliamo recuperare il testo associato al primo
messaggio, sostituirlo con un altro e inserire il messaggio successivo al
primo:
Sostituzione testo
10
Public classe ProvaWrite {
messaggio
public static void main(String args[]) {
….
session = sessionFactory.getCurrentSession();
newTransaction = session.beginTransaction();
// 1 è l'id del primo messaggio
message = (Message) session.get( Message.class, new Long(1) );
message.setText("funziona veramente!");
Message nextMessage = new Message("questo è un secondo messaggio");
message.setNextMessage( nextMessage );
newTransaction.commit();
sessionFactory.close();
Aggiunta messaggio
}
successivo
}
[email protected]
Esempio: Hello World
Il codice SQL autogenerato da Hibernate sarà simile a questo:
select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID
from MESSAGES m
Recupero primo
where m.MESSAGE_ID = 1
messaggio
insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID)
values (2, 'Take me to your leader (please)', null)
Inserimento nuovo messaggio con MESSAGE_ID progressivo
Modifica testo primo messaggio
11
Relazione molti-a-uno con il primo messaggio
update MESSAGES
set MESSAGE_TEXT = 'Greetings Earthling', NEXT_MESSAGE_ID = 2
where MESSAGE_ID = 1
[email protected]
Esempio: Hello World
12
In questo piccolo esempio possiamo notare alcune caratteristiche
di Hibernate:
–
automatic dirty checking: Update automatico del DB a fronte di
chiamate ai metodi set sull’oggetto
–
cascading save: Persistenza automatica di un oggetto collegato ad
un altro che si trova già nello stato di persistenza (non è necessario
chiamare il metodo save() sull’oggetto collegato)
–
transactional write-behind: autodeterminazione del miglior ordine
con cui eseguire le istruzioni SQL senza violare i vincoli sulle chiavi
esterne (vincoli di integrità referenziale)
NOTA: l’ordine con cui sono fatte le operazioni Java non è uguale all’ordine
con cui vengono eseguite le istruzioni SQL
[email protected]
Domande?
Hello world
Hello world
Hello world
Hello world
Hello world:
Hello world
Hello world
Hello world
13
Hello world