Home » Modeling » EMF "Technology" (Ecore Tools, EMFatic, etc)  » Strange DuplicateMappingException with Teneo 
| Strange DuplicateMappingException with Teneo [message #62659] | 
Fri, 24 November 2006 09:01   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi all, 
 
I am working on an application using EMF with the teneo project. I  
followed the quick start guide on the elver.org site and it all works  
fine for me. But when I am using my own EMF model, I messed up with an  
DuplicateMappingException while trying to initialize the db scheme: 
 
 ------------------------------------------------------------ - 
org.hibernate.DuplicateMappingException: duplicate import: Error refers  
to both ...context.Error and ...flow.Error (try using auto-import="false") 
	at org.hibernate.cfg.Mappings.addImport(Mappings.java:141) 
	at  
 org.hibernate.cfg.HbmBinder.bindPersistentClassCommonValues( HbmBinder.java:614) 
	at org.hibernate.cfg.HbmBinder.bindClass(HbmBinder.java:527) 
	at  org.hibernate.cfg.HbmBinder.bindSubclass(HbmBinder.java:809) 
	at  org.hibernate.cfg.HbmBinder.handleSubclass(HbmBinder.java:22 10) 
	at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:149) 
	at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
	at  org.hibernate.cfg.Configuration.addXML(Configuration.java:44 0) 
	at  
 org.eclipse.emf.teneo.hibernate.HbDataStore.mapModel(HbDataS tore.java:360) 
	at  
 org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:155) 
	at ...DataStoreManager.initDataStore(DataStoreManager.java:73) 
	at ...TestSomething.testSomething(TestSomething.java:26) 
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
	at  
 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39) 
	at  
 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe thodAccessorImpl.java:25) 
	at java.lang.reflect.Method.invoke(Method.java:585) 
	at junit.framework.TestCase.runTest(TestCase.java:154) 
	at junit.framework.TestCase.runBare(TestCase.java:127) 
	at junit.framework.TestResult$1.protect(TestResult.java:106) 
	at  junit.framework.TestResult.runProtected(TestResult.java:124) 
	at junit.framework.TestResult.run(TestResult.java:109) 
	at junit.framework.TestCase.run(TestCase.java:118) 
	at  
 org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer ence.run(JUnit3TestReference.java:128) 
	at  
 org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test Execution.java:38) 
	at  
 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:460) 
	at  
 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:673) 
	at  
 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R emoteTestRunner.java:386) 
	at  
 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner.java:196) 
 ------------------------------------------------------------ - 
 
The strange thing is that I used the property  
PersistenceOptions.QUALIFY_ENTITY_NAME to get an prefix for the mapped  
classes but anyway I get the exception! Here is my code wich I use to  
init the db scheme: 
 
 ------------------------------------------------------------ - 
// Set the database information, Environment is  
org.hibernate.cfg.Environment 
       final Properties props = new Properties(); 
       props.setProperty(Environment.DRIVER, db_driver); 
       props.setProperty(Environment.USER, db_user); 
       props.setProperty(Environment.URL, "jdbc:mysql://127.0.0.1:3306/"  
+ db_name); 
       props.setProperty(Environment.PASS, db_pass); 
       props.setProperty(Environment.DIALECT,  
org.hibernate.dialect.MySQLInnoDBDialect.class.getName()); 
 
       // persistance properties 
       final Properties persistanceProps = new Properties(); 
// HERE IS THE THE QUALIFY_ENTITY_NAME OPTION 
      persistanceProps.setProperty(PersistenceOptions.QUALIFY_ENTI TY_NAME, 
          PersistenceOptions.QUALIFY_ENTITY_NAME_NSPREFIX); 
 
       // create the HbDataStore 
       HbDataStore hbds =  
HbHelper.INSTANCE.createRegisterDataStore(hb_datastore); 
 
       // sets its epackages stored in this datastore 
       hbds.setEPackages(new EPackage[] {BasePackage.eINSTANCE,  
RulePackage.eINSTANCE, FlowPackage.eINSTANCE, 
          ContextPackage.eINSTANCE, BindingPackage.eINSTANCE,  
EnvironmentPackage.eINSTANCE, ExpressionPackage.eINSTANCE, 
          MessagePackage.eINSTANCE, TestPackage.eINSTANCE,  
WorkflowPackage.eINSTANCE}); 
 
       // set the relational database to use and other properties 
       // to set Teneo specific options call hbds.setPersistenceProperties 
       hbds.setHibernateProperties(props); 
 
       // HERE ARE THE PROPS TO SET 
       hbds.setPersistenceProperties(persistanceProps); 
 
 
       // initialize, also creates the database tables 
       hbds.initialize(); 
 ------------------------------------------------------------ - 
 
Here is the snippet of the hibernate mapping file which were generated  
for my EMF Model by teneo: 
 
.... 
<subclass entity-name="...context.Error" abstract="false" lazy="false"  
extends="...context.Class" discriminator-value="Error"> 
		<meta attribute="eclassName">Error</meta> 
		<meta attribute="epackage">http:///.../context.ecore</meta> 
	</subclass> 
.... 
<subclass entity-name="...base.flow.Error" abstract="false" lazy="false"  
extends="de.visualrules.base.flow.Statement" discriminator-value="Error"> 
		<meta attribute="eclassName">Error</meta> 
		<meta attribute="epackage">http:///.../base/flow.ecore</meta> 
		<many-to-one name="message"  
entity-name="...base.expression.Expression" cascade="all" lazy="false"  
insert="true" update="true" not-null="false"> 
			<column not-null="false" unique="false" name="`expression_message_id`"/> 
		</many-to-one> 
	</subclass> 
.... 
 
I think the problem is that the value of 'discriminator-value' is the  
same for the '...flow.Error' class and the '...context.Error' class. I  
havent found a property that influences this behavior. For me it is not  
clear why teneo explicitly set the attribute 'discriminator-value'  
because Hibernate uses the fully qulified class name per default (I think). 
 
Are there any solutions for this problem? 
 
thanks in advance, sascha
 |  
 |  
  |  
| Re: Strange DuplicateMappingException with Teneo [message #62686 is a reply to message #62659] | 
Fri, 24 November 2006 09:19    | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi Sascha, 
Can you try to manually repair the discriminator-value in the hbm file and then tell teneo to use  
the hbm file (there is an option for that)? 
Anyway this seems to be a bug, the discriminator value should also use the qualified name. But if  
you can test it then I am sure that this is the cause of this issue. 
 
The reason that discriminator is set is that in this way dynamic emf is supported (where all objects  
can be of the same class but representing different types/eclasses). 
 
gr. Martin 
 
Sascha Theves wrote: 
> Hi all, 
>  
> I am working on an application using EMF with the teneo project. I  
> followed the quick start guide on the elver.org site and it all works  
> fine for me. But when I am using my own EMF model, I messed up with an  
> DuplicateMappingException while trying to initialize the db scheme: 
>  
>  ------------------------------------------------------------ - 
> org.hibernate.DuplicateMappingException: duplicate import: Error refers  
> to both ...context.Error and ...flow.Error (try using auto-import="false") 
>     at org.hibernate.cfg.Mappings.addImport(Mappings.java:141) 
>     at  
>  org.hibernate.cfg.HbmBinder.bindPersistentClassCommonValues( HbmBinder.java:614)  
>  
>     at org.hibernate.cfg.HbmBinder.bindClass(HbmBinder.java:527) 
>     at  org.hibernate.cfg.HbmBinder.bindSubclass(HbmBinder.java:809) 
>     at  org.hibernate.cfg.HbmBinder.handleSubclass(HbmBinder.java:22 10) 
>     at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:149) 
>     at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
>     at  org.hibernate.cfg.Configuration.addXML(Configuration.java:44 0) 
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.mapModel(HbDataS tore.java:360) 
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:155)  
>  
>     at ...DataStoreManager.initDataStore(DataStoreManager.java:73) 
>     at ...TestSomething.testSomething(TestSomething.java:26) 
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>     at  
>  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39)  
>  
>     at  
>  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe thodAccessorImpl.java:25)  
>  
>     at java.lang.reflect.Method.invoke(Method.java:585) 
>     at junit.framework.TestCase.runTest(TestCase.java:154) 
>     at junit.framework.TestCase.runBare(TestCase.java:127) 
>     at junit.framework.TestResult$1.protect(TestResult.java:106) 
>     at  junit.framework.TestResult.runProtected(TestResult.java:124) 
>     at junit.framework.TestResult.run(TestResult.java:109) 
>     at junit.framework.TestCase.run(TestCase.java:118) 
>     at  
>  org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer ence.run(JUnit3TestReference.java:128)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test Execution.java:38)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:460)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:673)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R emoteTestRunner.java:386)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner.java:196)  
>  
>  ------------------------------------------------------------ - 
>  
> The strange thing is that I used the property  
> PersistenceOptions.QUALIFY_ENTITY_NAME to get an prefix for the mapped  
> classes but anyway I get the exception! Here is my code wich I use to  
> init the db scheme: 
>  
>  ------------------------------------------------------------ - 
> // Set the database information, Environment is  
> org.hibernate.cfg.Environment 
>       final Properties props = new Properties(); 
>       props.setProperty(Environment.DRIVER, db_driver); 
>       props.setProperty(Environment.USER, db_user); 
>       props.setProperty(Environment.URL, "jdbc:mysql://127.0.0.1:3306/"  
> + db_name); 
>       props.setProperty(Environment.PASS, db_pass); 
>       props.setProperty(Environment.DIALECT,  
> org.hibernate.dialect.MySQLInnoDBDialect.class.getName()); 
>  
>       // persistance properties 
>       final Properties persistanceProps = new Properties(); 
> // HERE IS THE THE QUALIFY_ENTITY_NAME OPTION 
>      persistanceProps.setProperty(PersistenceOptions.QUALIFY_ENTI TY_NAME, 
>          PersistenceOptions.QUALIFY_ENTITY_NAME_NSPREFIX); 
>  
>       // create the HbDataStore 
>       HbDataStore hbds =  
> HbHelper.INSTANCE.createRegisterDataStore(hb_datastore); 
>  
>       // sets its epackages stored in this datastore 
>       hbds.setEPackages(new EPackage[] {BasePackage.eINSTANCE,  
> RulePackage.eINSTANCE, FlowPackage.eINSTANCE, 
>          ContextPackage.eINSTANCE, BindingPackage.eINSTANCE,  
> EnvironmentPackage.eINSTANCE, ExpressionPackage.eINSTANCE, 
>          MessagePackage.eINSTANCE, TestPackage.eINSTANCE,  
> WorkflowPackage.eINSTANCE}); 
>  
>       // set the relational database to use and other properties 
>       // to set Teneo specific options call hbds.setPersistenceProperties 
>       hbds.setHibernateProperties(props); 
>  
>       // HERE ARE THE PROPS TO SET 
>       hbds.setPersistenceProperties(persistanceProps); 
>  
>  
>       // initialize, also creates the database tables 
>       hbds.initialize(); 
>  ------------------------------------------------------------ - 
>  
> Here is the snippet of the hibernate mapping file which were generated  
> for my EMF Model by teneo: 
>  
> .... 
> <subclass entity-name="...context.Error" abstract="false" lazy="false"  
> extends="...context.Class" discriminator-value="Error"> 
>         <meta attribute="eclassName">Error</meta> 
>         <meta attribute="epackage">http:///.../context.ecore</meta> 
>     </subclass> 
> .... 
> <subclass entity-name="...base.flow.Error" abstract="false" lazy="false"  
> extends="de.visualrules.base.flow.Statement" discriminator-value="Error"> 
>         <meta attribute="eclassName">Error</meta> 
>         <meta attribute="epackage">http:///.../base/flow.ecore</meta> 
>         <many-to-one name="message"  
> entity-name="...base.expression.Expression" cascade="all" lazy="false"  
> insert="true" update="true" not-null="false"> 
>             <column not-null="false" unique="false"  
> name="`expression_message_id`"/> 
>         </many-to-one> 
>     </subclass> 
> .... 
>  
> I think the problem is that the value of 'discriminator-value' is the  
> same for the '...flow.Error' class and the '...context.Error' class. I  
> havent found a property that influences this behavior. For me it is not  
> clear why teneo explicitly set the attribute 'discriminator-value'  
> because Hibernate uses the fully qulified class name per default (I think). 
>  
> Are there any solutions for this problem? 
>  
> thanks in advance, sascha 
>  
>  
>  
 
 
--  
 
