# Spring und JPA



## Gast2 (14. Sep 2010)

Hallo zusammen,

ich versuche gerade ein mit Spring DM und Eclipse Link zu arbeiten. Doch mein EntityManager ist immer null.

Meine xml config is:
[XML]
	<context:annotation-config />
	<context:load-time-weaver weaver-class="org.eclipse.equinox.weaving.springweaver.EquinoxAspectsLoadTimeWeaver"/>
	<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
	<context:component-scan base-package="db" annotation-config="true" />

	<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
		<property name="url" value="jdbc:derby:kunde;create=true" />
	</bean>

	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource"/>
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
[/XML]


Meine DAO:

```
public class DAO {

	@PersistenceContext
	private EntityManager entityManager;
```

Der Consolen log lautet:

```
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@92668c: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,loadTimeWeaver,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,dataSource,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,entityManagerFactory,transactionManager,tableview,dao]; root of factory hierarchy
14.09.2010 10:51:31 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean createNativeEntityManagerFactory
INFO: Building JPA container EntityManagerFactory for persistence unit 'kunde'
[El-Config]...
transformer added; Standard ClassFileTransformer wrapping JPA transformer: org.eclipse.persistence.internal.jpa.weaving.PersistenceWeaver@40d611
14.09.2010 10:51:31 org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext publishContextAsOsgiServiceIfNecessary
```

Ich hab die ganzen El-Config wo er die Tabellen generiert mal draußen gelassen. Die EntityManagerFactory wird ja generiert und ich dachte mit der PersistenceContext Annotation wird die Factory den EntityManager injecten. Klappt leider nicht hat jemand eine Idee oder sieht ein Fehler in der config?


----------



## Gast2 (14. Sep 2010)

Hab mal versucht den loadTimeWeaver direkt anzugeben und oben wegzulassen
[XML]
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  		<property name="loadTimeWeaver">
    		<bean class="org.eclipse.equinox.weaving.springweaver.EquinoxAspectsLoadTimeWeaver"/>
  		</property>
  		<property name="dataSource" ref="dataSource"/>
	</bean>
[/XML]

jetzt hab ich war ein entitymanager aber auf einmal wird der driver nicht mehr gefunden aber ich das derby bundle hinzugefügt und die Tabelle wird auch angelegt beim starten:

```
14.09.2010 13:47:21 org.springframework.osgi.extender.internal.activator.ContextLoaderListener start
INFO: Starting [org.springframework.osgi.extender] bundle v.[1.2.1]
14.09.2010 13:47:21 org.springframework.osgi.extender.internal.support.ExtenderConfiguration <init>
INFO: No custom extender configuration detected; using defaults...
14.09.2010 13:47:21 org.springframework.scheduling.timer.TimerTaskExecutor afterPropertiesSet
INFO: Initializing Timer
14.09.2010 13:47:21 org.springframework.osgi.extender.support.DefaultOsgiApplicationContextCreator createApplicationContext
INFO: Discovered configurations {osgibundle:/META-INF/spring/*.xml} in bundle [RCP (Eclipse.Link.RCP; singleton:=true)]
14.09.2010 13:47:21 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing OsgiBundleXmlApplicationContext(bundle=Eclipse.Link.RCP, config=osgibundle:/META-INF/spring/*.xml): startup date [Tue Sep 14 13:47:21 CEST 2010]; root of context hierarchy
14.09.2010 13:47:21 org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext unpublishContextAsOsgiService
INFO: Application Context service already unpublished
14.09.2010 13:47:21 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from URL [bundleentry://97.fwk25724761/META-INF/spring/spring-db.xml]
14.09.2010 13:47:22 org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor stageOne
INFO: No outstanding OSGi service dependencies, completing initialization for OsgiBundleXmlApplicationContext(bundle=Eclipse.Link.RCP, config=osgibundle:/META-INF/spring/*.xml)
14.09.2010 13:47:22 org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'org.eclipse.equinox.weaving.springweaver.EquinoxAspectsLoadTimeWeaver#9300cc' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
14.09.2010 13:47:22 org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'dataSource' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
14.09.2010 13:47:22 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean createNativeEntityManagerFactory
INFO: Building JPA container EntityManagerFactory for persistence unit 'kunde'
[EL Config]: 2010-09-14 13:47:22.898--The access type for the persistent class [class db.Kunde] is set to [PROPERTY].
[EL Config]: 2010-09-14 13:47:22.929--The alias name for the entity class [class db.Kunde] is being defaulted to: Kunde.
[EL Config]: 2010-09-14 13:47:22.929--The table name for entity [class db.Kunde] is being defaulted to: KUNDE.
[EL Config]: 2010-09-14 13:47:22.929--The column name for element [method getId] is being defaulted to: ID.
[EL Config]: 2010-09-14 13:47:22.945--The column name for element [method getVerheiratet] is being defaulted to: VERHEIRATET.
[EL Config]: 2010-09-14 13:47:22.945--The column name for element [method getName] is being defaulted to: NAME.
[EL Config]: 2010-09-14 13:47:22.945--The column name for element [method getGrußwort] is being defaulted to: GRUSSWORT.
transformer added; Standard ClassFileTransformer wrapping JPA transformer: org.eclipse.persistence.internal.jpa.weaving.PersistenceWeaver@18c6cbc
14.09.2010 13:47:22 org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
INFO: Bean 'entityManagerFactory' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
14.09.2010 13:47:22 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@182c132: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,dataSource,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,entityManagerFactory,transactionManager,tableview,dao]; root of factory hierarchy
14.09.2010 13:47:23 org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext publishContextAsOsgiServiceIfNecessary
INFO: Publishing application context as OSGi service with properties {org.springframework.context.service.name=Eclipse.Link.RCP, Bundle-SymbolicName=Eclipse.Link.RCP, Bundle-Version=1.0.0.qualifier}
14.09.2010 13:47:23 org.springframework.osgi.extender.internal.support.DefaultOsgiBundleApplicationContextListener onOsgiApplicationEvent
INFO: Application context successfully refreshed (OsgiBundleXmlApplicationContext(bundle=Eclipse.Link.RCP, config=osgibundle:/META-INF/spring/*.xml))
[EL Info]: 2010-09-14 13:47:26.632--EclipseLink, version: Eclipse Persistence Services - 2.0.1.v20100213-r6600
[EL Severe]: 2010-09-14 13:47:26.632--Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
Error Code: 0
	at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:309)
	at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:138)
	at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
	at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
	at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
	at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:423)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:485)
	at $Proxy6.createEntityManager(Unknown Source)
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:234)
	at $Proxy9.merge(Unknown Source)
	at db.DAO.createKunde(DAO.java:17)
	at db.TableView$1.widgetDefaultSelected(TableView.java:42)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:119)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2629)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2593)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2427)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:670)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:663)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at eclipse.link.rcp.Application.start(Application.java:20)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1146)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:882)
	at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:126)
	... 45 more
Caused by: java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at org.eclipse.core.runtime.internal.adaptor.ContextFinder.loadClass(ContextFinder.java:129)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1138)
	... 47 more

!SESSION 2010-09-14 13:47:20.820 -----------------------------------------------
eclipse.buildId=unknown
```


