# EMF/Teneo EMap Problem



## krazun (17. Nov 2010)

Hallo,

ich habe ein kleines Problem mit EMF und der Nutzung einer EMap. Ich arbeite mit dem Visuellen EMF-Editor und habe dort einer Klasse eine EMap als Attribut hinzugefügt. Ich brauche sie um UUIDs (EString) als key und Zahlen (EInt) als Value zu speichern. Die EMap soll von Hibernate über Teneo mit persistiert werden. 

Nun kann ich den Model-Code natürlich nicht generieren bevor ich 2 Serialisierbare Typ-Parameter angegebene habe, allerdings ist es mir bis jetzt nicht gelungen rauszufinden wie ich das in dem Editor tun kann.


Wäre für jede Hilfe sehr dankbar. Versuche schon seit gestern eine EMap in EMF zu nutzen aber irgendwie klappt es einfach nicht.

mfg,
krazun


----------



## krazun (17. Nov 2010)

Achja ich habe ebenfalls versucht das Beispiel von EMF/FAQ - Eclipsepedia umzusetzen und die EMap nicht als Attribut hinzuzufügen sondern als eigene Klasse mit dem Instance Class Name: java.util.Map$Entry, key und value Attributen mit den entsprechenden Datentypen und einer Referenz auf die Klasse.

Bekomme dabei allerdings dann beim Model-Code erzeugen einen Fehler (Siehe Anhang).

mfg,
krazun


----------



## Wildcard (17. Nov 2010)

Kannst du mal die entsprechende Stelle im Source Posten?


----------



## krazun (18. Nov 2010)

Seltsam ist auch das EMap<String, String> wunderbar funktioniert! Nur EMap<String, int> geht nicht.

Die entsprechende Stelle ist:


```
/**
	 * Returns the value of the '<em><b>Uuid Map Reference</b></em>' map.
	 * The key is of type {@link java.lang.String},
	 * and the value is of type {@link int},
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Uuid Map Reference</em>' map isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Uuid Map Reference</em>' map.
	 * @see model.ModelPackage#getComponentSet_UuidMapReference()
	 * @model mapType="model.StringToIntMap<org.eclipse.emf.ecore.EString, org.eclipse.emf.ecore.EInt>"
	 * @generated
	 */
	EMap<String, int> getUuidMapReference();

} // ComponentSet
```


mfg,
krazun


----------



## Wildcard (18. Nov 2010)

Ahhh 
int ist primitiv und kann daher auch nicht in eine Map gesteckt werden. In der Praxis geht das dann zwar wieder dank Autoboxing, aber die Map kann dennoch nicht mit int als Template Parameter verwendet verwendet werden.
Also im Klartext:
Du brauchst eine StringToIntegerMap


----------



## krazun (18. Nov 2010)

Danke dir vielmals Wildcard! 

Endlich funktioniert es wie gewünscht


----------



## krazun (19. Nov 2010)

Mist! Es gibt da doch noch ein kleines Problemchen 

Zwar lässt sich der Model-Code nun erstellen und die passenden Methoden für die EMap sind im Programm enthalten, allerdings gibt es einen Fehler wenn man nun einen Wert wirklich in die Map packen will:


```
8350 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 208, SQLState: S0002
8350 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Ungültiger Objektname 'VariantUuidToNumberMap'.
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not initialize a collection: [Variant.VariantUuidToNumberMap#1]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.loader.Loader.loadCollection(Loader.java:2022)
	at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:59)
	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:587)
	at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
	at org.eclipse.emf.teneo.hibernate.mapping.EMFInitializeCollectionEventListener.onInitializeCollection(EMFInitializeCollectionEventListener.java:61)
	at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1743)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)
	at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)
	at org.hibernate.collection.PersistentMap.entrySet(PersistentMap.java:265)
	at org.eclipse.emf.teneo.hibernate.mapping.elist.MapHibernatePersistableEMap.doLoad(MapHibernatePersistableEMap.java:208)
	at org.eclipse.emf.teneo.mapping.elist.PersistableEMap.load(PersistableEMap.java:194)
	at org.eclipse.emf.teneo.mapping.elist.PersistableEMap.put(PersistableEMap.java:524)
	at eu.besst.haa.lca.ui.builder.VariantEditor.fillVariant(VariantEditor.java:407)
	at eu.besst.haa.lca.ui.builder.VariantEditor.updateVariant(VariantEditor.java:333)
	at eu.besst.haa.lca.ui.builder.VariantEditor$2.widgetSelected(VariantEditor.java:206)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
	at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
	at eu.besst.haa.lca.ui.main.MainWindow.initApplication(MainWindow.java:128)
	at eu.besst.haa.lca.ui.main.MainWindow.main(MainWindow.java:106)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Ungültiger Objektname 'VariantUuidToNumberMap'.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:390)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340)
	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:283)
	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
	at org.hibernate.loader.Loader.getResultSet(Loader.java:1808)
	at org.hibernate.loader.Loader.doQuery(Loader.java:697)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
	at org.hibernate.loader.Loader.loadCollection(Loader.java:2015)
	... 21 more
```

Ich hab mir mal die Initialisierungsmeldungen von Hibernate genauer angesehen und dort findet man folgenden Fehler:


```
2685 [main] INFO org.hibernate.tool.hbm2ddl.DatabaseMetadata - table not found: VariantUuidToNumberMap
2689 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - Unsuccessful: create table VariantUuidToNumberMap ([variant_variantuuidtonumbermap_e_id] numeric(19,0) null, elt int null, idx varchar(255) not null, primary key ([variant_variantuuidtonumbermap_e_id], idx))
2690 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - Eine PRIMARY KEY-Einschränkung kann für eine Spalte in der 'VariantUuidToNumberMap'-Tabelle, die NULL zulässt, nicht definiert werden.
2690 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - Unsuccessful: alter table VariantUuidToNumberMap add constraint FK583807381E736B27 foreign key ([variant_variantuuidtonumbermap_e_id]) references [variant]
2691 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate - Das 'VariantUuidToNumberMap'-Objekt wurde nicht gefunden, weil es nicht vorhanden ist oder Sie nicht über die entsprechenden Berechtigungen verfügen.
```

Dort steht zwar im Prinzip wo das Problem ist, allerdings stehe ich grad ein wenig auf dem Schlauch was dessen behebung angeht. Hat vielleicht jemand eine Idee?

Wäre für jeden Tipp dankbar

mfg,
krazun


----------