With Regards, Martin Taal 
 
Springsite/Elver.org 
Office: Hardwareweg 4, 3821 BV Amersfoort 
Postal: Nassaulaan 7, 3941 EC Doorn 
The Netherlands 
Tel: +31 (0)84 420 2397 
Fax: +31 (0)84 225 9307 
Mail: mtaal@springsite.com - mtaal@elver.org 
Web: www.springsite.com - www.elver.org
 |  
 |  
  |  
| Re: Strange DuplicateMappingException with Teneo [message #62710 is a reply to message #62686] | 
Fri, 24 November 2006 11:56    | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi Martin, 
 
I tried the workaround you described below. I have copied the hbm file  
in the src folder (not in an particular java package) of my model plugin  
and told teneo the use this file (via the  
PersistenceOptions.USE_MAPPING_FILE Property). But it ended up in the  
following NPE: 
 
 
java.lang.NullPointerException 
	at  
 org.eclipse.emf.teneo.hibernate.HbDataStore.computeReferers( HbDataStore.java:727) 
	at  
 org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:162) 
	... 
 
 
 
I looked at the code and tried to find out where the NPE comes from. The  
snippet from which the NPE comes from is pasted below: 
 
if (ef == null) { // TODO can this happen? 
							isContainer = prop.getCascadeStyle().hasOrphanDelete() 
									|| prop.getCascadeStyle() == CascadeStyle.ALL; 
							if (((Collection) prop.getValue()).getElement() instanceof  
OneToMany) { 
								final Collection coll = (Collection) prop.getValue(); 
								toEntity = ((OneToMany)  
coll.getElement()).getReferencedEntityName(); 
							} else if (((Collection) prop.getValue()).getElement() instanceof  
ManyToOne) { 
								final Collection coll = (Collection) prop.getValue(); 
								toEntity = ((ManyToOne)  
coll.getElement()).getReferencedEntityName(); 
							} else { 
								throw new HbMapperException("Type " 
										+ ((Collection) prop.getValue()).getElement().getClass().getName() 
										+ " not supported"); 
							} 
						} 
 
It seems that 'ef' (EStructuralFeature) is null. Then I looked where ef  
comes from: 
 
final EStructuralFeature ef =  
StoreUtil.getEStructuralFeature(pc.getEntityName(), prop.getName(), 
						getEPackages()); 
 
This method returns null for the EStructuralFeature although the  
pc.getEntityName() ,prop.getName() and getEPackages() returning the  
right values. 
 
Any ideas where this comes from? 
 
thanks for your help! 
 
Sascha 
 
 
 
Martin Taal schrieb: 
> Hi Sascha, 
> Can you try to manually repair the discriminator-value in the hbm file  
> and then tell teneo to use the hbm file (there is an option for that)? 
> Anyway this seems to be a bug, the discriminator value should also use  
> the qualified name. But if you can test it then I am sure that this is  
> the cause of this issue. 
>  
> The reason that discriminator is set is that in this way dynamic emf is  
> supported (where all objects can be of the same class but representing  
> different types/eclasses). 
>  
> gr. Martin 
>  
> Sascha Theves wrote: 
>> Hi all, 
>> 
>> I am working on an application using EMF with the teneo project. I  
>> followed the quick start guide on the elver.org site and it all works  
>> fine for me. But when I am using my own EMF model, I messed up with an  
>> DuplicateMappingException while trying to initialize the db scheme: 
>> 
>>  ------------------------------------------------------------ - 
>> org.hibernate.DuplicateMappingException: duplicate import: Error  
>> refers to both ...context.Error and ...flow.Error (try using  
>> auto-import="false") 
>>     at org.hibernate.cfg.Mappings.addImport(Mappings.java:141) 
>>     at  
>>  org.hibernate.cfg.HbmBinder.bindPersistentClassCommonValues( HbmBinder.java:614)  
>> 
>>     at org.hibernate.cfg.HbmBinder.bindClass(HbmBinder.java:527) 
>>     at  org.hibernate.cfg.HbmBinder.bindSubclass(HbmBinder.java:809) 
>>     at  org.hibernate.cfg.HbmBinder.handleSubclass(HbmBinder.java:22 10) 
>>     at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:149) 
>>     at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
>>     at  org.hibernate.cfg.Configuration.addXML(Configuration.java:44 0) 
>>     at  
>>  org.eclipse.emf.teneo.hibernate.HbDataStore.mapModel(HbDataS tore.java:360)  
>> 
>>     at  
>>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:155)  
>> 
>>     at ...DataStoreManager.initDataStore(DataStoreManager.java:73) 
>>     at ...TestSomething.testSomething(TestSomething.java:26) 
>>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>>     at  
>>  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39)  
>> 
>>     at  
>>  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe thodAccessorImpl.java:25)  
>> 
>>     at java.lang.reflect.Method.invoke(Method.java:585) 
>>     at junit.framework.TestCase.runTest(TestCase.java:154) 
>>     at junit.framework.TestCase.runBare(TestCase.java:127) 
>>     at junit.framework.TestResult$1.protect(TestResult.java:106) 
>>     at  junit.framework.TestResult.runProtected(TestResult.java:124) 
>>     at junit.framework.TestResult.run(TestResult.java:109) 
>>     at junit.framework.TestCase.run(TestCase.java:118) 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer ence.run(JUnit3TestReference.java:128)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test Execution.java:38)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:460)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:673)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R emoteTestRunner.java:386)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner.java:196)  
>> 
>>  ------------------------------------------------------------ - 
>> 
>> The strange thing is that I used the property  
>> PersistenceOptions.QUALIFY_ENTITY_NAME to get an prefix for the mapped  
>> classes but anyway I get the exception! Here is my code wich I use to  
>> init the db scheme: 
>> 
>>  ------------------------------------------------------------ - 
>> // Set the database information, Environment is  
>> org.hibernate.cfg.Environment 
>>       final Properties props = new Properties(); 
>>       props.setProperty(Environment.DRIVER, db_driver); 
>>       props.setProperty(Environment.USER, db_user); 
>>       props.setProperty(Environment.URL,  
>> "jdbc:mysql://127.0.0.1:3306/" + db_name); 
>>       props.setProperty(Environment.PASS, db_pass); 
>>       props.setProperty(Environment.DIALECT,  
>> org.hibernate.dialect.MySQLInnoDBDialect.class.getName()); 
>> 
>>       // persistance properties 
>>       final Properties persistanceProps = new Properties(); 
>> // HERE IS THE THE QUALIFY_ENTITY_NAME OPTION 
>>      persistanceProps.setProperty(PersistenceOptions.QUALIFY_ENTI TY_NAME, 
>>          PersistenceOptions.QUALIFY_ENTITY_NAME_NSPREFIX); 
>> 
>>       // create the HbDataStore 
>>       HbDataStore hbds =  
>> HbHelper.INSTANCE.createRegisterDataStore(hb_datastore); 
>> 
>>       // sets its epackages stored in this datastore 
>>       hbds.setEPackages(new EPackage[] {BasePackage.eINSTANCE,  
>> RulePackage.eINSTANCE, FlowPackage.eINSTANCE, 
>>          ContextPackage.eINSTANCE, BindingPackage.eINSTANCE,  
>> EnvironmentPackage.eINSTANCE, ExpressionPackage.eINSTANCE, 
>>          MessagePackage.eINSTANCE, TestPackage.eINSTANCE,  
>> WorkflowPackage.eINSTANCE}); 
>> 
>>       // set the relational database to use and other properties 
>>       // to set Teneo specific options call hbds.setPersistenceProperties 
>>       hbds.setHibernateProperties(props); 
>> 
>>       // HERE ARE THE PROPS TO SET 
>>       hbds.setPersistenceProperties(persistanceProps); 
>> 
>> 
>>       // initialize, also creates the database tables 
>>       hbds.initialize(); 
>>  ------------------------------------------------------------ - 
>> 
>> Here is the snippet of the hibernate mapping file which were generated  
>> for my EMF Model by teneo: 
>> 
>> .... 
>> <subclass entity-name="...context.Error" abstract="false" lazy="false"  
>> extends="...context.Class" discriminator-value="Error"> 
>>         <meta attribute="eclassName">Error</meta> 
>>         <meta attribute="epackage">http:///.../context.ecore</meta> 
>>     </subclass> 
>> .... 
>> <subclass entity-name="...base.flow.Error" abstract="false"  
>> lazy="false" extends="....flow.Statement"  
>> discriminator-value="Error"> 
>>         <meta attribute="eclassName">Error</meta> 
>>         <meta attribute="epackage">http:///.../base/flow.ecore</meta> 
>>         <many-to-one name="message"  
>> entity-name="...base.expression.Expression" cascade="all" lazy="false"  
>> insert="true" update="true" not-null="false"> 
>>             <column not-null="false" unique="false"  
>> name="`expression_message_id`"/> 
>>         </many-to-one> 
>>     </subclass> 
>> .... 
>> 
>> I think the problem is that the value of 'discriminator-value' is the  
>> same for the '...flow.Error' class and the '...context.Error' class. I  
>> havent found a property that influences this behavior. For me it is  
>> not clear why teneo explicitly set the attribute 'discriminator-value'  
>> because Hibernate uses the fully qulified class name per default (I  
>> think). 
>> 
>> Are there any solutions for this problem? 
>> 
>> thanks in advance, sascha 
>> 
>> 
>> 
>  
>
 |  
 |  
  |  