----------



## Gelöschtes Mitglied 5909 (14. Sep 2010)

1. du hast die init methode der DataSource vergessen
2. hast du den treiber als import package drinnen?
3. Load Time Weaving und OSGi verträgt sich nicht gut.
-> entweder nimmst du static weaving (beim bauen)
-> oder du verzichtest auf weaving (Lazy Loading und Spezialsachen gehn nicht) und lässt den ganz weg

Und das fehlt auch noch:

[xml]
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
[/xml]


----------



## Gast2 (14. Sep 2010)

raiL hat gesagt.:


> 1. du hast die init methode der DataSource vergessen
> 2. hast du den treiber als import package drinnen?
> 3. Load Time Weaving und OSGi verträgt sich nicht gut.
> -> entweder nimmst du static weaving (beim bauen)
> ...



zu 1 was muss in der initmethode drin stehen?
zu 2 hab ich sogar als required bundle drin
zu 3 darum hab ich ja dass hier verwendet Martin Lippert: Load-Time Weaving for Spring-DM

und die bean hab ich doch auch drin...


----------



## Gast2 (15. Sep 2010)

Muss ich die embedded derby irgendwie manuell hochfahren?
Oder sogar das das client derby bundle benutzen?


----------



## Gast2 (15. Sep 2010)

Also hab jetzt nochmal die derby konfiguriert
Step 1: Install Software
Die Sample.java läuft bei mir einwandfrei...

und hab mal die jar anstatt das osgi bundle verwendet gleiches ergebnis:
Das witzige ist wenn ich beim starten den driver lade bekomme ich keine exception ...

```
public void start(BundleContext context) throws Exception {
		try {
			Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		super.start(context);
		plugin = this;
	}
```


```
15.09.2010 13:46:39 org.springframework.osgi.extender.internal.activator.ContextLoaderListener start
INFO: Starting [org.springframework.osgi.extender] bundle v.[1.2.1]
15.09.2010 13:46:39 org.springframework.osgi.extender.internal.support.ExtenderConfiguration <init>
INFO: No custom extender configuration detected; using defaults...
15.09.2010 13:46:39 org.springframework.scheduling.timer.TimerTaskExecutor afterPropertiesSet
INFO: Initializing Timer
15.09.2010 13:46:40 org.springframework.osgi.extender.support.DefaultOsgiApplicationContextCreator createApplicationContext
INFO: Discovered configurations {osgibundle:/META-INF/spring/*.xml} in bundle [RCP (Eclipse.Link.RCP; singleton:=true)]
15.09.2010 13:46:40 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing OsgiBundleXmlApplicationContext(bundle=Eclipse.Link.RCP, config=osgibundle:/META-INF/spring/*.xml): startup date [Wed Sep 15 13:46:40 CEST 2010]; root of context hierarchy
15.09.2010 13:46:40 org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext unpublishContextAsOsgiService
INFO: Application Context service already unpublished
15.09.2010 13:46:40 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from URL [bundleentry://114.fwk25724761/META-INF/spring/spring-db.xml]
15.09.2010 13:46:40 org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor stageOne
INFO: No outstanding OSGi service dependencies, completing initialization for OsgiBundleXmlApplicationContext(bundle=Eclipse.Link.RCP, config=osgibundle:/META-INF/spring/*.xml)
15.09.2010 13:46:40 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@33c3e6: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,loadTimeWeaver,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,dataSource,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,entityManagerFactory,transactionManager,tableview,dao]; root of factory hierarchy
15.09.2010 13:46:41 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean createNativeEntityManagerFactory
INFO: Building JPA container EntityManagerFactory for persistence unit 'kunde'
[EL Config]: 2010-09-15 13:46:41.6--The access type for the persistent class [class db.Kunde] is set to [PROPERTY].
[EL Config]: 2010-09-15 13:46:41.631--The alias name for the entity class [class db.Kunde] is being defaulted to: Kunde.
[EL Config]: 2010-09-15 13:46:41.631--The table name for entity [class db.Kunde] is being defaulted to: KUNDE.
[EL Config]: 2010-09-15 13:46:41.631--The column name for element [method getId] is being defaulted to: ID.
[EL Config]: 2010-09-15 13:46:41.631--The column name for element [method getVerheiratet] is being defaulted to: VERHEIRATET.
[EL Config]: 2010-09-15 13:46:41.631--The column name for element [method getName] is being defaulted to: NAME.
[EL Config]: 2010-09-15 13:46:41.631--The column name for element [method getGrußwort] is being defaulted to: GRUSSWORT.
transformer added; Standard ClassFileTransformer wrapping JPA transformer: org.eclipse.persistence.internal.jpa.weaving.PersistenceWeaver@13d4c49
15.09.2010 13:46:41 org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext publishContextAsOsgiServiceIfNecessary
INFO: Publishing application context as OSGi service with properties {org.springframework.context.service.name=Eclipse.Link.RCP, Bundle-SymbolicName=Eclipse.Link.RCP, Bundle-Version=1.0.0.qualifier}
15.09.2010 13:46:41 org.springframework.osgi.extender.internal.support.DefaultOsgiBundleApplicationContextListener onOsgiApplicationEvent
INFO: Application context successfully refreshed (OsgiBundleXmlApplicationContext(bundle=Eclipse.Link.RCP, config=osgibundle:/META-INF/spring/*.xml))
[EL Info]: 2010-09-15 13:46:43.709--EclipseLink, version: Eclipse Persistence Services - 2.0.1.v20100213-r6600
[EL Severe]: 2010-09-15 13:46:43.709--Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
Error Code: 0
	at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:309)
	at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:138)
	at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
	at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
	at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
	at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
	at org.springframework.orm.jpa.JpaTransactionManager.createEntityManagerForTransaction(JpaTransactionManager.java:400)
	at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:321)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:354)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:103)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)
	at db.DAO$$EnhancerByCGLIB$$1d24161.createKunde(<generated>)
	at db.TableView$1.widgetDefaultSelected(TableView.java:42)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:119)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2629)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2593)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2427)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:670)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:663)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at eclipse.link.rcp.Application.start(Application.java:20)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1146)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:882)
	at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:126)
	... 43 more
Caused by: java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at org.eclipse.core.runtime.internal.adaptor.ContextFinder.loadClass(ContextFinder.java:129)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1138)
	... 45 more

!SESSION 2010-09-15 13:46:38.881 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.6.0_16
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_DE
Framework arguments:  -product Eclipse.Link.RCP.starter
Command-line arguments:  -product Eclipse.Link.RCP.starter -data C:\Dokumente und Einstellungen\melzer.DIG-INT\workspace/../runtime-startet.product -dev file:C:/Dokumente und Einstellungen/melzer.DIG-INT/workspace/.metadata/.plugins/org.eclipse.pde.core/startet.product/dev.properties -os win32 -ws win32 -arch x86 -consoleLog

!ENTRY org.eclipse.ui 4 0 2010-09-15 13:46:43.709
!MESSAGE Unhandled event loop exception
!STACK 0
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
Error Code: 0
	at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:382)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:354)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:103)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)
	at db.DAO$$EnhancerByCGLIB$$1d24161.createKunde(<generated>)
	at db.TableView$1.widgetDefaultSelected(TableView.java:42)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:119)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2629)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2593)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2427)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:670)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:663)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at eclipse.link.rcp.Application.start(Application.java:20)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
Error Code: 0
	at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:397)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
	at org.springframework.orm.jpa.JpaTransactionManager.createEntityManagerForTransaction(JpaTransactionManager.java:400)
	at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:321)
	... 33 more
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
Error Code: 0
	at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:309)
	at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:138)
	at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
	at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
	at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
	at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
	... 38 more
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1146)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:882)
	at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:126)
	... 43 more
Caused by: java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at org.eclipse.core.runtime.internal.adaptor.ContextFinder.loadClass(ContextFinder.java:129)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1138)
	... 45 more
```


