SpringDM, JPA(Eclipselink), OSGi

lfischer

Neues Mitglied
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.
[EL Config]: The discriminator column name for the root inheritance class [class de.reschif.lims.common.domain.DefaultDomainObject] is being defaulted to: DTYPE.
[EL Config]: The column name for element [field id] is being defaulted to: ID.
[EL Config]: The alias name for the entity class [class de.reschif.lims.common.domain.User] is being defaulted to: User.
[EL Config]: The primary key column name for the inheritance class [class de.reschif.lims.common.domain.User] is being defaulted to: ID.
[EL Config]: The foreign key column name for the inheritance class [class de.reschif.lims.common.domain.User] is being defaulted to: ID.
[EL Config]: The column name for element [field login] is being defaulted to: LOGIN.

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
 
G

Gelöschtes Mitglied 5909

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

Code:
<?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

Java:
@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.
 

Ähnliche Java Themen

Neue Themen


Oben