| Re: Strange DuplicateMappingException with Teneo [message #62734 is a reply to message #62710] | 
Fri, 24 November 2006 12:18    | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi Sascha, 
Hmmm, I need to check but I think that the referer computation does not take into account that the  
entityname is qualified (a bug). 
Can you send me (by email or on the newsgroup) the ecore file? I will look at the discriminator  
issue and this last issue you have. 
 
Can you enter a bugzilla for the discriminator issue (afaics this must be changed anyway). 
 
gr. Martin 
 
Sascha Theves wrote: 
> Hi Martin, 
>  
> I tried the workaround you described below. I have copied the hbm file  
> in the src folder (not in an particular java package) of my model plugin  
> and told teneo the use this file (via the  
> PersistenceOptions.USE_MAPPING_FILE Property). But it ended up in the  
> following NPE: 
>  
>  
> java.lang.NullPointerException 
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.computeReferers( HbDataStore.java:727)  
>  
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:162)  
>  
>     ... 
>  
>  
>  
> I looked at the code and tried to find out where the NPE comes from. The  
> snippet from which the NPE comes from is pasted below: 
>  
> if (ef == null) { // TODO can this happen? 
>                             isContainer =  
> prop.getCascadeStyle().hasOrphanDelete() 
>                                     || prop.getCascadeStyle() ==  
> CascadeStyle.ALL; 
>                             if (((Collection)  
> prop.getValue()).getElement() instanceof OneToMany) { 
>                                 final Collection coll = (Collection)  
> prop.getValue(); 
>                                 toEntity = ((OneToMany)  
> coll.getElement()).getReferencedEntityName(); 
>                             } else if (((Collection)  
> prop.getValue()).getElement() instanceof ManyToOne) { 
>                                 final Collection coll = (Collection)  
> prop.getValue(); 
>                                 toEntity = ((ManyToOne)  
> coll.getElement()).getReferencedEntityName(); 
>                             } else { 
>                                 throw new HbMapperException("Type " 
>                                         + ((Collection)  
> prop.getValue()).getElement().getClass().getName() 
>                                         + " not supported"); 
>                             } 
>                         } 
>  
> It seems that 'ef' (EStructuralFeature) is null. Then I looked where ef  
> comes from: 
>  
> final EStructuralFeature ef =  
> StoreUtil.getEStructuralFeature(pc.getEntityName(), prop.getName(), 
>                         getEPackages()); 
>  
> This method returns null for the EStructuralFeature although the  
> pc.getEntityName() ,prop.getName() and getEPackages() returning the  
> right values. 
>  
> Any ideas where this comes from? 
>  
> thanks for your help! 
>  
> Sascha 
>  
>  
>  
> Martin Taal schrieb: 
>> Hi Sascha, 
>> Can you try to manually repair the discriminator-value in the hbm file  
>> and then tell teneo to use the hbm file (there is an option for that)? 
>> Anyway this seems to be a bug, the discriminator value should also use  
>> the qualified name. But if you can test it then I am sure that this is  
>> the cause of this issue. 
>> 
>> The reason that discriminator is set is that in this way dynamic emf  
>> is supported (where all objects can be of the same class but  
>> representing different types/eclasses). 
>> 
>> gr. Martin 
>> 
>> Sascha Theves wrote: 
>>> Hi all, 
>>> 
>>> I am working on an application using EMF with the teneo project. I  
>>> followed the quick start guide on the elver.org site and it all works  
>>> fine for me. But when I am using my own EMF model, I messed up with  
>>> an DuplicateMappingException while trying to initialize the db scheme: 
>>> 
>>>  ------------------------------------------------------------ - 
>>> org.hibernate.DuplicateMappingException: duplicate import: Error  
>>> refers to both ...context.Error and ...flow.Error (try using  
>>> auto-import="false") 
>>>     at org.hibernate.cfg.Mappings.addImport(Mappings.java:141) 
>>>     at  
>>>  org.hibernate.cfg.HbmBinder.bindPersistentClassCommonValues( HbmBinder.java:614)  
>>> 
>>>     at org.hibernate.cfg.HbmBinder.bindClass(HbmBinder.java:527) 
>>>     at  org.hibernate.cfg.HbmBinder.bindSubclass(HbmBinder.java:809) 
>>>     at  org.hibernate.cfg.HbmBinder.handleSubclass(HbmBinder.java:22 10) 
>>>     at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:149) 
>>>     at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
>>>     at  org.hibernate.cfg.Configuration.addXML(Configuration.java:44 0) 
>>>     at  
>>>  org.eclipse.emf.teneo.hibernate.HbDataStore.mapModel(HbDataS tore.java:360)  
>>> 
>>>     at  
>>>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:155)  
>>> 
>>>     at ...DataStoreManager.initDataStore(DataStoreManager.java:73) 
>>>     at ...TestSomething.testSomething(TestSomething.java:26) 
>>>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>>>     at  
>>>  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39)  
>>> 
>>>     at  
>>>  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe thodAccessorImpl.java:25)  
>>> 
>>>     at java.lang.reflect.Method.invoke(Method.java:585) 
>>>     at junit.framework.TestCase.runTest(TestCase.java:154) 
>>>     at junit.framework.TestCase.runBare(TestCase.java:127) 
>>>     at junit.framework.TestResult$1.protect(TestResult.java:106) 
>>>     at  junit.framework.TestResult.runProtected(TestResult.java:124) 
>>>     at junit.framework.TestResult.run(TestResult.java:109) 
>>>     at junit.framework.TestCase.run(TestCase.java:118) 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer ence.run(JUnit3TestReference.java:128)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test Execution.java:38)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:460)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:673)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R emoteTestRunner.java:386)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner.java:196)  
>>> 
>>>  ------------------------------------------------------------ - 
>>> 
>>> The strange thing is that I used the property  
>>> PersistenceOptions.QUALIFY_ENTITY_NAME to get an prefix for the  
>>> mapped classes but anyway I get the exception! Here is my code wich I  
>>> use to init the db scheme: 
>>> 
>>>  ------------------------------------------------------------ - 
>>> // Set the database information, Environment is  
>>> org.hibernate.cfg.Environment 
>>>       final Properties props = new Properties(); 
>>>       props.setProperty(Environment.DRIVER, db_driver); 
>>>       props.setProperty(Environment.USER, db_user); 
>>>       props.setProperty(Environment.URL,  
>>> "jdbc:mysql://127.0.0.1:3306/" + db_name); 
>>>       props.setProperty(Environment.PASS, db_pass); 
>>>       props.setProperty(Environment.DIALECT,  
>>> org.hibernate.dialect.MySQLInnoDBDialect.class.getName()); 
>>> 
>>>       // persistance properties 
>>>       final Properties persistanceProps = new Properties(); 
>>> // HERE IS THE THE QUALIFY_ENTITY_NAME OPTION 
>>>      persistanceProps.setProperty(PersistenceOptions.QUALIFY_ENTI TY_NAME, 
>>>          PersistenceOptions.QUALIFY_ENTITY_NAME_NSPREFIX); 
>>> 
>>>       // create the HbDataStore 
>>>       HbDataStore hbds =  
>>> HbHelper.INSTANCE.createRegisterDataStore(hb_datastore); 
>>> 
>>>       // sets its epackages stored in this datastore 
>>>       hbds.setEPackages(new EPackage[] {BasePackage.eINSTANCE,  
>>> RulePackage.eINSTANCE, FlowPackage.eINSTANCE, 
>>>          ContextPackage.eINSTANCE, BindingPackage.eINSTANCE,  
>>> EnvironmentPackage.eINSTANCE, ExpressionPackage.eINSTANCE, 
>>>          MessagePackage.eINSTANCE, TestPackage.eINSTANCE,  
>>> WorkflowPackage.eINSTANCE}); 
>>> 
>>>       // set the relational database to use and other properties 
>>>       // to set Teneo specific options call  
>>> hbds.setPersistenceProperties 
>>>       hbds.setHibernateProperties(props); 
>>> 
>>>       // HERE ARE THE PROPS TO SET 
>>>       hbds.setPersistenceProperties(persistanceProps); 
>>> 
>>> 
>>>       // initialize, also creates the database tables 
>>>       hbds.initialize(); 
>>>  ------------------------------------------------------------ - 
>>> 
>>> Here is the snippet of the hibernate mapping file which were  
>>> generated for my EMF Model by teneo: 
>>> 
>>> .... 
>>> <subclass entity-name="...context.Error" abstract="false"  
>>> lazy="false" extends="...context.Class" discriminator-value="Error"> 
>>>         <meta attribute="eclassName">Error</meta> 
>>>         <meta attribute="epackage">http:///.../context.ecore</meta> 
>>>     </subclass> 
>>> .... 
>>> <subclass entity-name="...base.flow.Error" abstract="false"  
>>> lazy="false" extends="....flow.Statement" discriminator-value="Error"> 
>>>         <meta attribute="eclassName">Error</meta> 
>>>         <meta attribute="epackage">http:///.../base/flow.ecore</meta> 
>>>         <many-to-one name="message"  
>>> entity-name="...base.expression.Expression" cascade="all"  
>>> lazy="false" insert="true" update="true" not-null="false"> 
>>>             <column not-null="false" unique="false"  
>>> name="`expression_message_id`"/> 
>>>         </many-to-one> 
>>>     </subclass> 
>>> .... 
>>> 
>>> I think the problem is that the value of 'discriminator-value' is the  
>>> same for the '...flow.Error' class and the '...context.Error' class.  
>>> I havent found a property that influences this behavior. For me it is  
>>> not clear why teneo explicitly set the attribute  
>>> 'discriminator-value' because Hibernate uses the fully qulified class  
>>> name per default (I think). 
>>> 
>>> Are there any solutions for this problem? 
>>> 
>>> thanks in advance, sascha 
>>> 
>>> 
>>> 
>> 
>> 
 
 
--  
 
