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