Il presente tutorial presuppone che siano stati seguiti prima i seguenti altri articoli nell’ordine indicato:

  1. Eclipse EMF: Progettare il Modello
  2. Eclipse EMF: un CRUD a costo zero

ed ha l’obiettivo di dimostrare come, con pochissime modifiche al codice generato da EMF, sia possibile ottenere la persistenza del solito modello usato nei tutorial precedenti su un database relazionale. Useremo MySQL come target database, quindi verificate di averlo a disposizione (in locale o in rete) e di potervi accedere (eventualmente potete scaricarlo all’indirizzo http://www.mysql.com/downloads/mysql). Assumeremo di usare il database schema “test” (precaricato vuoto durante l’installazione di MySQL), tuttavia potete usare uno schema diverso semplicemente modificando le proprietà di connessione al database.

Per poter seguire questo tutorial è necessario disporre di alcuni plugin aggiuntivi per Eclipse. In questa guida trovate tutti i dettagli su come aggiornare correttamente il vostro IDE:

Setup Teneo per Eclipse 4.2 ÔÇô Juno

Partiamo quindi dal punto in cui eravamo rimasti dall’ultimo tutorial e apriamo il file plugin.xml del plugin di editor generato in modo automatico da EMF (it.rcpvision.rcptutorial.model.editor).

Selezioniamo il tab Dependencies

e aggiungiamo le seguenti dipendenze (premendo il bottone Add… nella sezione Required Plug-ins):

  • org.eclipse.emf.teneo.hibernate
  • org.hibernate
  • com.mysql.jdbc

salviamo (Ctrl-S) e apriamo la classe LibraryEditorAdvisor.java, in corrispondenza del metodo initialize().

introducendo le seguenti modifiche:

innanzitutto marchiamo il metodo come @generated not, in modo tale che una eventuale successiva rigenerazione del codice (ad es. resa necessaria da una modifica del modello) non sovrascriva le modifiche che andremo ad apportare

e aggiugiamo il seguente blocco di codice dopo l’istruzione

configurer.setSaveAndRestore(true);

		//*************** Initialize Teneo Hibernate DataStore *************************************
		HbDataStore hbds = (HbDataStore) HbHelper.INSTANCE.createRegisterDataStore("MyDb");
		//Set Database properties
		Properties props = new Properties();
		props.setProperty(Environment.DRIVER, "com.mysql.jdbc.Driver");
		props.setProperty(Environment.URL, "jdbc:mysql://localhost:3306/test");
		props.setProperty(Environment.USER, "root");
		props.setProperty(Environment.PASS, "admin");
		props.setProperty(Environment.DIALECT,	org.hibernate.dialect.MySQL5Dialect.class.getName());
		props.setProperty(Environment.SHOW_SQL, "true");
		props.setProperty(Environment.HBM2DDL_AUTO, "update");
		// props.setProperty(Environment.HBM2DDL_AUTO, "create-drop");
		hbds.setDataStoreProperties(props);
		//Register EMF package
		hbds.setEPackages(new EPackage[] { LibraryPackage.eINSTANCE });
		hbds.initialize();

		//*************** Initialize Database Content Data *************************************
		// (the first time a new Library object container is persisted, otherwise it is loaded)
		String uriStr = "hibernate://?"+HibernateResource.DS_NAME_PARAM+"=MyDb";
		final URI uri = URI.createURI(uriStr);
		ResourceSet resourceSet = new ResourceSetImpl();
		Resource resource = resourceSet.createResource(uri);
		try {
			resource.load(null);
			if (resource.getContents().size() == 0) {
				resource.getContents().add(LibraryFactory.eINSTANCE.createLibrary());
				resource.save(null);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		//*************** Open an Editor instance *************************************
		//(avoiding the need of some "File, New..." explicit user operation)
		Display.getDefault().asyncExec(new Runnable() {
			@Override
			public void run() {
				try {
					PlatformUI
							.getWorkbench()
							.getActiveWorkbenchWindow()
							.getActivePage()
							.openEditor(new URIEditorInput(uri),
									"library.presentation.LibraryEditorID");
				} catch (PartInitException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});

Le import necessarie sono:

 

import java.util.Properties;
import java.io.IOException;
import library.LibraryFactory;
import library.LibraryPackage;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.teneo.hibernate.HbDataStore;
import org.eclipse.emf.teneo.hibernate.HbHelper;
import org.eclipse.emf.teneo.hibernate.resource.HibernateResource;
import org.hibernate.cfg.Environment;

 

Non entreremo nel dettaglio delle singole operazioni che esegue questa parte di codice (questo sarà eventualmente oggetto di altri articoli), ma ecco sintetizzate le azioni che vengono effettuate:

  • viene inizializzato l’Hibernate DataStore di Teneo indicando le coordinate del database (URL, credenziali, tipo, ecc…). Qui potreste ritenere opportuno modificare il parametro Environment.URL per farlo corrispondere al nome dello schema MySQL (nell’esempio “test“) che intendete utilizzare, mentre dovete assicurarvi che le credenziali (USER e PASS) per l’accesso al database siano le quelle giuste per voi.
    Il parametro HBM2DDL_AUTO impostato al valore “update” permette al database di “adattarsi” (per quanto possibile attraverso opportune istruzioni SQL di ALTER TABLE automatiche) all’evoluzione del modello. Un valore di “create-drop” invece provocherebbe una creazione da zero del database ad ogni avvio (sebbene questa operazione possa sembrare inutile, risulta invece fondamentale durante le sessioni di test in quanto le condizioni iniziali in quel caso devono essere sempre le stesse)
  • viene realizzata una connessione al ResourceSet (un concetto proprio di EMF e trasversale rispetto all’implementazione scelta per la persistenza!) verso il DataStore appena inizializzato. Questo viene fatto in quanto, prima di partire, dobbiamo assicurarci di avere un oggetto Library persistito, che farà da contenitore per tutto ciò che gestiremo. Quindi carichiamo, con resource.load(null), le risorse e verifichiamo che esista una Library; in caso negativo (la prima volta) la creiamo.
  • viene aperto un Editor (proprio quello generato da EMF per il nostro modello) passando come input l’URI verso il DataStore creato.

Ecco fatto: non vi resta che lanciare l’applicazione.

Nota: dovreste avere a disposizione il lancio in Run
-> Run History
-> it.rcpvision.rcptutorial.model.editor.LibraryEditorAdvisorApplication
dall’ultimo tutorial.

In ogni caso potete sempre effettuare il lancio aprendo il file plugin.xml dell’Editor, tab Overview, hyperlink Launch an Eclipse Application.

 

Se il lancio avviene con successo (altrimenti effettuate un Clean e un Controllo del lancio) dovreste vedere, la prima volta, i seguenti messaggi sulla console

questo significa che l’inserimento iniziale dell’oggetto Library è avvenuto con successo.

L’applicazione invece dovrebbe presentarsi così:

e a questo punto potete iniziare a popolare la Library con oggetti di tipo Author e Book opportunamente relazionati fra loro, come nel precedente tutorial Eclipse EMF: un CRUD a costo zero.
Solo che stavolta i dati vengono resi persistenti sul database, come potete verificare dai messaggi in console e sul database stesso!

Vedremo prossimamente come sviluppare velocemente applicazioni RCP basate su EMF utilizzando il designer visuale WindowBuilder.

Torna all’indice

org.hibernate.cfg.

Environment