With Regards, Martin Taal 
 
Springsite/Elver.org 
Office: Hardwareweg 4, 3821 BV Amersfoort 
Postal: Nassaulaan 7, 3941 EC Doorn 
The Netherlands 
Tel: +31 (0)84 420 2397 
Fax: +31 (0)84 225 9307 
Mail: mtaal@springsite.com - mtaal@elver.org 
Web: www.springsite.com - www.elver.org
 |  
 |  
  |  
| Re: Strange DuplicateMappingException with Teneo [message #62796 is a reply to message #62710] | 
Sun, 26 November 2006 17:54   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi Sascha, 
After some more testing on my side. I think the npe is caused because the nsprefix contains dots  
(.). I have changed it to handle this better (not yet checked in). 
You can test it by changing the nsprefix of the epackage to something without dots (so instead of . 
http:///.../base/flow.ecore have http://base/flow.ecore as nsprefix). You need to regenerate the  
source code and hbm file also to test this. 
 
gr. Martin 
 
Sascha Theves wrote: 
> Hi Martin, 
>  
> I tried the workaround you described below. I have copied the hbm file  
> in the src folder (not in an particular java package) of my model plugin  
> and told teneo the use this file (via the  
> PersistenceOptions.USE_MAPPING_FILE Property). But it ended up in the  
> following NPE: 
>  
>  
> java.lang.NullPointerException 
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.computeReferers( HbDataStore.java:727)  
>  
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:162)  
>  
>     ... 
>  
>  
>  
> I looked at the code and tried to find out where the NPE comes from. The  
> snippet from which the NPE comes from is pasted below: 
>  
> if (ef == null) { // TODO can this happen? 
>                             isContainer =  
> prop.getCascadeStyle().hasOrphanDelete() 
>                                     || prop.getCascadeStyle() ==  
> CascadeStyle.ALL; 
>                             if (((Collection)  
> prop.getValue()).getElement() instanceof OneToMany) { 
>                                 final Collection coll = (Collection)  
> prop.getValue(); 
>                                 toEntity = ((OneToMany)  
> coll.getElement()).getReferencedEntityName(); 
>                             } else if (((Collection)  
> prop.getValue()).getElement() instanceof ManyToOne) { 
>                                 final Collection coll = (Collection)  
> prop.getValue(); 
>                                 toEntity = ((ManyToOne)  
> coll.getElement()).getReferencedEntityName(); 
>                             } else { 
>                                 throw new HbMapperException("Type " 
>                                         + ((Collection)  
> prop.getValue()).getElement().getClass().getName() 
>                                         + " not supported"); 
>                             } 
>                         } 
>  
> It seems that 'ef' (EStructuralFeature) is null. Then I looked where ef  
> comes from: 
>  
> final EStructuralFeature ef =  
> StoreUtil.getEStructuralFeature(pc.getEntityName(), prop.getName(), 
>                         getEPackages()); 
>  
> This method returns null for the EStructuralFeature although the  
> pc.getEntityName() ,prop.getName() and getEPackages() returning the  
> right values. 
>  
> Any ideas where this comes from? 
>  
> thanks for your help! 
>  
> Sascha 
>  
>  
>  
> Martin Taal schrieb: 
>> Hi Sascha, 
>> Can you try to manually repair the discriminator-value in the hbm file  
>> and then tell teneo to use the hbm file (there is an option for that)? 
>> Anyway this seems to be a bug, the discriminator value should also use  
>> the qualified name. But if you can test it then I am sure that this is  
>> the cause of this issue. 
>> 
>> The reason that discriminator is set is that in this way dynamic emf  
>> is supported (where all objects can be of the same class but  
>> representing different types/eclasses). 
>> 
>> gr. Martin 
>> 
>> Sascha Theves wrote: 
>>> Hi all, 
>>> 
>>> I am working on an application using EMF with the teneo project. I  
>>> followed the quick start guide on the elver.org site and it all works  
>>> fine for me. But when I am using my own EMF model, I messed up with  
>>> an DuplicateMappingException while trying to initialize the db scheme: 
>>> 
>>>  ------------------------------------------------------------ - 
>>> org.hibernate.DuplicateMappingException: duplicate import: Error  
>>> refers to both ...context.Error and ...flow.Error (try using  
>>> auto-import="false") 
>>>     at org.hibernate.cfg.Mappings.addImport(Mappings.java:141) 
>>>     at  
>>>  org.hibernate.cfg.HbmBinder.bindPersistentClassCommonValues( HbmBinder.java:614)  
>>> 
>>>     at org.hibernate.cfg.HbmBinder.bindClass(HbmBinder.java:527) 
>>>     at  org.hibernate.cfg.HbmBinder.bindSubclass(HbmBinder.java:809) 
>>>     at  org.hibernate.cfg.HbmBinder.handleSubclass(HbmBinder.java:22 10) 
>>>     at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:149) 
>>>     at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
>>>     at  org.hibernate.cfg.Configuration.addXML(Configuration.java:44 0) 
>>>     at  
>>>  org.eclipse.emf.teneo.hibernate.HbDataStore.mapModel(HbDataS tore.java:360)  
>>> 
>>>     at  
>>>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:155)  
>>> 
>>>     at ...DataStoreManager.initDataStore(DataStoreManager.java:73) 
>>>     at ...TestSomething.testSomething(TestSomething.java:26) 
>>>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>>>     at  
>>>  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39)  
>>> 
>>>     at  
>>>  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe thodAccessorImpl.java:25)  
>>> 
>>>     at java.lang.reflect.Method.invoke(Method.java:585) 
>>>     at junit.framework.TestCase.runTest(TestCase.java:154) 
>>>     at junit.framework.TestCase.runBare(TestCase.java:127) 
>>>     at junit.framework.TestResult$1.protect(TestResult.java:106) 
>>>     at  junit.framework.TestResult.runProtected(TestResult.java:124) 
>>>     at junit.framework.TestResult.run(TestResult.java:109) 
>>>     at junit.framework.TestCase.run(TestCase.java:118) 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer ence.run(JUnit3TestReference.java:128)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test Execution.java:38)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:460)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:673)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R emoteTestRunner.java:386)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner.java:196)  
>>> 
>>>  ------------------------------------------------------------ - 
>>> 
>>> The strange thing is that I used the property  
>>> PersistenceOptions.QUALIFY_ENTITY_NAME to get an prefix for the  
>>> mapped classes but anyway I get the exception! Here is my code wich I  
>>> use to init the db scheme: 
>>> 
>>>  ------------------------------------------------------------ - 
>>> // Set the database information, Environment is  
>>> org.hibernate.cfg.Environment 
>>>       final Properties props = new Properties(); 
>>>       props.setProperty(Environment.DRIVER, db_driver); 
>>>       props.setProperty(Environment.USER, db_user); 
>>>       props.setProperty(Environment.URL,  
>>> "jdbc:mysql://127.0.0.1:3306/" + db_name); 
>>>       props.setProperty(Environment.PASS, db_pass); 
>>>       props.setProperty(Environment.DIALECT,  
>>> org.hibernate.dialect.MySQLInnoDBDialect.class.getName()); 
>>> 
>>>       // persistance properties 
>>>       final Properties persistanceProps = new Properties(); 
>>> // HERE IS THE THE QUALIFY_ENTITY_NAME OPTION 
>>>      persistanceProps.setProperty(PersistenceOptions.QUALIFY_ENTI TY_NAME, 
>>>          PersistenceOptions.QUALIFY_ENTITY_NAME_NSPREFIX); 
>>> 
>>>       // create the HbDataStore 
>>>       HbDataStore hbds =  
>>> HbHelper.INSTANCE.createRegisterDataStore(hb_datastore); 
>>> 
>>>       // sets its epackages stored in this datastore 
>>>       hbds.setEPackages(new EPackage[] {BasePackage.eINSTANCE,  
>>> RulePackage.eINSTANCE, FlowPackage.eINSTANCE, 
>>>          ContextPackage.eINSTANCE, BindingPackage.eINSTANCE,  
>>> EnvironmentPackage.eINSTANCE, ExpressionPackage.eINSTANCE, 
>>>          MessagePackage.eINSTANCE, TestPackage.eINSTANCE,  
>>> WorkflowPackage.eINSTANCE}); 
>>> 
>>>       // set the relational database to use and other properties 
>>>       // to set Teneo specific options call  
>>> hbds.setPersistenceProperties 
>>>       hbds.setHibernateProperties(props); 
>>> 
>>>       // HERE ARE THE PROPS TO SET 
>>>       hbds.setPersistenceProperties(persistanceProps); 
>>> 
>>> 
>>>       // initialize, also creates the database tables 
>>>       hbds.initialize(); 
>>>  ------------------------------------------------------------ - 
>>> 
>>> Here is the snippet of the hibernate mapping file which were  
>>> generated for my EMF Model by teneo: 
>>> 
>>> .... 
>>> <subclass entity-name="...context.Error" abstract="false"  
>>> lazy="false" extends="...context.Class" discriminator-value="Error"> 
>>>         <meta attribute="eclassName">Error</meta> 
>>>         <meta attribute="epackage">http:///.../context.ecore</meta> 
>>>     </subclass> 
>>> .... 
>>> <subclass entity-name="...base.flow.Error" abstract="false"  
>>> lazy="false" extends="....flow.Statement" discriminator-value="Error"> 
>>>         <meta attribute="eclassName">Error</meta> 
>>>         <meta attribute="epackage">http:///.../base/flow.ecore</meta> 
>>>         <many-to-one name="message"  
>>> entity-name="...base.expression.Expression" cascade="all"  
>>> lazy="false" insert="true" update="true" not-null="false"> 
>>>             <column not-null="false" unique="false"  
>>> name="`expression_message_id`"/> 
>>>         </many-to-one> 
>>>     </subclass> 
>>> .... 
>>> 
>>> I think the problem is that the value of 'discriminator-value' is the  
>>> same for the '...flow.Error' class and the '...context.Error' class.  
>>> I havent found a property that influences this behavior. For me it is  
>>> not clear why teneo explicitly set the attribute  
>>> 'discriminator-value' because Hibernate uses the fully qulified class  
>>> name per default (I think). 
>>> 
>>> Are there any solutions for this problem? 
>>> 
>>> thanks in advance, sascha 
>>> 
>>> 
>>> 
>> 
>> 
 
 
--  
 
