Introduzione a CDO
Questo framework, che è un componente del progetto EMF, permette la condivisione di un modello EMF.
Se con Teneo quindi possiamo fare in modo che ciascun client possa accedere ad un database (realizzando un client/server a due livelli), con CDO abbiamo la possibilità che i vari client accedano ad un server che mette loro a disposizione la medesima istanza, condivisa, del modello EMF.
In questo tutorial vedremo come:
- installare CDO
- creare un server CDO
- creare un client CDO
Per una documentazione dettagliata su CDO potete consultare il seguente link http://www.eclipse.org/cdo/documentation/
Mentre qui potete scaricare le varie versioni http://www.eclipse.org/cdo/downloads/
Installazione di CDO
Vediamo quindi come installare CDO partendo dalla versione Eclipse 4.3 (Kepler) Modeling. CDO può essere utilizzato con diversi tipi di Store; in questo caso installeremo i necessari plugins per l’utilizzo di DBStore.
Inoltre visto che useremo un database MySQL dovremo anche assicurarci di aver installato il plug-in che contiene il JDBC driver corrispondente (se avete seguito il tutorial Setup Teneo per Eclipse 4.2 ÔÇô Juno potete saltare questo step).
(Nota: per l’esecuzione corretta di questo tutorial si consiglia di usare una versione di MySQL non superiore alla 5.5)
Update Site => http://www.elver.org/eclipse/2.0.0/update/
- MySQL Connector/J
A questo punto installiamo Net4j DB Adapter per MySQL
Update Site =>
http://download.eclipse.org/modeling/emf/cdo/updates/releases
Espandiamo la categoria pi├╣ recente e selezioniamo:
CDO R
> Net4j DB Framework
>> Net4j DB Framework MYSQL Adapter
Creare un server CDO
In questa sezione vedremo come realizzare un prodotto Eclipse, basato su features, in grado di lanciare un server CDO attraverso un file di configurazione XML.
In terminologia Eclipse una feature rappresenta un gruppo di plug-ins che collaborano per la realizzazione di una determinata funzionalità.
Creiamo quindi un Feature Project selezionando File -> New -> Project… -> Plug-in Development -> Feature Project
premiamo Next e allo step successivo diamo un nome al nostro progetto, ad es. it.rcpvision.rcptutorial.cdo.server
poi Finish.
Quello che abbiamo ottenuto è una feature vuota; andiamo quindi a specificare (tab Plug-ins) da quali plug-ins è composta premendo il bottone Add… e aggiungendo i seguenti
Per comodità riportiamo di seguito il contenuto testuale del file feature.xml, modificabile attraverso il tab “feature.xml“
[Enter Feature Description here.]
[Enter Copyright Description here.]
[Enter License Description here.]
A questo punto creiamo un product basato su questa feature, selezionando il progetto, tasto destro New -> Other… -> Plug-in Development -> Product Configuration
premiamo Next.
Allo step successivo diamo un nome al nostro Prodotto, ad es. CDO-Server.product,
selezioniamo il radio-button “Use an existing product” e nella combo a fianco del radio-button selezionato impostiamo il valore “org.eclipse.emf.cdo.server.product.tcp_h2“, poi Finish.
Ciò che abbiamo ottenuto è un prodotto, basato però su plug-ins.
per basarlo su features dobbiamo selezionare il secondo radio-button
a questo punto, per indicare da quali features è composto il prodotto, selezioniamo il tab Dependencies
premiamo il bottone Add…
e selezioniamo la feature creata in precedenza (it.rcpvision.rcptutorial.cdo.server)
e salviamo il prodotto (Ctrl-S).
Dobbiamo ora definire il file XML di configurazione per CDO. Selezioniamo quindi il progetto e creiamo una cartella chiamata “rootfiles” con tasto destro New -> Folder
e poi un’altra sottocartella chiamata “configuration”
all’interno di quest’ultima creiamo un file (tasto destro, New -> File) chiamato cdo-server.xml e copiamo all’interno del file il seguente contenuto
In pratica questo file di configurazione indica che il server CDO sarà attivo sulla porta TCP 2036 e metterà a disposizione un repository CDO chiamato “demo“. Seguono le coordinate per l’accesso al database.
Notate che al primo avvio o dopo modifiche al modello, è opportuno effettuare un preventivo drop del database; esso verrà creato all’avvio del server.
Prima di lanciare il server dobbiamo ancora indicare il valore del parametro che specifica la posizione del file di configurazione appena creato. Per fare questo selezioniamo nuovamente il prodotto, andiamo nel tab Launching e nella sezione VM Arguments indichiamo
-Dnet4j.config=${resource_loc:/it.rcpvision.rcptutorial.cdo.server/rootfiles/configuration}
salviamo il prodotto, torniamo sul tab Overview e lanciamo, con
Launch An Eclipse Application
La console dovrebbe presentare un output che termina con
!MESSAGE CDO server started
Verificate ora che il database sia stato creato correttamente.
(Nota: se ricevete messaggi di errore assicuratevi che il firewall di sistema non stia bloccando le porte 2036 e 3306)
Bene, ora all’indirizzo di rete della macchina in questione, alla porta di Net4j configurata (2036) è a disposizione il CDO repository “demo“.
Un’ultima osservazione: in vista di un successivo deploy del prodotto è opportuno indicare che esso deve comprendere anche il file di configurazione. Per fare ciò apriamo il file build.properties, andiamo sul tab Build e nella sezione “Binary Build” selezioniamo la cartella “rootfiles“.
Creare un client CDO
Useremo anche qui lo stesso modello EMF (il plug-in it.rcpvision.rcptutorial.model) usato in precedenza e illustrato nel tutorial Eclipse EMF: Progettare il Modello. Nel caso stiate per rifare quel tutorial, tenete conto che stavolta, al momento della creazione dell’EMF Generator Model (.genmodel), allo step “Select a Model Importer” dovrete selezionare “Ecore model (CDO Native)“.
Altrimenti, se avete già pronto il precedente plugin di model (creato senza la compatibilità con CDO) potete convertirlo selezionando il file .genmodel e premendo tasto destro CDO -> Migrate EMF Generator Model (dynamic feature delegation)
e naturalmente rigenerando i sorgenti
inoltre è necessario in questo caso aggiungere, nel plug-in it.rcpvision.rcptutorial.model, la dipendenza da CDO
Siamo finalmente pronti per realizzare il nostro client. Creiamo quindi un’applicazione RCP nel solito modo (vedi Come creare unÔÇÖapplicazione Eclipse RCP) e aggiungiamo le seguenti dipendenze:
- it.rcpvision.rcptutorial.model
- org.eclipse.emf.cdo.net4j
- org.eclipse.net4j.tcp
- org.junit
Creiamo ora una classe chiamata “TestCdoClient” nel package principale, con il seguente contenuto
package it.rcpvision.rcptutorial.application; import library.Author; import library.Book; import library.Library; import library.LibraryFactory; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.net4j.CDONet4jSession; import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration; import org.eclipse.emf.cdo.net4j.CDONet4jUtil; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.util.CommitException; import org.eclipse.net4j.Net4jUtil; import org.eclipse.net4j.connector.IConnector; import org.eclipse.net4j.tcp.TCPUtil; import org.eclipse.net4j.util.container.IPluginContainer; import org.eclipse.net4j.util.lifecycle.ILifecycle; import org.eclipse.net4j.util.lifecycle.LifecycleEventAdapter; import org.junit.BeforeClass; import org.junit.Test; public class TestCdoClient { private static CDONet4jSession cdoSession; @BeforeClass public static void init() { //The following lines are not needed if the extension //registry (OSGi/Equinox) is running Net4jUtil.prepareContainer(IPluginContainer.INSTANCE); TCPUtil.prepareContainer(IPluginContainer.INSTANCE); cdoSession = openSession("demo"); } @Test public void popola() { try { CDOTransaction transaction = cdoSession.openTransaction(); CDOResource resource = transaction.getOrCreateResource("/myResource"); Library library = LibraryFactory.eINSTANCE.createLibrary(); Book book = LibraryFactory.eINSTANCE.createBook(); book.setTitle("Eclipse Modeling Framework (2nd edition)"); library.getListBook().add(book); Author author = LibraryFactory.eINSTANCE.createAuthor(); author.setName("Ed"); author.setSurname("Merks"); library.getListAuthor().add(author); book.getAuthor().add(author); author = LibraryFactory.eINSTANCE.createAuthor(); author.setName("Marcelo"); author.setSurname("Paternostro"); library.getListAuthor().add(author); book.getAuthor().add(author); author = LibraryFactory.eINSTANCE.createAuthor(); author.setName("Frank"); author.setSurname("Budinsky"); library.getListAuthor().add(author); book.getAuthor().add(author); author = LibraryFactory.eINSTANCE.createAuthor(); author.setName("David"); author.setSurname("Steinberg"); library.getListAuthor().add(author); book.getAuthor().add(author); resource.getContents().add(library); transaction.commit(); cdoSession.close(); } catch (CommitException e) { e.printStackTrace(); } finally { cdoSession.close(); } } public static CDONet4jSession openSession(String repoName) { final IConnector connector = (IConnector) IPluginContainer.INSTANCE .getElement( // "org.eclipse.net4j.connectors", // Product group "tcp", // Type "localhost"); // Description CDONet4jSessionConfiguration config = CDONet4jUtil .createNet4jSessionConfiguration(); config.setConnector(connector); config.setRepositoryName(repoName); CDONet4jSession session = config.openNet4jSession(); session.addListener(new LifecycleEventAdapter() { @Override protected void onDeactivated(ILifecycle lifecycle) { connector.close(); } }); return session; } }
Come potete osservare si tratta di un test JUnit che si connette al repository “demo” disponibile all’indirizzo “localhost” (se il client viene eseguito su una macchina diversa questo indirizzo deve ovviamente essere quello dove gira il server CDO). Vengono poi create istanze degli oggetti del modello e salvate all’interno di una transazione CDO.
Lanciamola con tasto destro Run As -> JUnit Test
Se il tutto ha girato correttamente dovreste vedere un esito positivo sulla View di JUnit
e sul database troverete i dati inseriti.
Notate che abbiamo creato un’applicazione RCP e poi abbiamo in realtà utilizzato CDO da una semplice classe (standalone) di JUnit. Questo è stato fatto per due ragioni:
- per brevità di tutorial (ci è bastato aggiungere alcune dipendenze nel tab Dependencies)
- per dimostrare la facilità con cui è possibile accedere ad un server CDO (non è necessario avere OSGi/Equinox in esecuzione)
Nei tutorial che seguiranno peraltro ci troveremo spesso a realizzare applicazioni RCP che accedono ad un CDO server repository.
Per sviluppo o consulenza su CDO info@rcp-vision.com
Per informazioni sulla formazione su CDO training@rcp-vision.com
When I run the server as “Eclipse Application” from the overview tab, I got the following error. Could you please help me?
java.lang.NoClassDefFoundError: Workspace\it/rcpvision/rcptutorial/cdo/server\rootfiles\configuration
Caused by: java.lang.ClassNotFoundException: Workspace\it.rcpvision.rcptutorial.cdo.server\rootfiles\configuration
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Exception in thread “main”
Hi,
did you added exactly the plug-ins listed in the Feature?
Are you using Eclipse 3.7.1 and the Update Site indicated above?
I solved that problem. The location I specified was wrong.
how do you configure the location of server?
The server configuration given here, does not work. Rather, I used the one given here: http://wiki.eclipse.org/Getting_started_with_CDO_Helios
Is it okay, to use this server configuration?
Ciao Vincenzo,
innanzitutto complimenti per le guide.
Ho un problema che non riesco a risolvere. Ho fatto tutti gli step, dall’app RCP alla creazione del server CDO.
Però non riesco a far dialogare il server con il mio datasource. Non ho usato MySql perchè ho SQLServer, che devo dire, con gli altri esercizi funziona.
Come posso ovviare al problema ?
Ovviamente ho inserito nelle features quella della connessione a sqlserver. (com.microsoft.sqlserver.jdbc)
Ti posto il datasource:
______________________________________________________________
___________________________________________________________
Dove sbaglio ? L’errore della console è :
ENTRY org.eclipse.emf.cdo.server 1 0 2012-02-07 11:31:10.953
!MESSAGE CDO server starting
[ERROR] Unknown DB adapter: sqlserver
java.lang.IllegalArgumentException: Unknown DB adapter: sqlserver
at org.eclipse.emf.cdo.server.internal.db.DBStoreFactory.getDBAdapter(DBStoreFactory.java:105)
at org.eclipse.emf.cdo.server.internal.db.DBStoreFactory.createStore(DBStoreFactory.java:52)
at org.eclipse.emf.cdo.spi.server.RepositoryConfigurator.createStore(RepositoryConfigurator.java:291)
at org.eclipse.emf.cdo.spi.server.RepositoryConfigurator.getRepository(RepositoryConfigurator.java:163)
at org.eclipse.emf.cdo.spi.server.RepositoryConfigurator.configure(RepositoryConfigurator.java:105)
at org.eclipse.emf.cdo.internal.server.bundle.CDOServerApplication.doStart(CDOServerApplication.java:61)
at org.eclipse.net4j.util.om.OSGiApplication.start(OSGiApplication.java:61)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.equinox.internal.app.AnyThreadAppLauncher.run(AnyThreadAppLauncher.java:26)
at java.lang.Thread.run(Unknown Source)
Grazie ciao….
Ciao Giancarlo,
quando si cambia tipo di database la feature del driver JDBC (es. com.microsoft.sqlserver.jdbc) non è sufficiente.
Occorre anche la feature dell’Adapter per Net4J (l’errore infatti dice “Unknown DB adapter: sqlserver”).
Come puoi vedere nella figura in alto (sotto la dicitura “Net4j DB Framework MYSQL Adapter”) non è presente un Adapter per MsSQL al momento. Quindi se scegli CDO hai due strade: o scegli un tipo di database diverso (tra Derby, H2, HSQLDB, MYSQL, PostgreSQL) oppure implementi un Adapter per il database specifico.
Se scegli invece Teneo (=il client accede direttamente al database, a differenza di CDO dove il client accede ad un server CDO il quale poi accede al db) allora potrai usare MsSQL (Teneo usa Hibernate, quindi basta cambiare il dialect).
Ecco il datasource
..cdoServer…
..acceptor type=”tcp” listenAddr=”0.0.0.0″ port=”2036″…
…acceptor…
…repository name=”demo”…
..store type=”db”…
…mappingStrategy type=”horizontal”/…
…dbAdapter name=”sqlserver”/…
…dataSource
class=”com.microsoft.sqlserver.jdbc.SQLServerDriver”
url=”jdbc:sqlserver://localhost:1433;DatabaseName=CDOSERVER”
user=”++++”
password=”——-”
/…
…/store…
…/repository…
../cdoServer…
Vincenzo, thanks for a really great tutorial. I wish I had read this earlier, will now continue with your series 🙂
Hello,
I’m trying to run the Client, but I got following error message:
Exception in thread “main” org.eclipse.net4j.util.container.FactoryNotFoundException: Factory not found: org.eclipse.net4j.connectors[tcp]
caused by:
IConnector connector = (IConnector)container.getElement(“org.eclipse.net4j.connectors”, “tcp”, “localhost:2036”);
I ‘m using Eclipse Indigo 3.7.2 and CDO 4.0
Can you help me?
Hello Julia,
check that plugin “org.eclipse.net4j.tcp” is included in the client’s launch (see http://www.rcp-vision.com/?p=1235).
Vincenzo
io non ho questa opzione “org.eclipse.emf.cdo.server.product.tcp_h2“ come mai?
Risolto, mi mancavano dei plugin
Hello, I am trying to connect eclipse rcp 4 to a backend database (MySQL) using hibernate. I tried to follow your tutorial to do just that, however, am getting this error:
SEVERE: Could not find EPackage “http://www.eclipse.org/emf/teneo/hibernate/examples/extlibrary”.
org.xml.sax.SAXException: Could not find EPackage “http://www.eclipse.org/emf/teneo/hibernate/examples/extlibrary”.
at org.eclipse.emf.teneo.annotations.xml.XmlPersistenceContentHandler.startElement(XmlPersistenceContentHandler.java:311)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506)
at org.eclipse.emf.teneo.hibernate.HbSessionDataStore.initialize(HbSessionDataStore.java:112)
at org.eclipse.emf.teneo.hibernate.examples.samples.Tutorial.main(Tutorial.java:97)
I then commented out the following line:
hibernateProperties.setProperty(PersistenceOptions.PERSISTENCE_XML, “org/eclipse/emf/teneo/hibernate/examples/annotations.xml”);
I am now getting this error:
Exception in thread “main” org.hibernate.QueryException: could not resolve property: name of: Writer [SELECT book FROM Book book, Writer writ WHERE book.title=’1984′ AND book.author=writ AND writ.name=’G. Orwell’]
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1649)
at org.eclipse.emf.teneo.hibernate.examples.samples.Tutorial.main(Tutorial.java:193)
Please could you let me know where is it that am going wrong.
Thanks
Hi Modeji,
in CDO there exists several implementation of ‘Stores’, e.g. DBStore, HibernateStore, DB4OStore, MEMStore, ObjectivityStore.
In this tutorial we use DBStore, which does not uses Hibernate.
I suppose you are using HibernateStore instead, do you?
In this case I cannot help unless you provide all sources and xml files content.
Vincenzo
Hi Vincezo, thank you for the response.
That was very informative. I am very new to the CDO project. I was actually trying to do databinding to an Elipse RCP SWT widget with the sample ExtlibraryPackage project. I tried to do so by following the above tutorial and the “WindowBuilder: installing and EMF databinding” tutorial.
The most important question that I have is that: can I actually use the CDO HibernateStore to perform CRUD in Eclipse RCP without going through or creating the whole .genmodel, .ecore and ecore_diagram stuff? If so is there any example code that I could follow?
Hi Modeji,
HibernateStore is just another way to let CDO persist data on a RDBMS, so, unless you need it for particular purposes (e.g. want to use a database supported by Hibernate, but not yet supported by DBStore) you barely see differences in a simple application.
CDO works with an EMF Model, so, yes, you have to go through .ecore (diagram is not necessary, it’s just a different way to handle .ecore) and then .genmodel
I am using eclipse 4.2 (Juno) and CDO 4.1
ciao Vincenzo
the method named “add” doesnt exist on the class “Author”,
what should i do ?
example:
Author author = LibraryFactory.eINSTANCE.createAuthor();
author.setName(“Ed”);
library.getListAuthor().add(author);
book.getAuthor().add(author); //ERROR
Ciao Alejandro,
the article has a reference to the (prerequiste) following tutorial
http://www.rcp-vision.com/?p=603&lang=en
At the end of this tutorial the model is changed in order to allow multiple authors for a book.
Probably you did not followed this last step.
Alternatively (if you want to keep a single author for a book) you can do just:
book.setAuthor(author);
Let me know
Vincenzo
ciao vincezo,
When I run the server as “Eclipse Application†from the overview tab, I got the following error. Could you please help me?
[INFO] CDO server starting
!SESSION 2013-05-27 18:48:36.356 ———————————————–
eclipse.buildId=unknown
java.version=1.6.0_45
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=es_CO
Framework arguments: -product org.eclipse.emf.cdo.server.product.tcp_h2
Command-line arguments: -product org.eclipse.emf.cdo.server.product.tcp_h2 -data F:\tesis\eclipse\workspace_rcpvision/../runtime-CDO-server.product -dev file:F:/tesis/eclipse/workspace_rcpvision/.metadata/.plugins/org.eclipse.pde.core/CDO-Server.product/dev.properties -os win32 -ws win32 -arch x86 -consoleLog
!ENTRY org.eclipse.emf.cdo.server 1 0 2013-05-27 18:48:37.183
!MESSAGE CDO server starting
[ERROR] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘OPTION SQL_SELECT_LIMIT=DEFAULT’ at line 1
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘OPTION SQL_SELECT_LIMIT=DEFAULT’ at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1051)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3563)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3495)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2687)
at com.mysql.jdbc.ConnectionImpl.unsetMaxRows(ConnectionImpl.java:5571)
at com.mysql.jdbc.StatementImpl.realClose(StatementImpl.java:2374)
at com.mysql.jdbc.StatementImpl.close(StatementImpl.java:508)
at org.eclipse.net4j.db.DBUtil.close(DBUtil.java:222)
at org.eclipse.net4j.spi.db.DBAdapter.createTables(DBAdapter.java:123)
at org.eclipse.net4j.spi.db.DBSchema.create(DBSchema.java:118)
at org.eclipse.emf.cdo.server.internal.db.DBStore.doActivate(DBStore.java:531)
at org.eclipse.net4j.util.lifecycle.Lifecycle.activate(Lifecycle.java:76)
at org.eclipse.net4j.util.lifecycle.LifecycleUtil.activate(LifecycleUtil.java:114)
at org.eclipse.net4j.util.lifecycle.LifecycleUtil.activate(LifecycleUtil.java:104)
at org.eclipse.emf.cdo.internal.server.Repository.doActivate(Repository.java:1846)
at org.eclipse.net4j.util.lifecycle.Lifecycle.activate(Lifecycle.java:76)
at org.eclipse.net4j.util.lifecycle.LifecycleUtil.activate(LifecycleUtil.java:114)
at org.eclipse.net4j.util.lifecycle.LifecycleUtil.activate(LifecycleUtil.java:104)
at org.eclipse.emf.cdo.server.CDOServerUtil.addRepository(CDOServerUtil.java:208)
at org.eclipse.emf.cdo.spi.server.RepositoryConfigurator.configure(RepositoryConfigurator.java:111)
at org.eclipse.emf.cdo.internal.server.bundle.CDOServerApplication.doStart(CDOServerApplication.java:61)
at org.eclipse.net4j.util.om.OSGiApplication.start(OSGiApplication.java:63)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.equinox.internal.app.AnyThreadAppLauncher.run(AnyThreadAppLauncher.java:26)
at java.lang.Thread.run(Thread.java:662)
[ERROR] Problem with table cdo_lobs: SELECT id, size, bdata, cdata FROM cdo_lobs
org.eclipse.net4j.db.DBException: Problem with table cdo_lobs: SELECT id, size, bdata, cdata FROM cdo_lobs..
:'( … another question -> do you speak spanish ?( Español )
Ciao Ivan,
no, I don’t speak spanish, although, being italian probably I could easily understand most words 😉
Anyway, I never saw the problem you are reporting.
Could you please provide the exact versions of the following items?
– Eclipse Juno SR1 or SR2?
– Juno Modeling package or other?
– versions of CDO R…, Net4j DB Framework, Net4j DB Framework MYSQL Adapter
– version of MySQL
Thank you
Vincenzo
vincenzo mira
– Juno Service Release 2
– Eclipse Modeling Framework Runtime and Tools Version: 2.8.3.
– CDO Model Repository Client Version: 4.1.2
– CDO Model Repository Server Version: 4.1.2
– Net4j DB Framework Version: 4.1.2
– Net4j DB Framework MYSQL Adapter Version: 4.1.0
– MySQL Server 5.6
Ojalá y pueda ayudarme, gracias!!
The problem is that in MySQL 56 they removed the SET OPTION syntax and replaced it with just SET, so
SET SQL_SELECT_LIMIT=10;
works, but:
SET OPTION SQL_SELECT_LIMIT=10
It seems that something in CDO/Net4j etc. is making statements that use the old and now defunct syntax, which means that CDO etc. is probably not compatible with MySQL 56 at present (unless there are later versions of the features used in this tutorial).
See:
http://stackoverflow.com/questions/13023548/mysql-server-version-for-the-right-syntax-to-use-near-option-sql-select-limit-1
Is it necessary to change my version of MySQL?
Ivan,
the problem is summarized here https://bugs.eclipse.org/bugs/show_bug.cgi?id=409558.
For now you can do two things: either install MySQL 5.5 or do the following trick.
– open view “Plug-ins”, select “com.mysql.jdbc”, right-click “Import as” -> “Source project”
– go back to “Package Explorer” view
– remove file “mysql-connector… .jar” and copy here the one you can find in your MySQL 5.6 installation (if you downloaded the Installer version and followed the default wizard you’ll find it in \Program Files\MySQL\Connector J 5.1.24\mysql-connector-java-5.1.24-bin.jar)
– rename the file into com.mysql.jdbc_5.1.11.201210222237.jar
or
– go to MANIFEST.MF, tab Runtime and add the correct jar in the Classpath section and Export all its packages in the Exported Packages section
then it works!
Ciao,
ho dovuto modificare il tuo metodo openSession con il seguente codice:
public static CDOSession openSession() {
CDONet4jSessionConfiguration sc = CDONet4jUtil.createNet4jSessionConfiguration();
IManagedContainer container = IPluginContainer.INSTANCE;
Net4jUtil.prepareContainer(container); // Register Net4j factories
TCPUtil.prepareContainer(container); // Register TCP factories
CDONet4jUtil.prepareContainer(container); // Register CDO factories
sc.setConnector(Net4jUtil.getConnector(container, “tcp://” + CONNECTION_ADDRESS));
sc.setRepositoryName(REPO_NAME);
CDONet4jSession session = sc.openNet4jSession();
return session;
}
In questo modo sono riuscito a farlo funzionare. Magari può essere di aiuto a qualcun altro 🙂
Complimenti per l’ottimo tutorial che hai scritto 🙂 Mi hai fatto risparmiare tantissimo tempo.
I need help, I do “data binding” but not on the tutotial of cdo but on the local database, then I call the resource from the class “ViewPart”, but I run praises “data binding”, Am I doing wrong? :
UriStr String = “hibernate :/ /?” + HibernateResource.DS_NAME_PARAM + “= mydb”;
URI uri = URI.createURI end (uriStr);
ResourceSetImpl resourceSet = new ();
Resource resource = (Resource) resourceSet.getResources ();
try {
resource.load (null);
library = (Library) resource.getContents (). get (0);
resource.getContents (). add (LibraryFactory.eINSTANCE.createLibrary ());
resource.save (null);
} Catch (Exception e) {
/ / TODO Auto-generated catch block
e.printStackTrace ();
}
Hi Silvio,
can you describe better your use case?
Looking at the code above seems that you are first loading the first (0) library object in the resource, then adding a new (second) library to the same resource and in the end saving. So at each execution you are adding a new library, but just the first is always assigned to library variable, while the others are discarded.
Apart from this, what is the problem with data binding?
Ciao Vincenzo,
I already solve the above problem, now I have a question. I need to query the database, but I don’t know like them. For example, all the books of a specific author.
If you can help me, I’d appreciate it
Silvio,
querying an EMF model can be made in several ways (OCL, EMF Query and other tools).
Take a look at the following links:
Hope this help.
Let me know.
Vincenzo