----------



## Gelöschtes Mitglied 5909 (17. Sep 2010)

Hast dus mittlerweile geschafft? Ansonsten mach ich dir morgen mal ein lauffähiges Beispiel.

Hatte gestern leider Verbindungsprobleme und konnte nicht ins Internet.


----------



## Gast2 (17. Sep 2010)

Nee leider nicht... 
Des wäre nett =)...


----------



## Gelöschtes Mitglied 5909 (18. Sep 2010)

Ich hab dir mal ein einfaches Beispiel mit einem PersonDao gemacht.

Allerdings habe ich nicht derby sondern h2 genommen, was aber denke ich keinen unterschied macht.

Als JPA Implementierung habe ich EclipseLink 2.1 genommen, da sich das besser mit OSGi verträgt als Hibernate.

Weaving habe ich ausgeschaltet, da wie von mir bereits erwähnt LoadTimeWeaving

a) langsam ist
b) mit OSGi sehr tricky ist (ich habe es auch mit den ganzen Blog einträgen des fähigen Martin Lippert und Co nicht hinbekommen)

Wenn du Weaving verwenden willst, dann verwende static-weaving

Das hängt von deinem Build-Prozess ab (ANT/Maven)

Using EclipseLink JPA Extensions (ELUG) - Eclipsepedia

Für das kleine Beispiel habe ich weder ant noch maven verwendet, da ich heut noch was anderes zu tun habe 

Ein paar hints noch:

1. Warum habe ich nicht direkt das EntityBean verwendet?

Weil man sich sonst den ganzen Business Logik Code mit javax.persistence dependencies zumüllt

2. Ich habe in dem DAO DynamicImport-Package: * verwendet.

Mach das bitte nicht in richtigen Code, das ist sehr dreckig. Ich war nur zu faul mir die "versteckten" dependencies zu importen.
Deshalb steht das in diesem Beispiel dinn.

Im Anhang sind einmal die eigenen plugins als binary und sourcen. Außerdem ist auf dem screenshot noch die verwendete target-platform zu sehen. Es kann sein, dass da zu viele Plugins drinnen sind -> keine zeit/bock die jetzt alle einzeln rauszusuchen.

Ich werde dir per PM noch einen Link mit dem kompletten workspace und ein executable binary schicken.

Wenn du noch Fragen hast bezüglich OSGi, Spring DM und co, dann kannst du dich gerne an mich wenden. Ich denke mittlerweile kenn ich mich ganz gut damit aus und kenn auch den ein oder anderen Stolperstein.

Wobei ich dir (noch) nicht helfen kann ist der build-prozess. 

Wenn ich zeit habe und es jemand braucht kann ich auch noch n billiges web-bundle bauen mit tomcat in osgi.
(D.h. Das OSGi Framework startet Tomcat in process)

Ich hoff ich hab nix vergessen und konnte dir helfen. Falls du Fragen hast, immer her damit. (Kann aber sein dass ich dir heute nicht mehr Antworten kann).


----------



## Gast2 (19. Sep 2010)

Danke für die ausführliche Antwort und die Mühe. Werd ich mir die nächsten Tage mal anschauen und wenns net klappt frag ich nochmal ...


----------



## Gast2 (20. Sep 2010)

Okay ich hätte noch ne Frage zum weaving, wenn ich das auschalte welche Nachteile/Vorteile ergeben sich dann?

EDIT: Klasse wenn das weaving draußen ist tuuuuuuut es einwandfrei =) ...


----------



## Gelöschtes Mitglied 5909 (20. Sep 2010)

Na dann bin ich ja froh, dass ich dir helfen konnte 



> Weaving is a technique of manipulating the byte-code of compiled Java classes. The EclipseLink JPA persistence provider uses weaving to enhance JPA entities for such things as lazy loading, change tracking, fetch groups, and internal optimizations.
> 
> Weaving can be performed either dynamically at runtime, when Entities are loaded, or statically at compile time by post-processing the Entity .class files.



Alles außer lazy loading nutzt man im normalfall eh nicht würd ich sagen. Und von den "internal optimazations" hab ich nix mitkriegt, zumindest was die Geschwindigkeit betrifft.