With Regards, Martin Taal 
 
Springsite/Elver.org 
Office: Hardwareweg 4, 3821 BV Amersfoort 
Postal: Nassaulaan 7, 3941 EC Doorn 
The Netherlands 
Tel: +31 (0)84 420 2397 
Fax: +31 (0)84 225 9307 
Mail: mtaal@springsite.com - mtaal@elver.org 
Web: www.springsite.com - www.elver.org
 |  
 |  
  |  
| Re: Strange DuplicateMappingException with Teneo [message #596140 is a reply to message #62659] | 
Fri, 24 November 2006 09:19   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi Sascha, 
Can you try to manually repair the discriminator-value in the hbm file and then tell teneo to use  
the hbm file (there is an option for that)? 
Anyway this seems to be a bug, the discriminator value should also use the qualified name. But if  
you can test it then I am sure that this is the cause of this issue. 
 
The reason that discriminator is set is that in this way dynamic emf is supported (where all objects  
can be of the same class but representing different types/eclasses). 
 
gr. Martin 
 
Sascha Theves wrote: 
> Hi all, 
>  
> I am working on an application using EMF with the teneo project. I  
> followed the quick start guide on the elver.org site and it all works  
> fine for me. But when I am using my own EMF model, I messed up with an  
> DuplicateMappingException while trying to initialize the db scheme: 
>  
>  ------------------------------------------------------------ - 
> org.hibernate.DuplicateMappingException: duplicate import: Error refers  
> to both ...context.Error and ...flow.Error (try using auto-import="false") 
>     at org.hibernate.cfg.Mappings.addImport(Mappings.java:141) 
>     at  
>  org.hibernate.cfg.HbmBinder.bindPersistentClassCommonValues( HbmBinder.java:614)  
>  
>     at org.hibernate.cfg.HbmBinder.bindClass(HbmBinder.java:527) 
>     at  org.hibernate.cfg.HbmBinder.bindSubclass(HbmBinder.java:809) 
>     at  org.hibernate.cfg.HbmBinder.handleSubclass(HbmBinder.java:22 10) 
>     at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:149) 
>     at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
>     at  org.hibernate.cfg.Configuration.addXML(Configuration.java:44 0) 
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.mapModel(HbDataS tore.java:360) 
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:155)  
>  
>     at ...DataStoreManager.initDataStore(DataStoreManager.java:73) 
>     at ...TestSomething.testSomething(TestSomething.java:26) 
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>     at  
>  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39)  
>  
>     at  
>  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe thodAccessorImpl.java:25)  
>  
>     at java.lang.reflect.Method.invoke(Method.java:585) 
>     at junit.framework.TestCase.runTest(TestCase.java:154) 
>     at junit.framework.TestCase.runBare(TestCase.java:127) 
>     at junit.framework.TestResult$1.protect(TestResult.java:106) 
>     at  junit.framework.TestResult.runProtected(TestResult.java:124) 
>     at junit.framework.TestResult.run(TestResult.java:109) 
>     at junit.framework.TestCase.run(TestCase.java:118) 
>     at  
>  org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer ence.run(JUnit3TestReference.java:128)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test Execution.java:38)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:460)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:673)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R emoteTestRunner.java:386)  
>  
>     at  
>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner.java:196)  
>  
>  ------------------------------------------------------------ - 
>  
> The strange thing is that I used the property  
> PersistenceOptions.QUALIFY_ENTITY_NAME to get an prefix for the mapped  
> classes but anyway I get the exception! Here is my code wich I use to  
> init the db scheme: 
>  
>  ------------------------------------------------------------ - 
> // Set the database information, Environment is  
> org.hibernate.cfg.Environment 
>       final Properties props = new Properties(); 
>       props.setProperty(Environment.DRIVER, db_driver); 
>       props.setProperty(Environment.USER, db_user); 
>       props.setProperty(Environment.URL, "jdbc:mysql://127.0.0.1:3306/"  
> + db_name); 
>       props.setProperty(Environment.PASS, db_pass); 
>       props.setProperty(Environment.DIALECT,  
> org.hibernate.dialect.MySQLInnoDBDialect.class.getName()); 
>  
>       // persistance properties 
>       final Properties persistanceProps = new Properties(); 
> // HERE IS THE THE QUALIFY_ENTITY_NAME OPTION 
>      persistanceProps.setProperty(PersistenceOptions.QUALIFY_ENTI TY_NAME, 
>          PersistenceOptions.QUALIFY_ENTITY_NAME_NSPREFIX); 
>  
>       // create the HbDataStore 
>       HbDataStore hbds =  
> HbHelper.INSTANCE.createRegisterDataStore(hb_datastore); 
>  
>       // sets its epackages stored in this datastore 
>       hbds.setEPackages(new EPackage[] {BasePackage.eINSTANCE,  
> RulePackage.eINSTANCE, FlowPackage.eINSTANCE, 
>          ContextPackage.eINSTANCE, BindingPackage.eINSTANCE,  
> EnvironmentPackage.eINSTANCE, ExpressionPackage.eINSTANCE, 
>          MessagePackage.eINSTANCE, TestPackage.eINSTANCE,  
> WorkflowPackage.eINSTANCE}); 
>  
>       // set the relational database to use and other properties 
>       // to set Teneo specific options call hbds.setPersistenceProperties 
>       hbds.setHibernateProperties(props); 
>  
>       // HERE ARE THE PROPS TO SET 
>       hbds.setPersistenceProperties(persistanceProps); 
>  
>  
>       // initialize, also creates the database tables 
>       hbds.initialize(); 
>  ------------------------------------------------------------ - 
>  
> Here is the snippet of the hibernate mapping file which were generated  
> for my EMF Model by teneo: 
>  
> .... 
> <subclass entity-name="...context.Error" abstract="false" lazy="false"  
> extends="...context.Class" discriminator-value="Error"> 
>         <meta attribute="eclassName">Error</meta> 
>         <meta attribute="epackage">http:///.../context.ecore</meta> 
>     </subclass> 
> .... 
> <subclass entity-name="...base.flow.Error" abstract="false" lazy="false"  
> extends="de.visualrules.base.flow.Statement" discriminator-value="Error"> 
>         <meta attribute="eclassName">Error</meta> 
>         <meta attribute="epackage">http:///.../base/flow.ecore</meta> 
>         <many-to-one name="message"  
> entity-name="...base.expression.Expression" cascade="all" lazy="false"  
> insert="true" update="true" not-null="false"> 
>             <column not-null="false" unique="false"  
> name="`expression_message_id`"/> 
>         </many-to-one> 
>     </subclass> 
> .... 
>  
> I think the problem is that the value of 'discriminator-value' is the  
> same for the '...flow.Error' class and the '...context.Error' class. I  
> havent found a property that influences this behavior. For me it is not  
> clear why teneo explicitly set the attribute 'discriminator-value'  
> because Hibernate uses the fully qulified class name per default (I think). 
>  
> Are there any solutions for this problem? 
>  
> thanks in advance, sascha 
>  
>  
>  
 
 
--  
 
With Regards, Martin Taal 
 
Springsite/Elver.org 
Office: Hardwareweg 4, 3821 BV Amersfoort 
Postal: Nassaulaan 7, 3941 EC Doorn 
The Netherlands 
Tel: +31 (0)84 420 2397 
Fax: +31 (0)84 225 9307 
Mail: mtaal@springsite.com - mtaal@elver.org 
Web: www.springsite.com - www.elver.org
 |  
 |  
  |  
