# SpringDM, JPA(Eclipselink), OSGi



## lfischer (6. Apr 2010)

Hallo zusammen,

ich möchte unter der eclipse IDE eine Anwendung mit folgendem Aufbau erstellen:

- eclipse RCP als Frontend --> equinox als OSGi Container
- eclipselink als JPA implementation (Version 2.0.1)
- Spring DM (Version 2.0.0.M1) für DI und zur Nutzung der ganzen Spring Hilfimplementationen (z.Bsp. JpaDao) (Version 3.0.2)

Dazu habe ich eine targetplatform mit den notwendigen bundles zusammengestellt und einen launcher konfiguriert.

Um den diversen import-export problemen vorzubeugen, habe ich zunächst nur 1 bundle für den Nicht-UI-Teil. In diesem sind die Domain-Klassen mit ihren JPA-Annotations, Service- und Dao-Implementationen enthalten. Weiterhin gibt es eine persistence.xml fürs eclipselink und eine context.xml für spring.

Bei der Verwendung der insert-Methode des JpaDaos für eine Entity erhalte ich folgende Fehlermeldung:



> org.springframework.dao.InvalidDataAccessApiUsageException: Object: de.reschif.lims.common.domain.User@9de832 is not a known entity type.; nested exception is java.lang.IllegalArgumentException: Object: de.reschif.lims.common.domain.User@9de832 is not a known entity type.
> at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102)
> at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
> at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1350)
> ... 15 more



Das log gibt vorher aber aus, dass das mapping von eclipselink verarbeitet worden ist. Ich gehe daher davon aus, dass der Fehler nicht in der persistence.xml liegt.



> [EL Config]: The access type for the persistent class [class de.reschif.lims.common.domain.DefaultDomainObject] is set to [FIELD].
> [EL Config]: The access type for the persistent class [class de.reschif.lims.common.domain.User] is set to [FIELD].
> [EL Config]: The alias name for the entity class [class de.reschif.lims.common.domain.DefaultDomainObject] is being defaulted to: DefaultDomainObject.
> [EL Config]: The table name for entity [class de.reschif.lims.common.domain.DefaultDomainObject] is being defaulted to: DEFAULTDOMAINOBJECT.
> ...



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

	<persistence-unit name="LIMS" transaction-type="RESOURCE_LOCAL">
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

		<class>de.reschif.lims.common.domain.DefaultDomainObject</class>
		<class>de.reschif.lims.common.domain.User</class>

		<properties>
			<property name="eclipselink.ddl-generation" value="create-tables" />
			<property name="eclipselink.ddl-generation.output-mode"
				value="database" />

			<property name="eclipselink.logging.level" value="FINEST" />
			<property name="eclipselink.logging.timestamp" value="false" />
			<property name="eclipselink.logging.session" value="false" />
			<property name="eclipselink.logging.thread" value="false" />
		</properties>
	</persistence-unit>
</persistence>[/XML]

context.xml:
[XML]<?xml version="1.0" encoding="UTF-8"?>
	<!-- post-processors for all standard config annotations -->
	<context:annotation-config />

	<context:load-time-weaver
		weaver-class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" />

	<!-- OSGi Service-Imports -->
	<osgi:reference id="dataSource" interface="javax.sql.DataSource" />

	<!-- local Spring -->
	<bean id="jpaVendorAdapter"
		class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
		<property name="showSql" value="true" />
		<property name="generateDdl" value="true" />
		<property name="databasePlatform"
			value="org.eclipse.persistence.platform.database.HSQLPlatform" />
	</bean>

	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
		<property name="loadTimeWeaver">
			<bean
				class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" />
		</property>
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager" />	

	<bean id="userDao" class="de.reschif.lims.server.persistence.UserDaoImpl"
		autowire="byName" />

	<bean id="userService" class="de.reschif.lims.server.service.UserServiceImpl">
		<property name="userDao" ref="userDao" />
	</bean>
[/XML]

Über einen Tipp, was ich denn hier falsch mache würde ich mich sehr freuen.

Schönen Gruß,
Lars


----------



## t.stein (5. Jul 2010)

konntest du das Problem lösen? Ich habe ein ähnliches Problem. gruß Thomas


----------



## Gelöschtes Mitglied 5909 (5. Jul 2010)

Das große Problem ist der LoadTimeWeaver. Außerdem solltest du die PersistenceUnit in der context.xml angeben


```
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<!-- entityManagerFactory created before DAO -->
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="dynaresume" />
		<property name="dataSource" ref="dataSource" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
				<property name="database" value="H2" />
				<property name="generateDdl" value="false" />
				<property name="showSql" value="true" />
			</bean>
		</property>
	</bean>

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

	<tx:annotation-driven transaction-manager="txManager" />

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

</beans>
```

In den DAOs schreibst du dann einfach


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

Load-Time Weaving for Spring-DM with JPA/EclipseLink [step1]  Angelo's Blog

hier findest du noch einen LTW, der funktioniert aber auch nicht 100%ig. Am besten ist es warscheinlich auf die Features von weaving (Lazy Loading, etc.) zu verzichten und sich den Ärger zu sparn.


----------