Im übrigen nutzt dir lazy loading wenig, wenn du DTOs verwendest. Und wenn du keine DTOs verwendest hast du den ganzen javax.persistence kram in deiner Business logik.


----------



## Noctarius (21. Sep 2010)

raiL hat gesagt.:


> Alles außer lazy loading nutzt man im normalfall eh nicht würd ich sagen. Und von den "internal optimazations" hab ich nix mitkriegt, zumindest was die Geschwindigkeit betrifft.



Sehe ich ganz ähnlich. Allerdings werden alle weiteren Änderungen an den Klassen auch beim StaticWeaving vorgenommen und das Meiste ist eher für die interne Funktionalität gedacht, z.B. ChangeTracking, damit nur Daten zum Datenbankserver übermittelt werden, die sich echt geändert haben.


----------



## Gast2 (21. Sep 2010)

Ja StaticWeaving habe ich noch nicht versucht, da es mit für so ein kleines Übungsprojekt zu stressig war einen extra build prozess zu machen, da der RCP ja einen mitbringt. Und das Weaving von Martin Lippert hat wie gesagt nicht geklappt. Darum lass ich es erstmal draußen


----------



## Gast2 (21. Sep 2010)

Wuäh jetzt hab ich meine EclipseLink Version auf 2.1.1 geupgradet und bekomm ich folgendes Problem:

```
SCHWERWIEGEND: Application context refresh failed (OsgiBundleXmlApplicationContext(bundle=mdk.verwaltung.dao, config=osgibundle:/META-INF/spring/*.xml))
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in URL [bundleentry://91.fwk31401995/META-INF/spring/context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [bundleentry://91.fwk31401995/META-INF/spring/context.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [default] failed.
Internal Exception: Exception [EclipseLink-7305] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.ValidationException
Exception Description: An exception was thrown while processing the mapping file from URL: [bundleresource://91.fwk31401995:1/META-INF/orm.xml],
error using JPA 1.0 orm.xsd was [Exception [EclipseLink-25008] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A descriptor with default root element entity-mappings was not found in the project],
error using eclipselink-orm.xsd was [Exception [EclipseLink-25008] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A descriptor with default root element entity-mappings was not found in the project],
error using JPA 2.0 orm.xsd is in cause.
Internal Exception: Exception [EclipseLink-25008] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A descriptor with default root element entity-mappings was not found in the project
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1045)
	at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.registerBeanPostProcessors(AbstractDelegatedExecutionApplicationContext.java:542)
	at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.registerBeanPostProcessors(AbstractDelegatedExecutionApplicationContext.java:486)
	at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:336)
	at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
	at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320)
	at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [bundleentry://91.fwk31401995/META-INF/spring/context.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [default] failed.
```

Schon mal gehört?


----------



## Gelöschtes Mitglied 5909 (21. Sep 2010)

> Exception Description: Predeployment of PersistenceUnit [default] failed.



Heißt deine PU default? Wenn nein, dann hat er die persistence.xml wohl nicht gefunden.
Die persistence.xml muss in dem gleichen bundle sein, in dem du die EntityManagerFactory für die PU der persistence.xml erzeugst.



> Exception Description: A descriptor with default root element entity-mappings was not found in the project],
> error using JPA 2.0 orm.xsd is in cause.



Könnte aber auch heißten, dass er eine orm.xml sucht und sie nicht findet. Probier mal eine orm.xml abzulegen (gleiches verzeichniss wie persistence.xml), aber ohne Inhalt:

[xml]<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
        http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">
</persistence>
[/xml]

Wenn das immernoch nicht funktioniert, poste mal deine Verzeichnisstruktur


----------



## Gast2 (21. Sep 2010)

jop meine PU heißt default und ich hab auch eine orm.xml wie gesagt mit EclipseLink 2.01 hats funktioniert. Grad auf EclipseLink 2.1.1 gewechselt aber kann auch sein dass Teneo ne korrupte orm.xml erzeugt hat. Ich lad mal 3.6 mit Teneo runter da sah die orm.xml besser aus vielleichts liegts auch daran. Kann mit der Fehlermeldung net viel anfangen.


----------



## Gast2 (23. Sep 2010)

Kann man einen TransactionManager auch als OSGi-Service bereit stellen?

a)
[XML]
<osgi:service id="transactionManagerService" ref="transactionManager" interface="org.springframework.transaction.support.ResourceTransactionManager"/>
[/XML]
b)
[XML]
<osgi:reference id="transactionManager" interface="org.springframework.transaction.support.ResourceTransactionManager"/>
[/XML]
damit ich in meinem service bundle transaktione anlegen kann

```
public class ServiceImpl implements Service{

@Autowired
private DAO dao;
	@Transactional(propagation = Propagation.REQUIRED)
	@Override
	public void delete(Long id) {
		dao.deleteByID(id);
	}
```


----------



## Noctarius (23. Sep 2010)

Theoretisch würde ich jetzt sagen: Ja kann er aber praktisch bin ich mir gerade nicht ganz sicher wegen eventuellen Classloading-Issues durch die unterschiedlichen Bundle-Classloader. Es wird vermutlich von der Implementierung abhängen - ergo ausprobieren


----------



## Gast2 (23. Sep 2010)

okay tut ... 
Die Frage war eher darauf bezogen, ob es einen Nachteil gibt es so zu machen?


----------



## Gelöschtes Mitglied 5909 (23. Sep 2010)

Ich hab ein ähnliches problem: 

Unten hab ich x dao bundles (alle mit einener PU/EMF und TXM), die haben alle required. dann hab ich ein oder zwei oder vielleicht auch drei service schichten die die daos nutzen und auf oberster ebene möchte ich requires_new machen.

wenn du ne lösung findest sag bescheid, ich werd ich den nächsten paar tagen nicht dazu kommen


----------



## Gast2 (23. Sep 2010)

Ja bei mir hat es einfach wie oben funktioniert. Einfach als OSGi Service deklariert und bei den anderen reference gemacht! Kann ich dir morgen mal hier posten.

Aber was noch nicht ganz funkioniert, ist den getCriteriaBuilder holen bekomm ich immer ne NPE weiß nicht ob es einen Zusammenhang gibt. Ich sende es morgen einfach mal.


----------



## Noctarius (23. Sep 2010)

Ich denke schon, dass es den Zusammenhang gibt. Ich sage ja: Classloading Issues