| Re: Strange DuplicateMappingException with Teneo [message #596150 is a reply to message #62686] | 
Fri, 24 November 2006 11:56   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi Martin, 
 
I tried the workaround you described below. I have copied the hbm file  
in the src folder (not in an particular java package) of my model plugin  
and told teneo the use this file (via the  
PersistenceOptions.USE_MAPPING_FILE Property). But it ended up in the  
following NPE: 
 
 
java.lang.NullPointerException 
	at  
 org.eclipse.emf.teneo.hibernate.HbDataStore.computeReferers( HbDataStore.java:727) 
	at  
 org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:162) 
	... 
 
 
 
I looked at the code and tried to find out where the NPE comes from. The  
snippet from which the NPE comes from is pasted below: 
 
if (ef == null) { // TODO can this happen? 
							isContainer = prop.getCascadeStyle().hasOrphanDelete() 
									|| prop.getCascadeStyle() == CascadeStyle.ALL; 
							if (((Collection) prop.getValue()).getElement() instanceof  
OneToMany) { 
								final Collection coll = (Collection) prop.getValue(); 
								toEntity = ((OneToMany)  
coll.getElement()).getReferencedEntityName(); 
							} else if (((Collection) prop.getValue()).getElement() instanceof  
ManyToOne) { 
								final Collection coll = (Collection) prop.getValue(); 
								toEntity = ((ManyToOne)  
coll.getElement()).getReferencedEntityName(); 
							} else { 
								throw new HbMapperException("Type " 
										+ ((Collection) prop.getValue()).getElement().getClass().getName() 
										+ " not supported"); 
							} 
						} 
 
It seems that 'ef' (EStructuralFeature) is null. Then I looked where ef  
comes from: 
 
final EStructuralFeature ef =  
StoreUtil.getEStructuralFeature(pc.getEntityName(), prop.getName(), 
						getEPackages()); 
 
This method returns null for the EStructuralFeature although the  
pc.getEntityName() ,prop.getName() and getEPackages() returning the  
right values. 
 
Any ideas where this comes from? 
 
thanks for your help! 
 
Sascha 
 
 
 
Martin Taal schrieb: 
> Hi Sascha, 
> Can you try to manually repair the discriminator-value in the hbm file  
> and then tell teneo to use the hbm file (there is an option for that)? 
> Anyway this seems to be a bug, the discriminator value should also use  
> the qualified name. But if you can test it then I am sure that this is  
> the cause of this issue. 
>  
> The reason that discriminator is set is that in this way dynamic emf is  
> supported (where all objects can be of the same class but representing  
> different types/eclasses). 
>  
> gr. Martin 
>  
> Sascha Theves wrote: 
>> Hi all, 
>> 
>> I am working on an application using EMF with the teneo project. I  
>> followed the quick start guide on the elver.org site and it all works  
>> fine for me. But when I am using my own EMF model, I messed up with an  
>> DuplicateMappingException while trying to initialize the db scheme: 
>> 
>>  ------------------------------------------------------------ - 
>> org.hibernate.DuplicateMappingException: duplicate import: Error  
>> refers to both ...context.Error and ...flow.Error (try using  
>> auto-import="false") 
>>     at org.hibernate.cfg.Mappings.addImport(Mappings.java:141) 
>>     at  
>>  org.hibernate.cfg.HbmBinder.bindPersistentClassCommonValues( HbmBinder.java:614)  
>> 
>>     at org.hibernate.cfg.HbmBinder.bindClass(HbmBinder.java:527) 
>>     at  org.hibernate.cfg.HbmBinder.bindSubclass(HbmBinder.java:809) 
>>     at  org.hibernate.cfg.HbmBinder.handleSubclass(HbmBinder.java:22 10) 
>>     at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:149) 
>>     at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
>>     at  org.hibernate.cfg.Configuration.addXML(Configuration.java:44 0) 
>>     at  
>>  org.eclipse.emf.teneo.hibernate.HbDataStore.mapModel(HbDataS tore.java:360)  
>> 
>>     at  
>>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:155)  
>> 
>>     at ...DataStoreManager.initDataStore(DataStoreManager.java:73) 
>>     at ...TestSomething.testSomething(TestSomething.java:26) 
>>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>>     at  
>>  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39)  
>> 
>>     at  
>>  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe thodAccessorImpl.java:25)  
>> 
>>     at java.lang.reflect.Method.invoke(Method.java:585) 
>>     at junit.framework.TestCase.runTest(TestCase.java:154) 
>>     at junit.framework.TestCase.runBare(TestCase.java:127) 
>>     at junit.framework.TestResult$1.protect(TestResult.java:106) 
>>     at  junit.framework.TestResult.runProtected(TestResult.java:124) 
>>     at junit.framework.TestResult.run(TestResult.java:109) 
>>     at junit.framework.TestCase.run(TestCase.java:118) 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer ence.run(JUnit3TestReference.java:128)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test Execution.java:38)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:460)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:673)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R emoteTestRunner.java:386)  
>> 
>>     at  
>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner.java:196)  
>> 
>>  ------------------------------------------------------------ - 
>> 
>> The strange thing is that I used the property  
>> PersistenceOptions.QUALIFY_ENTITY_NAME to get an prefix for the mapped  
>> classes but anyway I get the exception! Here is my code wich I use to  
>> init the db scheme: 
>> 
>>  ------------------------------------------------------------ - 
>> // Set the database information, Environment is  
>> org.hibernate.cfg.Environment 
>>       final Properties props = new Properties(); 
>>       props.setProperty(Environment.DRIVER, db_driver); 
>>       props.setProperty(Environment.USER, db_user); 
>>       props.setProperty(Environment.URL,  
>> "jdbc:mysql://127.0.0.1:3306/" + db_name); 
>>       props.setProperty(Environment.PASS, db_pass); 
>>       props.setProperty(Environment.DIALECT,  
>> org.hibernate.dialect.MySQLInnoDBDialect.class.getName()); 
>> 
>>       // persistance properties 
>>       final Properties persistanceProps = new Properties(); 
>> // HERE IS THE THE QUALIFY_ENTITY_NAME OPTION 
>>      persistanceProps.setProperty(PersistenceOptions.QUALIFY_ENTI TY_NAME, 
>>          PersistenceOptions.QUALIFY_ENTITY_NAME_NSPREFIX); 
>> 
>>       // create the HbDataStore 
>>       HbDataStore hbds =  
>> HbHelper.INSTANCE.createRegisterDataStore(hb_datastore); 
>> 
>>       // sets its epackages stored in this datastore 
>>       hbds.setEPackages(new EPackage[] {BasePackage.eINSTANCE,  
>> RulePackage.eINSTANCE, FlowPackage.eINSTANCE, 
>>          ContextPackage.eINSTANCE, BindingPackage.eINSTANCE,  
>> EnvironmentPackage.eINSTANCE, ExpressionPackage.eINSTANCE, 
>>          MessagePackage.eINSTANCE, TestPackage.eINSTANCE,  
>> WorkflowPackage.eINSTANCE}); 
>> 
>>       // set the relational database to use and other properties 
>>       // to set Teneo specific options call hbds.setPersistenceProperties 
>>       hbds.setHibernateProperties(props); 
>> 
>>       // HERE ARE THE PROPS TO SET 
>>       hbds.setPersistenceProperties(persistanceProps); 
>> 
>> 
>>       // initialize, also creates the database tables 
>>       hbds.initialize(); 
>>  ------------------------------------------------------------ - 
>> 
>> Here is the snippet of the hibernate mapping file which were generated  
>> for my EMF Model by teneo: 
>> 
>> .... 
>> <subclass entity-name="...context.Error" abstract="false" lazy="false"  
>> extends="...context.Class" discriminator-value="Error"> 
>>         <meta attribute="eclassName">Error</meta> 
>>         <meta attribute="epackage">http:///.../context.ecore</meta> 
>>     </subclass> 
>> .... 
>> <subclass entity-name="...base.flow.Error" abstract="false"  
>> lazy="false" extends="....flow.Statement"  
>> discriminator-value="Error"> 
>>         <meta attribute="eclassName">Error</meta> 
>>         <meta attribute="epackage">http:///.../base/flow.ecore</meta> 
>>         <many-to-one name="message"  
>> entity-name="...base.expression.Expression" cascade="all" lazy="false"  
>> insert="true" update="true" not-null="false"> 
>>             <column not-null="false" unique="false"  
>> name="`expression_message_id`"/> 
>>         </many-to-one> 
>>     </subclass> 
>> .... 
>> 
>> I think the problem is that the value of 'discriminator-value' is the  
>> same for the '...flow.Error' class and the '...context.Error' class. I  
>> havent found a property that influences this behavior. For me it is  
>> not clear why teneo explicitly set the attribute 'discriminator-value'  
>> because Hibernate uses the fully qulified class name per default (I  
>> think). 
>> 
>> Are there any solutions for this problem? 
>> 
>> thanks in advance, sascha 
>> 
>> 
>> 
>  
>
 |  
 |  
  |  