----------



## Gast2 (24. Sep 2010)

Klappt bei mir aber auch nicht wenn ich nur ein TransaktionManager habe, darum denk ich das Problem liegt woanders.


```
public <T extends DBObject> List<T> findAll(Class<T> entityClass){
		CriteriaBuilder builder = entityManager.getCriteriaBuilder();
		CriteriaQuery<T> criteriaQuery = builder.createQuery(entityClass);
		return entityManager.createQuery(criteriaQuery).getResultList();
	}
```


```
java.lang.NullPointerException
	at java.lang.Class.searchMethods(Unknown Source)
	at java.lang.Class.getDeclaredMethod(Unknown Source)
	at org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getDeclaredMethod(PrivilegedAccessHelper.java:236)
	at org.eclipse.persistence.internal.jpa.metamodel.ManagedTypeImpl.getTypeClassFromAttributeOrMethodLevelAccessor(ManagedTypeImpl.java:1378)
	at org.eclipse.persistence.internal.jpa.metamodel.SingularAttributeImpl.<init>(SingularAttributeImpl.java:96)
	at org.eclipse.persistence.internal.jpa.metamodel.ManagedTypeImpl.initialize(ManagedTypeImpl.java:1308)
	at org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.initialize(MetamodelImpl.java:400)
	at org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.<init>(MetamodelImpl.java:101)
	at org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.<init>(MetamodelImpl.java:120)
	at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.getMetamodel(EntityManagerSetupImpl.java:1996)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getMetamodel(EntityManagerFactoryImpl.java:495)
	at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getCriteriaBuilder(EntityManagerFactoryImpl.java:478)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:423)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:485)
	at $Proxy9.getCriteriaBuilder(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:176)
	at $Proxy12.getCriteriaBuilder(Unknown Source)
	at emf.dao.internal.BaseDaoEclispeLink.findAll(BaseDaoEclispeLink.java:68)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
	at $Proxy13.findAll(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
	at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58)
	at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:56)
	at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:39)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	at $Proxy15.findAll(Unknown Source)
	at handler.View$1.widgetSelected(View.java:55)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2629)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2593)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2427)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:670)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:663)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at emfrcp.Application.start(Application.java:20)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
```


Wenn ich hingegen ne "normale" Abfrage mache klappt es. Wie gesagt die NPE kommt bei entityManager.getCriteriaBuilder()? Muss ich noch irgendwas setzen um den zu benutzen?

```
entityManager.createQuery("Select v from Verwaltung v")
```


----------



## Gast2 (24. Sep 2010)

Hallo hier ist mal mein Beispiel, wo es eigentlich funktioniert und ich keine Probleme habe.

Im emf_test_feature habe ich alle notwendigen Bundles die benötigt werden und die product Datei zum starten. 

Zu Erklärung vielleicht kurz die einzelnen Bundles:
1.emf-rcp: Ist ein kleiner RCP, wenn man auf den Button test drückt wird ein Service ausgeführt. Die nebula widgets hab ich drin, weil ich das Databinding testen wollte.
2.emf-test: Ist das EMF Model. Mit Teneo habe ich die orm.xml generieren lassen.
3. emf-dao: Ist ein DAO drin und stellt den TransaktionManager als OSGi- Service zu Verfügung.
4. emf.service: Ist der Service drin, der eine neue Transaktion aufmacht. Referenziert den Transaktionmanager von emf-dao.


----------



## Gelöschtes Mitglied 5909 (25. Sep 2010)

Ich hab das gestern mal im Geschäft ausprobiert, das Problem ist nur dass ich viele bundles habe die alle einen eigen PU / EMF /TXM haben. Das geht dann aber nicht mehr. Habe beide TXMs veröffentlicht und in meinem Service Context Referenziert. 

Geht aber aus mehreren Gründen so nicht:

- jeder EMF kann eine eigene (physikalische)  Connection halten. 
- Spring kann die Transaktionen über mehrere TXMs hinweg nicht joinen

1. Versuch:
- Ein globaler TXM
-> Problem TXM braucht EMF -> habe viele EMFs -> geht nicht


Lösung wird warscheinlich sein, alle DAOs in ein Bundle rein zu stecken (die Implementierung) sodass man dann nur einen TXM und eine EMF hat. Den TXM kann ich dann als Service veröffentlichen und in meinen High level Services referenzieren.

Wenn man es richtig macht hat man mit OSGi echt sehr sehr viele bundles am ende... und ich bin jetzt schon bei ca 150 (incl spring dm) und das nur beim Server


----------



## Gast2 (25. Sep 2010)

Man muss halt das richtige Maß finden und nicht zu granular machen sonst wirds unübersichtlich.
Spricht ja auch nichts dagegen nur ein DAO bundle zu machen finde ich besser wie mehrere...

Kannst du den CriteriaBuilder benutzen oder bekommst du auch ne NPE?


----------



## Gelöschtes Mitglied 5909 (25. Sep 2010)

Ich hab den ehrlich gesagt noch nicht benutzt, da mir die API irgendwie zu umständlich ist. 
Kanns aber mal ausprobieren. (Hab die kommende Woche aber Urlaub)


----------



## Gast2 (25. Sep 2010)

Ja wäre nett wenn du es mal probierst...
Ja ich find ihn gut um dynmaische standard abfragen zu machen...


----------



## Gelöschtes Mitglied 5909 (25. Sep 2010)

Was genau meinst du mit dynamischen standardabfragen? du kannst dir z.b. den entitynamen mit der annotation auslesen


----------



## Gast2 (27. Sep 2010)

Ja sowas hier: Aber leider bekomm ich wie gesagt immer ne NPE be  entityManager.getCriteriaBuilder()

```
@Transactional(propagation = Propagation.MANDATORY, readOnly = true)
	public <T extends DBObject> List<T> like(Class<T> entityClass, Map<String, Object> criterias){
		CriteriaBuilder builder = entityManager.getCriteriaBuilder();
		CriteriaQuery<T> criteriaQuery = builder.createQuery(entityClass);
		Root<T> root = criteriaQuery.from(entityClass);
		List<Predicate> restrictions = new ArrayList<Predicate>();
		for(Map.Entry<String, Object> entry : criterias.entrySet()){
			if(entry.getValue() instanceof String){
				Path<String> path = root.get(entry.getKey());
				restrictions.add(builder.like(path, String.valueOf(entry.getValue())));	
			}else{
				restrictions.add(builder.equal(root.get(entry.getKey()), entry.getValue()));
			}
		}
		criteriaQuery.where((Predicate[]) restrictions.toArray());
		return entityManager.createQuery(criteriaQuery).getResultList();
	}
```


----------



## Noctarius (27. Sep 2010)

Hast du mal das SpringJpaDingsDaTemplate probiert?


----------



## Gast2 (27. Sep 2010)

Meinst du das hier unter Punkt 12.6.2?
Chapter12.Object Relational Mapping (ORM) data access


----------



## Noctarius (27. Sep 2010)

Genau das HibernateDaoSupport kannst du auch nutzen, wenn du pures Hibernate nutzen magst. Ansonsten gibt es auch ein JpaDaoSupport dafür (mein ich). Damit werden dir alle Dinge automatisch injiziert.


----------



## Gast2 (27. Sep 2010)

Noctarius hat gesagt.:


> Genau das HibernateDaoSupport kannst du auch nutzen, wenn du pures Hibernate nutzen magst. Ansonsten gibt es auch ein JpaDaoSupport dafür (mein ich). Damit werden dir alle Dinge automatisch injiziert.



Okay muss ich mal testen... Nee ich benutz EclipseLink darum wohl kein HibernateDaoSupport ...
Wunder mich trotzdem noch ein bischen, dass das andere nicht geht...


----------



## Noctarius (27. Sep 2010)

Geht sicher anders, aber wenn du Spring benutzt, wieso dann nicht die Vorteile gleich mit benutzen.


----------



## maki (27. Sep 2010)

Wobei man das Spring JPA Template eigentlich nicht einsetzen sollte laut Doku


----------



## Gast2 (27. Sep 2010)

maki hat gesagt.:


> Wobei man das Spring JPA Template eigentlich nicht einsetzen sollte laut Doku



lol super^^...


----------



## Noctarius (27. Sep 2010)

maki hat gesagt.:


> Wobei man das Spring JPA Template eigentlich nicht einsetzen sollte laut Doku



Hu? Oo Wieso das?

edit: Das Beispiel nutzt doch deren Spring JPA Support Class? Oo Getting Started With JPA in Spring 2.0 | SpringSource Team Blog


----------



## maki (27. Sep 2010)

Hmm.. gute Frage.

Laut Doku sollte das JpaTemplate zumindest nicht mehr direkt verwendet werden:JpaTemplate (Spring Framework API 2.5)
JpaDaoSupport darf man aber nochv erwenden: JpaDaoSupport (Spring Framework API 2.5)
Dieses nutzt intern aber anscheinend wieder das JpaTemplate...

*verwirrt*


----------



## Gast2 (27. Sep 2010)

Immer noch gleiches Problem: "Normale" Abfragen gehen aber beim CriteriaBuilder holen bekomm ich ne NPE...

```
@Transactional(propagation = Propagation.MANDATORY, readOnly = true)
	public <T extends DBObject> List<T> findAll(Class<T> entityClass){
		CriteriaBuilder builder = getJpaTemplate().getEntityManager().getCriteriaBuilder();
		CriteriaQuery<T> criteriaQuery = builder.createQuery(entityClass);
		return getJpaTemplate().getEntityManager().createQuery(criteriaQuery).getResultList();
	}
```


----------



## Gast2 (27. Sep 2010)

Ich hab nochmal ein paar Seiten im Netz gefunden und auch paar Einträge in andere Foren gesehen.
Wenn man EMF benutzt sollte man speichern und laden über Resourcen machen
z.B. Kunde ist ein EMF Model


```
public void createKunde(Kunde kunde) {
		String query = EclipseLinkURIUtil.createContentsEqualQuery(kunde.eClass(), VerwaltungPackage.eINSTANCE.getDBObject_Id(),kunde.getId());
		URI libraryURI = EclipseLinkURIUtil.createEclipseLinkURI("verwaltung",query);

		// save library model instance in database
		ResourceSet resourceSet1 = new ResourceSetImpl();
		resourceSet1.getLoadOptions().put(
				PersistenceUnitProperties.CLASSLOADER,
				this.getClass().getClassLoader());
		Resource libraryResource1 = resourceSet1.createResource(libraryURI);

		libraryResource1.getContents().add(kunde);
		try {
			libraryResource1.save(Collections.EMPTY_MAP);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println(kunde.eResource());
	}
```
Wie das mit Transaktionen funktioniert weiß ich noch nicht ob ich da die von Spring verwenden kann. Aber auf jeden Fall brauchen die Resourcen folgende Einträge in der persitence.xml
[XML]
			<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:derby:sample;create=true" />
			<property name="javax.persistence.jdbc.user" value="" />
			<property name="javax.persistence.jdbc.password" value="" />
[/XML]

Das sind genau die gleichen wie in meiner spring.xml
[XML]
	<bean id="dataSource" init-method="createDataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
		<property name="url" value="jdbc:derby:sample;create=true" />
		<property name="username" value="" />
		<property name="password" value="" />
	</bean>
[/XML]

Das beist doch jetzt das doppelt zu machen, hat damit schon jemand Erfahrungen gemacht? Weil ich habs jetzt raus gemacht und meine entityManagerFactory sieht nun so aus

```
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="verwaltung"></property>
		<property name="jpaDialect">
			<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"></bean>
		</property>
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"></bean>	
		</property>
	</bean>
```


----------



## Gast2 (28. Sep 2010)

Ich hab nun herausgefunden, dass die  Resourcen intern org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl verwenden, d.h. wenn ich wie oben meine EntityManagerFactory erstelle, hab ich 2 verschiedene EntityManagerFactory darum benutzt der TransaktionManager auch die falsche EntityManagerFactory...
Ich wollte nun den org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl injecten aber da der 2 Konstruktoren, die verschiedene objekte übergeben haben wollen, habe ich einen Wrapper gemacht. Kann ich den überhaupt benutzen???