| Re: Strange DuplicateMappingException with Teneo [message #596158 is a reply to message #62710] | 
Fri, 24 November 2006 12:18   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi Sascha, 
Hmmm, I need to check but I think that the referer computation does not take into account that the  
entityname is qualified (a bug). 
Can you send me (by email or on the newsgroup) the ecore file? I will look at the discriminator  
issue and this last issue you have. 
 
Can you enter a bugzilla for the discriminator issue (afaics this must be changed anyway). 
 
gr. Martin 
 
Sascha Theves wrote: 
> Hi Martin, 
>  
> I tried the workaround you described below. I have copied the hbm file  
> in the src folder (not in an particular java package) of my model plugin  
> and told teneo the use this file (via the  
> PersistenceOptions.USE_MAPPING_FILE Property). But it ended up in the  
> following NPE: 
>  
>  
> java.lang.NullPointerException 
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.computeReferers( HbDataStore.java:727)  
>  
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:162)  
>  
>     ... 
>  
>  
>  
> I looked at the code and tried to find out where the NPE comes from. The  
> snippet from which the NPE comes from is pasted below: 
>  
> if (ef == null) { // TODO can this happen? 
>                             isContainer =  
> prop.getCascadeStyle().hasOrphanDelete() 
>                                     || prop.getCascadeStyle() ==  
> CascadeStyle.ALL; 
>                             if (((Collection)  
> prop.getValue()).getElement() instanceof OneToMany) { 
>                                 final Collection coll = (Collection)  
> prop.getValue(); 
>                                 toEntity = ((OneToMany)  
> coll.getElement()).getReferencedEntityName(); 
>                             } else if (((Collection)  
> prop.getValue()).getElement() instanceof ManyToOne) { 
>                                 final Collection coll = (Collection)  
> prop.getValue(); 
>                                 toEntity = ((ManyToOne)  
> coll.getElement()).getReferencedEntityName(); 
>                             } else { 
>                                 throw new HbMapperException("Type " 
>                                         + ((Collection)  
> prop.getValue()).getElement().getClass().getName() 
>                                         + " not supported"); 
>                             } 
>                         } 
>  
> It seems that 'ef' (EStructuralFeature) is null. Then I looked where ef  
> comes from: 
>  
> final EStructuralFeature ef =  
> StoreUtil.getEStructuralFeature(pc.getEntityName(), prop.getName(), 
>                         getEPackages()); 
>  
> This method returns null for the EStructuralFeature although the  
> pc.getEntityName() ,prop.getName() and getEPackages() returning the  
> right values. 
>  
> Any ideas where this comes from? 
>  
> thanks for your help! 
>  
> Sascha 
>  
>  
>  
> Martin Taal schrieb: 
>> Hi Sascha, 
>> Can you try to manually repair the discriminator-value in the hbm file  
>> and then tell teneo to use the hbm file (there is an option for that)? 
>> Anyway this seems to be a bug, the discriminator value should also use  
>> the qualified name. But if you can test it then I am sure that this is  
>> the cause of this issue. 
>> 
>> The reason that discriminator is set is that in this way dynamic emf  
>> is supported (where all objects can be of the same class but  
>> representing different types/eclasses). 
>> 
>> gr. Martin 
>> 
>> Sascha Theves wrote: 
>>> Hi all, 
>>> 
>>> I am working on an application using EMF with the teneo project. I  
>>> followed the quick start guide on the elver.org site and it all works  
>>> fine for me. But when I am using my own EMF model, I messed up with  
>>> an DuplicateMappingException while trying to initialize the db scheme: 
>>> 
>>>  ------------------------------------------------------------ - 
>>> org.hibernate.DuplicateMappingException: duplicate import: Error  
>>> refers to both ...context.Error and ...flow.Error (try using  
>>> auto-import="false") 
>>>     at org.hibernate.cfg.Mappings.addImport(Mappings.java:141) 
>>>     at  
>>>  org.hibernate.cfg.HbmBinder.bindPersistentClassCommonValues( HbmBinder.java:614)  
>>> 
>>>     at org.hibernate.cfg.HbmBinder.bindClass(HbmBinder.java:527) 
>>>     at  org.hibernate.cfg.HbmBinder.bindSubclass(HbmBinder.java:809) 
>>>     at  org.hibernate.cfg.HbmBinder.handleSubclass(HbmBinder.java:22 10) 
>>>     at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:149) 
>>>     at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
>>>     at  org.hibernate.cfg.Configuration.addXML(Configuration.java:44 0) 
>>>     at  
>>>  org.eclipse.emf.teneo.hibernate.HbDataStore.mapModel(HbDataS tore.java:360)  
>>> 
>>>     at  
>>>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:155)  
>>> 
>>>     at ...DataStoreManager.initDataStore(DataStoreManager.java:73) 
>>>     at ...TestSomething.testSomething(TestSomething.java:26) 
>>>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>>>     at  
>>>  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39)  
>>> 
>>>     at  
>>>  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe thodAccessorImpl.java:25)  
>>> 
>>>     at java.lang.reflect.Method.invoke(Method.java:585) 
>>>     at junit.framework.TestCase.runTest(TestCase.java:154) 
>>>     at junit.framework.TestCase.runBare(TestCase.java:127) 
>>>     at junit.framework.TestResult$1.protect(TestResult.java:106) 
>>>     at  junit.framework.TestResult.runProtected(TestResult.java:124) 
>>>     at junit.framework.TestResult.run(TestResult.java:109) 
>>>     at junit.framework.TestCase.run(TestCase.java:118) 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer ence.run(JUnit3TestReference.java:128)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test Execution.java:38)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:460)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:673)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R emoteTestRunner.java:386)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner.java:196)  
>>> 
>>>  ------------------------------------------------------------ - 
>>> 
>>> The strange thing is that I used the property  
>>> PersistenceOptions.QUALIFY_ENTITY_NAME to get an prefix for the  
>>> mapped classes but anyway I get the exception! Here is my code wich I  
>>> use to init the db scheme: 
>>> 
>>>  ------------------------------------------------------------ - 
>>> // Set the database information, Environment is  
>>> org.hibernate.cfg.Environment 
>>>       final Properties props = new Properties(); 
>>>       props.setProperty(Environment.DRIVER, db_driver); 
>>>       props.setProperty(Environment.USER, db_user); 
>>>       props.setProperty(Environment.URL,  
>>> "jdbc:mysql://127.0.0.1:3306/" + db_name); 
>>>       props.setProperty(Environment.PASS, db_pass); 
>>>       props.setProperty(Environment.DIALECT,  
>>> org.hibernate.dialect.MySQLInnoDBDialect.class.getName()); 
>>> 
>>>       // persistance properties 
>>>       final Properties persistanceProps = new Properties(); 
>>> // HERE IS THE THE QUALIFY_ENTITY_NAME OPTION 
>>>      persistanceProps.setProperty(PersistenceOptions.QUALIFY_ENTI TY_NAME, 
>>>          PersistenceOptions.QUALIFY_ENTITY_NAME_NSPREFIX); 
>>> 
>>>       // create the HbDataStore 
>>>       HbDataStore hbds =  
>>> HbHelper.INSTANCE.createRegisterDataStore(hb_datastore); 
>>> 
>>>       // sets its epackages stored in this datastore 
>>>       hbds.setEPackages(new EPackage[] {BasePackage.eINSTANCE,  
>>> RulePackage.eINSTANCE, FlowPackage.eINSTANCE, 
>>>          ContextPackage.eINSTANCE, BindingPackage.eINSTANCE,  
>>> EnvironmentPackage.eINSTANCE, ExpressionPackage.eINSTANCE, 
>>>          MessagePackage.eINSTANCE, TestPackage.eINSTANCE,  
>>> WorkflowPackage.eINSTANCE}); 
>>> 
>>>       // set the relational database to use and other properties 
>>>       // to set Teneo specific options call  
>>> hbds.setPersistenceProperties 
>>>       hbds.setHibernateProperties(props); 
>>> 
>>>       // HERE ARE THE PROPS TO SET 
>>>       hbds.setPersistenceProperties(persistanceProps); 
>>> 
>>> 
>>>       // initialize, also creates the database tables 
>>>       hbds.initialize(); 
>>>  ------------------------------------------------------------ - 
>>> 
>>> Here is the snippet of the hibernate mapping file which were  
>>> generated for my EMF Model by teneo: 
>>> 
>>> .... 
>>> <subclass entity-name="...context.Error" abstract="false"  
>>> lazy="false" extends="...context.Class" discriminator-value="Error"> 
>>>         <meta attribute="eclassName">Error</meta> 
>>>         <meta attribute="epackage">http:///.../context.ecore</meta> 
>>>     </subclass> 
>>> .... 
>>> <subclass entity-name="...base.flow.Error" abstract="false"  
>>> lazy="false" extends="....flow.Statement" discriminator-value="Error"> 
>>>         <meta attribute="eclassName">Error</meta> 
>>>         <meta attribute="epackage">http:///.../base/flow.ecore</meta> 
>>>         <many-to-one name="message"  
>>> entity-name="...base.expression.Expression" cascade="all"  
>>> lazy="false" insert="true" update="true" not-null="false"> 
>>>             <column not-null="false" unique="false"  
>>> name="`expression_message_id`"/> 
>>>         </many-to-one> 
>>>     </subclass> 
>>> .... 
>>> 
>>> I think the problem is that the value of 'discriminator-value' is the  
>>> same for the '...flow.Error' class and the '...context.Error' class.  
>>> I havent found a property that influences this behavior. For me it is  
>>> not clear why teneo explicitly set the attribute  
>>> 'discriminator-value' because Hibernate uses the fully qulified class  
>>> name per default (I think). 
>>> 
>>> Are there any solutions for this problem? 
>>> 
>>> thanks in advance, sascha 
>>> 
>>> 
>>> 
>> 
>> 
 
 
--  
 
With Regards, Martin Taal 
 
Springsite/Elver.org 
Office: Hardwareweg 4, 3821 BV Amersfoort 
Postal: Nassaulaan 7, 3941 EC Doorn 
The Netherlands 
Tel: +31 (0)84 420 2397 
Fax: +31 (0)84 225 9307 
Mail: mtaal@springsite.com - mtaal@elver.org 
Web: www.springsite.com - www.elver.org
 |  
 |  
  |  