```
package emf.dao.internal;

import java.util.Map;
import java.util.Properties;

import javax.persistence.Cache;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnitUtil;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.metamodel.Metamodel;

import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.jpa.PersistenceProvider;

public class EclipseLinkEntityManager implements EntityManagerFactory{

	private EntityManagerFactory entityManagerFactory;
	private String persistenceUnitName;
	
	public void init(){
		entityManagerFactory = new PersistenceProvider().createEntityManagerFactory(persistenceUnitName, getTestPersistenceUnitProperties());
	}
	
	public Properties getTestPersistenceUnitProperties(){
		Properties properties = new Properties();
		ClassLoader classLoader = this.getClass().getClassLoader();
		properties.put(PersistenceUnitProperties.CLASSLOADER, classLoader);
		return properties;
		
	}

	@Override
	public EntityManager createEntityManager() {
		return entityManagerFactory.createEntityManager();
	}

	@Override
	public EntityManager createEntityManager(Map map) {
		return entityManagerFactory.createEntityManager(map);
	}

	@Override
	public CriteriaBuilder getCriteriaBuilder() {
		return entityManagerFactory.getCriteriaBuilder();
	}

	@Override
	public Metamodel getMetamodel() {
		return entityManagerFactory.getMetamodel();
	}

	@Override
	public boolean isOpen() {
		return entityManagerFactory.isOpen();
	}

	@Override
	public void close() {
		entityManagerFactory.close();
		
	}

	@Override
	public Map<String, Object> getProperties() {
		return entityManagerFactory.getProperties();
	}

	@Override
	public Cache getCache() {
		return entityManagerFactory.getCache();
	}

	@Override
	public PersistenceUnitUtil getPersistenceUnitUtil() {
		return entityManagerFactory.getPersistenceUnitUtil();
	}

	public void setPersistenceUnitName(String persistenceUnitName) {
		this.persistenceUnitName = persistenceUnitName;
	}

	public String getPersistenceUnitName() {
		return persistenceUnitName;
	}

	
}
```

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlnssgi="http://www.springframework.org/schema/osgi"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
Index of /schema/context http://www.springframework.org/schema/context/spring-context.xsd
Index of /schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
Index of /schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

	<context:annotation-config/>
	<tx:annotation-driven transaction-manager="transactionManager"/>

	<!-- <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>-->
	<!-- <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />-->

	<bean id="entityManagerFactory" class="emf.dao.internal.EclipseLinkEntityManager" init-method="init">
		<property name="persistenceUnitName" value="default"></property>
		<!--<property name="jpaDialect">
			<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"></bean>
		</property>
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"></bean>	
		</property>-->
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    	<property name="entityManagerFactory" ref="entityManagerFactory"/>
		<property name="jpaDialect">
			<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"></bean>
		</property>
  	</bean>

	<bean id="baseDao" class="emf.dao.internal.BaseDaoEclispeLink"/>

</beans>
[/XML]

So wird die @PersistenceContext immer ignoriert:

```
@PersistenceContext
	private EntityManager entityManager;
```

Wenn ich das bean rein mache bekomme ich eine Fehlermeldung
[XML]
 <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
[/XML]

```
Caused by: java.lang.NoClassDefFoundError: javax.persistence.criteria.CriteriaQuery
```

Wo liegt mein Denkfehler? Oder ist das allgemein ne dumme Idee?


----------



## Noctarius (28. Sep 2010)

Benutz eine FactoryBean Implementierung. So wird das in Spring gemacht. Alternativ nehm Constructor-Injection (auch das kann Spring )


----------



## Gast2 (28. Sep 2010)

Noctarius hat gesagt.:


> Alternativ nehm Constructor-Injection (auch das kann Spring )



Ja das weiß ich ... Aber ich weiß nicht woher ich die Objekte bekomm um die dem Konstruktor zu übergeben.


----------



## Noctarius (28. Sep 2010)

XML -> Property EntityManagerFactoryBean -> Getter / Setter


----------



## Gast2 (29. Sep 2010)

Ja ich glaub wir reden aneinander vorbei ^^...

Aber des was ich vor hatte klappt eh nicht, da wie ich gesehen hab die Klasse jedes mal einen neuen EntityManager erzeugt. Also entweder ich erb von der Klasse und überschreib die Methode und lass den EntityManager von Spring injezieren oder benutz die Resource API von EMF gar nicht. Ich wollte die nur benutzen um das TrackingModification zu benutzen, aber das wird nicht unterstützt wie ich gerade sehe.


```
public class EclipseLinkResourceImpl extends ResourceImpl implements EclipseLinkResource 
	protected void openDatabase(Map<?, ?> options) {
		Assert.isNotNull(options);

		try {
			// entity manager factory for given persistence unit name already
			// existing?
			EntityManagerFactoryInstance entityManagerFactoryInstance;
			if (!persistenceUnitNameToEntityManagerFactoryInstanceMap.containsKey(persistenceUnitName)) {
				// create and register new entity manager factory for given persistence
				// unit name according to sessions configuration file
				Assert.isTrue(options.containsKey(PersistenceUnitProperties.CLASSLOADER), NLS.bind(
						Messages.assert_classloaderMustHavePersistenceUnit$0OnClasspath, persistenceUnitName));
				EntityManagerFactory entityManagerFactory = new PersistenceProvider().createEntityManagerFactory(
						persistenceUnitName, options);
				Assert.isTrue(entityManagerFactory != null, NLS.bind(
						Messages.assert_unableToCreateEntityManangerFactoryforPersistenceUnit$0, persistenceUnitName));
				entityManagerFactoryInstance = new EntityManagerFactoryInstance(entityManagerFactory);
				persistenceUnitNameToEntityManagerFactoryInstanceMap.put(persistenceUnitName,
						entityManagerFactoryInstance);
			} else {
				// retrieve existing entity manager factory for given persistence unit
				// name
				entityManagerFactoryInstance = persistenceUnitNameToEntityManagerFactoryInstanceMap
						.get(persistenceUnitName);
			}

			// increase EclipseLink resource instance counter for underlying entity
			// manager factory
			int count = entityManagerFactoryInstance.getResourceInstanceCount();
			count++;
			entityManagerFactoryInstance.setResourceInstanceCount(count);

			// create entity manager and begin transaction
			EntityManagerFactory entityManagerFactory = entityManagerFactoryInstance.getEntityManagerFactory();
			entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
		} catch (RuntimeException exception) {
			closeDatabase();
			throw new WrappedException(exception);
		}
	}

	@Override
	public final boolean isTrackingModification() {
		return false;
	}

	@Override
	public final void setTrackingModification(boolean isTrackingModification) {
		// do nothing
	}

	@Override
	public boolean isModified() {
		return false;
	}

	@Override
	public void setModified(boolean isModified) {
		// do nothing
	}
```


----------



## Noctarius (29. Sep 2010)

EclipseLink macht doch selber ModificationTracking


----------



## Gast2 (29. Sep 2010)

Echt und wie kann ich es nutzen?

Ich habe ein Objekt und würde gern in meinem RCP - Editor im isDirty anzeigen lassen,wenn sich was geändert hat, damit man speichern kann.


----------



## Noctarius (29. Sep 2010)

EclipseLink macht das intern um nur Felder in der Datenbank zu ändern die auch wirklich geändert wurden. Das siehst du, wenn du dir die SQL-Statements anzeigen lässt.


----------



## Gast2 (29. Sep 2010)

Noctarius hat gesagt.:


> EclipseLink macht das intern um nur Felder in der Datenbank zu ändern die auch wirklich geändert wurden. Das siehst du, wenn du dir die SQL-Statements anzeigen lässt.



Aso das meinst du, ja das habe ich beim consolen output schon gesehen. Aber bringt mir nichts wenn ich es nicht auswerten kann =(.


----------



## Noctarius (29. Sep 2010)

Achso du willst auf das ChangeTracking zugreifen? hmm ok.

Zur Not AOP Proxy der die passenden set-Methoden abfängt und irgendwo einen Vermerk macht


----------



## Gast2 (29. Sep 2010)

Mhm ja mal schauen^^ hört sich nicht nach einer sauberen Lösung an.

Ich hol mal bischen weiter aus fürs bessere Verständniss meines Problems.

Ich habe meine Models mit EMF generieren lassen und mit Teneo die orm.xml gemacht. Das hat ganz gut geklappt. 
Dann wollte ich eine saubere Lösung finden für die isDirty Methode in einem Eclipse RCP Editor. Und ich wollte natürlich nur das Speichern anbieten wenn das Objekt auch dirty ist bzw. wenn was geändert wurde (sowie beim Eclipse Java Editor). Dann hat mir wildcard gesagt benutz Resourcen für das speichern und laden von EMF Models die unterstützen die TrackingModification. Wo ich mir dann den src angeschaut hab wird das für EclipseLinkResource (siehe oben) nicht unterstützt und die Abfragen mit EclipseLinkResource sind auch sehr umständlich und um alle Abfragen durchzuführen muss man die Klasse teilweise selbst implmenentieren.
Joa und deshalb such ich gerade ne andere Möglichkeit , um das sauber hinzukriegen. Vielleicht bietet EMF oder so noch ne Möglichkeit für changes.


----------



## Noctarius (29. Sep 2010)

Ja aber dann ist eine AOP-Proxy-Version doch super. Du musst ja nicht mal wissen welches Feld geändert wurde, sondern nur generell ob was geändert ist.

Ergo Mini-Interceptor welcher das originale Objekt rausgeben kann (für EclipseLink / JPA) und ansonsten alle Set-Methoden abfängt und isDirty auf true setzt.


----------



## Gast2 (29. Sep 2010)

Okay muss ich mir mal durchlesen wie sowas geht noch nie gemacht


----------



## Gelöschtes Mitglied 5909 (29. Sep 2010)

Also ich würde im RCP Editor nicht auf dem Original Objekt arbeiten sondern auf einer Kopie.
Wenn beim Speichern was schiefgeht, was zeigst du an?

Um rauszufinden ob sich was geändert hat, kann man einfach die Kopie mit dem Original vergleichen.
Wenn das Speichern fehlschlägt, kann man wieder das original Kopieren.

Wenn der User nicht Speichern will (Abbrechen), was machst du dann? Du musst es neu laden.
Mit der Kopie nicht nötig. 

etc.

Das ganze kann man dan noch hübsch verpacken (als aufgebohrten Proxy) und dann kann man auch richtig hübsch dami arbeiten


----------



## Noctarius (29. Sep 2010)

Auch eine hübsche Idee


----------



## Gelöschtes Mitglied 5909 (29. Sep 2010)

Für equals und hashcode kann man dann sowas nehmen (Kann man ja für den eigenen Bedarf noch anpassen):

Annotation driven equals and hashCode - JBoss Community


```
@Override
    public boolean equals(Object obj) {
        return BeanUtils.equals(this, obj);
    }
 
    @Override
    public int hashCode() {
        return BeanUtils.hashCode(this);
    }
 
    @Override
    public String toString() {
        return BeanUtils.toString(this);
    }
```

Den Spaß kann man dann noch in ne Abstrakte klasse auslagern und dann ist davon garnix im eigentlichen Pojo. Bei Bedarf kann man das dann auch überschreiben wie man will (Besser als AOP und Co finde ich).

Und fürs kopieren kann man auch Serialisierung verwenden, sind ja eh alles nur pojos (sollten es zumindest sein denk ich). Ist zwar ein wenig langsamer als clone, aber darauf kommts nicht an (das wird man normalerweise nicht merken).

Und der Code bleibt schön sauber. Komplexe Objekthierarchien mit Maps etc sind für den Client sowieso ungeeignet,
von daher bekommst du da im normalfall auch keine Probleme.


----------



## Gast2 (29. Sep 2010)

raiL hat gesagt.:


> Also ich würde im RCP Editor nicht auf dem Original Objekt arbeiten sondern auf einer Kopie.
> Wenn beim Speichern was schiefgeht, was zeigst du an?
> 
> Um rauszufinden ob sich was geändert hat, kann man einfach die Kopie mit dem Original vergleichen.
> ...



Ja so ähnlich habe ich bis jetzt gemacht ein dirtyObjekt und ein normales Objekt und die immer mit EcoreUtils.equals miteinander verglichen... 
Nicht speichern geht ja nur wenn du den Editor schließt also kannst auch das Objekt wegschmeißen  und bei öffnen des neuen Editor kannst es neu laden.


----------



## Gelöschtes Mitglied 5909 (29. Sep 2010)

Ecore gehört zu EMF oder? Damit müsst ich mich mal beschäftigen, das scheint ja echt gut zu sein. Besonders Wildcard schwärmt ja immer davon 

Gibt so viel interessantes und man hat so wenig zeit...


----------



## Gast2 (29. Sep 2010)

raiL hat gesagt.:


> Ecore gehört zu EMF oder? Damit müsst ich mich mal beschäftigen, das scheint ja echt gut zu sein. Besonders Wildcard schwärmt ja immer davon
> 
> Gibt so viel interessantes und man hat so wenig zeit...



Richtig ... Das mit der Zeit ist immer das Problem


----------