| Re: Strange DuplicateMappingException with Teneo [message #596187 is a reply to message #62710] | 
Sun, 26 November 2006 17:54   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi Sascha, 
After some more testing on my side. I think the npe is caused because the nsprefix contains dots  
(.). I have changed it to handle this better (not yet checked in). 
You can test it by changing the nsprefix of the epackage to something without dots (so instead of . 
http:///.../base/flow.ecore have http://base/flow.ecore as nsprefix). You need to regenerate the  
source code and hbm file also to test this. 
 
gr. Martin 
 
Sascha Theves wrote: 
> Hi Martin, 
>  
> I tried the workaround you described below. I have copied the hbm file  
> in the src folder (not in an particular java package) of my model plugin  
> and told teneo the use this file (via the  
> PersistenceOptions.USE_MAPPING_FILE Property). But it ended up in the  
> following NPE: 
>  
>  
> java.lang.NullPointerException 
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.computeReferers( HbDataStore.java:727)  
>  
>     at  
>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:162)  
>  
>     ... 
>  
>  
>  
> I looked at the code and tried to find out where the NPE comes from. The  
> snippet from which the NPE comes from is pasted below: 
>  
> if (ef == null) { // TODO can this happen? 
>                             isContainer =  
> prop.getCascadeStyle().hasOrphanDelete() 
>                                     || prop.getCascadeStyle() ==  
> CascadeStyle.ALL; 
>                             if (((Collection)  
> prop.getValue()).getElement() instanceof OneToMany) { 
>                                 final Collection coll = (Collection)  
> prop.getValue(); 
>                                 toEntity = ((OneToMany)  
> coll.getElement()).getReferencedEntityName(); 
>                             } else if (((Collection)  
> prop.getValue()).getElement() instanceof ManyToOne) { 
>                                 final Collection coll = (Collection)  
> prop.getValue(); 
>                                 toEntity = ((ManyToOne)  
> coll.getElement()).getReferencedEntityName(); 
>                             } else { 
>                                 throw new HbMapperException("Type " 
>                                         + ((Collection)  
> prop.getValue()).getElement().getClass().getName() 
>                                         + " not supported"); 
>                             } 
>                         } 
>  
> It seems that 'ef' (EStructuralFeature) is null. Then I looked where ef  
> comes from: 
>  
> final EStructuralFeature ef =  
> StoreUtil.getEStructuralFeature(pc.getEntityName(), prop.getName(), 
>                         getEPackages()); 
>  
> This method returns null for the EStructuralFeature although the  
> pc.getEntityName() ,prop.getName() and getEPackages() returning the  
> right values. 
>  
> Any ideas where this comes from? 
>  
> thanks for your help! 
>  
> Sascha 
>  
>  
>  
> Martin Taal schrieb: 
>> Hi Sascha, 
>> Can you try to manually repair the discriminator-value in the hbm file  
>> and then tell teneo to use the hbm file (there is an option for that)? 
>> Anyway this seems to be a bug, the discriminator value should also use  
>> the qualified name. But if you can test it then I am sure that this is  
>> the cause of this issue. 
>> 
>> The reason that discriminator is set is that in this way dynamic emf  
>> is supported (where all objects can be of the same class but  
>> representing different types/eclasses). 
>> 
>> gr. Martin 
>> 
>> Sascha Theves wrote: 
>>> Hi all, 
>>> 
>>> I am working on an application using EMF with the teneo project. I  
>>> followed the quick start guide on the elver.org site and it all works  
>>> fine for me. But when I am using my own EMF model, I messed up with  
>>> an DuplicateMappingException while trying to initialize the db scheme: 
>>> 
>>>  ------------------------------------------------------------ - 
>>> org.hibernate.DuplicateMappingException: duplicate import: Error  
>>> refers to both ...context.Error and ...flow.Error (try using  
>>> auto-import="false") 
>>>     at org.hibernate.cfg.Mappings.addImport(Mappings.java:141) 
>>>     at  
>>>  org.hibernate.cfg.HbmBinder.bindPersistentClassCommonValues( HbmBinder.java:614)  
>>> 
>>>     at org.hibernate.cfg.HbmBinder.bindClass(HbmBinder.java:527) 
>>>     at  org.hibernate.cfg.HbmBinder.bindSubclass(HbmBinder.java:809) 
>>>     at  org.hibernate.cfg.HbmBinder.handleSubclass(HbmBinder.java:22 10) 
>>>     at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:149) 
>>>     at org.hibernate.cfg.Configuration.add(Configuration.java:669) 
>>>     at  org.hibernate.cfg.Configuration.addXML(Configuration.java:44 0) 
>>>     at  
>>>  org.eclipse.emf.teneo.hibernate.HbDataStore.mapModel(HbDataS tore.java:360)  
>>> 
>>>     at  
>>>  org.eclipse.emf.teneo.hibernate.HbDataStore.initialize(HbDat aStore.java:155)  
>>> 
>>>     at ...DataStoreManager.initDataStore(DataStoreManager.java:73) 
>>>     at ...TestSomething.testSomething(TestSomething.java:26) 
>>>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
>>>     at  
>>>  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39)  
>>> 
>>>     at  
>>>  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe thodAccessorImpl.java:25)  
>>> 
>>>     at java.lang.reflect.Method.invoke(Method.java:585) 
>>>     at junit.framework.TestCase.runTest(TestCase.java:154) 
>>>     at junit.framework.TestCase.runBare(TestCase.java:127) 
>>>     at junit.framework.TestResult$1.protect(TestResult.java:106) 
>>>     at  junit.framework.TestResult.runProtected(TestResult.java:124) 
>>>     at junit.framework.TestResult.run(TestResult.java:109) 
>>>     at junit.framework.TestCase.run(TestCase.java:118) 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestRefer ence.run(JUnit3TestReference.java:128)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.TestExecution.run(Test Execution.java:38)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:460)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe sts(RemoteTestRunner.java:673)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(R emoteTestRunner.java:386)  
>>> 
>>>     at  
>>>  org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner.java:196)  
>>> 
>>>  ------------------------------------------------------------ - 
>>> 
>>> The strange thing is that I used the property  
>>> PersistenceOptions.QUALIFY_ENTITY_NAME to get an prefix for the  
>>> mapped classes but anyway I get the exception! Here is my code wich I  
>>> use to init the db scheme: 
>>> 
>>>  ------------------------------------------------------------ - 
>>> // Set the database information, Environment is  
>>> org.hibernate.cfg.Environment 
>>>       final Properties props = new Properties(); 
>>>       props.setProperty(Environment.DRIVER, db_driver); 
>>>       props.setProperty(Environment.USER, db_user); 
>>>       props.setProperty(Environment.URL,  
>>> "jdbc:mysql://127.0.0.1:3306/" + db_name); 
>>>       props.setProperty(Environment.PASS, db_pass); 
>>>       props.setProperty(Environment.DIALECT,  
>>> org.hibernate.dialect.MySQLInnoDBDialect.class.getName()); 
>>> 
>>>       // persistance properties 
>>>       final Properties persistanceProps = new Properties(); 
>>> // HERE IS THE THE QUALIFY_ENTITY_NAME OPTION 
>>>      persistanceProps.setProperty(PersistenceOptions.QUALIFY_ENTI TY_NAME, 
>>>          PersistenceOptions.QUALIFY_ENTITY_NAME_NSPREFIX); 
>>> 
>>>       // create the HbDataStore 
>>>       HbDataStore hbds =  
>>> HbHelper.INSTANCE.createRegisterDataStore(hb_datastore); 
>>> 
>>>       // sets its epackages stored in this datastore 
>>>       hbds.setEPackages(new EPackage[] {BasePackage.eINSTANCE,  
>>> RulePackage.eINSTANCE, FlowPackage.eINSTANCE, 
>>>          ContextPackage.eINSTANCE, BindingPackage.eINSTANCE,  
>>> EnvironmentPackage.eINSTANCE, ExpressionPackage.eINSTANCE, 
>>>          MessagePackage.eINSTANCE, TestPackage.eINSTANCE,  
>>> WorkflowPackage.eINSTANCE}); 
>>> 
>>>       // set the relational database to use and other properties 
>>>       // to set Teneo specific options call  
>>> hbds.setPersistenceProperties 
>>>       hbds.setHibernateProperties(props); 
>>> 
>>>       // HERE ARE THE PROPS TO SET 
>>>       hbds.setPersistenceProperties(persistanceProps); 
>>> 
>>> 
>>>       // initialize, also creates the database tables 
>>>       hbds.initialize(); 
>>>  ------------------------------------------------------------ - 
>>> 
>>> Here is the snippet of the hibernate mapping file which were  
>>> generated for my EMF Model by teneo: 
>>> 
>>> .... 
>>> <subclass entity-name="...context.Error" abstract="false"  
>>> lazy="false" extends="...context.Class" discriminator-value="Error"> 
>>>         <meta attribute="eclassName">Error</meta> 
>>>         <meta attribute="epackage">http:///.../context.ecore</meta> 
>>>     </subclass> 
>>> .... 
>>> <subclass entity-name="...base.flow.Error" abstract="false"  
>>> lazy="false" extends="....flow.Statement" discriminator-value="Error"> 
>>>         <meta attribute="eclassName">Error</meta> 
>>>         <meta attribute="epackage">http:///.../base/flow.ecore</meta> 
>>>         <many-to-one name="message"  
>>> entity-name="...base.expression.Expression" cascade="all"  
>>> lazy="false" insert="true" update="true" not-null="false"> 
>>>             <column not-null="false" unique="false"  
>>> name="`expression_message_id`"/> 
>>>         </many-to-one> 
>>>     </subclass> 
>>> .... 
>>> 
>>> I think the problem is that the value of 'discriminator-value' is the  
>>> same for the '...flow.Error' class and the '...context.Error' class.  
>>> I havent found a property that influences this behavior. For me it is  
>>> not clear why teneo explicitly set the attribute  
>>> 'discriminator-value' because Hibernate uses the fully qulified class  
>>> name per default (I think). 
>>> 
>>> Are there any solutions for this problem? 
>>> 
>>> thanks in advance, sascha 
>>> 
>>> 
>>> 
>> 
>> 
 
 
--  
 
With Regards, Martin Taal 
 
Springsite/Elver.org 
Office: Hardwareweg 4, 3821 BV Amersfoort 
Postal: Nassaulaan 7, 3941 EC Doorn 
The Netherlands 
Tel: +31 (0)84 420 2397 
Fax: +31 (0)84 225 9307 
Mail: mtaal@springsite.com - mtaal@elver.org 
Web: www.springsite.com - www.elver.org
 |  
 |  
  |   
Goto Forum:
 
 Current Time: Mon Nov 03 22:36:33 EST 2025 
 Powered by  FUDForum. Page generated in 0.05288 seconds  
 |