Hibernate - entity class not found

lumo

Top Contributor
Hallo,

ich hab ein problem mit hibernate in verbindung mit eclipse und bundles.
und zwar bekomme ich folgende exception
Code:
org.hibernate.MappingException: component class not found: at...osgi.service.data.domain.impl.MultimediaImpl
	at org.hibernate.mapping.Component.getComponentClass(Component.java:104)
	at org.hibernate.tuple.component.PojoComponentTuplizer.buildGetter(PojoComponentTuplizer.java:133)
	at org.hibernate.tuple.component.AbstractComponentTuplizer.<init>(AbstractComponentTuplizer.java:43)
	at org.hibernate.tuple.component.PojoComponentTuplizer.<init>(PojoComponentTuplizer.java:38)
	at org.hibernate.tuple.component.ComponentEntityModeToTuplizerMapping.<init>(ComponentEntityModeToTuplizerMapping.java:52)
	at org.hibernate.tuple.component.ComponentMetamodel.<init>(ComponentMetamodel.java:50)
	at org.hibernate.mapping.Component.buildType(Component.java:152)
	at org.hibernate.mapping.Component.getType(Component.java:145)
	at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253)
	at org.hibernate.mapping.Collection.validate(Collection.java:278)
	at org.hibernate.mapping.Set.validate(Set.java:19)
	at org.hibernate.cfg.Configuration.validate(Configuration.java:1106)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1287)
	at at...osgi.service.hibernate.impl.SessionProvider.setConfig(SessionProvider.java:249)
ich weiss, dass das heißt, dass er meine class file nicht findet.

aber: die klasse ist genau dort wo er sie sucht, allerdings in einem anderen bundle/plug-in
wenn ich die klasse in das selbe bundle/plug-in kopiere, dann klappt die ganze sache!

alerdings will ich das nicht, denn ich möchte mehrere verschiedene datenbankanbindungen per plugin ermöglichen...

ich habe schon versucht Eclipse-BuddyPolicy: global zu setzen, was aber keinen unterschied bringt.
ich habe auch versucht das bunde als required angeben (ist ja ein muss 😉 )
habe auch das package explizit schon als incuded/required angegeben!

hat jemand von euch noch eine idee wie ich das problem lösten könnte? (jar erstellen oder sowas in die art?!)

edit: hab jetzt versucht das bundle mit den klassen als jar zu exportieren, und hab die jar in den classpath des hibernate-pulgins gelegt... der fehler tritt noch immer auf...
 
Zuletzt bearbeitet:
Ähm zeig mal deine Config her (da wo du sagst, dass die Klasse gemapped werden soll) und die "Bundles/Plug-Ins" von denen du da redest...
Bundles sind doch eigentlich für statische Daten, du meinst nich zufällig "Packages" oder?
 
ich habe eine RCP applikation mit mehreren plug-in's.
packages wären dann die verz. in meinem plug-in.
struktur meiner app:

application(main plug-in meiner rcp)
osgi.service.data (plug-in, die ausprogrammierten klassen und ihre hbm.xml files)
osgi.service.hibernate (plug-in, mit dem session provider und der Configuration)
libs(plug in, das alle libs einbindet und per export zur verfügung stellt)
views (plug-in's, die die graphische oberfläche enthalten)

meine hibernate config mache ich per code (das mit dem xml file klappt nicht so wie ich mir das wünsche)
Code:
		final Configuration cfg = new Configuration();
		// basic config
		cfg.setProperty("current_session_context_class", "thread");
		cfg.setProperty("hibernate.dialect",
				"org.hibernate.dialect.SQLServerDialect");
		cfg.setProperty("hibernate.connection.driver_class",
				"com.microsoft.sqlserver.jdbc.SQLServerDriver");
		cfg.addClass(SiteImpl.class);
		cfg.addClass(BioObjectImpl.class);
		cfg.addClass(LookupCoordinatesOrigin.class);
		cfg.addClass(LookupSite01.class);
		cfg.addClass(LookupSite02.class);
		cfg.addClass(LookupSite03.class);
		cfg.addClass(LookupSite04.class);
		cfg.addClass(LookupSite05.class);
		cfg.addClass(LookupSiteCatalog.class);
		cfg.addClass(LookupSiteExposition.class);
		System.out.println("SessionProvider KNOWS: "
				+ MultimediaImpl.class.getName());
		// connection details
		cfg.setProperty(Environment.USER, login);
		cfg.setProperty(Environment.PASS, password);
		final String connectionString = String
				.format(
						"jdbc:sqlserver://%s:%s;DatabaseName=%s;SelectMethod=cursor;integratedSecurity=%s",
						host, port, db, integratedSecurity);
		System.out
				.println("connectionString from hibernate.hbm.xml was overwritten by -> "
						+ connectionString);
		cfg.setProperty(Environment.URL, connectionString);

		sessionFactory = cfg.buildSessionFactory();

die ausgabe des codes gibt dann folgendes:
Code:
SessionProvider KNOWS: at.biooffice.osgi.service.data.domain.impl.MultimediaImpl
connectionString from hibernate.hbm.xml was overwritten by -> jdbc:sqlserver://server2:1433;DatabaseName=testsystem;SelectMethod=cursor;integratedSecurity=true
!SESSION 2010-08-27 09:09:48.831 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.6.0_21
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_AT
Framework arguments:  -product at.biooffice.application.product
Command-line arguments:  -product at.biooffice.application.product -data D:\JAVA\WORKSPACE/../runtime-BioOffice3AlphaDog.product -dev file:D:/JAVA/WORKSPACE/.metadata/.plugins/org.eclipse.pde.core/BioOffice3AlphaDog.product/dev.properties -os win32 -ws win32 -arch x86 -console -consolelog -debug

!ENTRY org.eclipse.ui 4 0 2010-08-27 09:09:56.237
!MESSAGE Unhandled event loop exception
!STACK 0
org.hibernate.MappingException: component class not found: at.biooffice.osgi.service.data.domain.impl.MultimediaImpl

also oben schreibt er er kennt die klasse (klasse ist ja included, wird gefunden, kann auch mit getClass den namen auflösen) weiter unten im code kennt er sie dann plötzlich nicht mehr.
hinweis: die klasse MultimediaImpl und SiteImpl&BioObjectImpl liegen im selben package & plug-in (osgi.service.data, wie auch oben ausgegeben 😉 )
 
Öhm...das was du da ausgibst hat aber nichts mit dem zutun was evtl. in der Configuration angekommen sein könnte 🙂

Registrier mal den vollen Namen Deiner Klassen, muss es nich sein, hatte ich so aber auch schonmal, obwohl mir die Exception auch den vollen Namen vorgelesen hatte^^

Java:
cfg.addClass(at.biooffice.osgi.service.data.domain.impl.MultimediaImpl.class);

Ich hab grad mal das allwissende Google gefragt und gesehn, dass die Exception nichtmal unbedingt was mit ner "fehlenden" Klasse zutun haben muss :shock:

Du könntest sogar einfach das Commit nach den Transaktionen vergessen haben :rtfm:
Möglich wäre auch noch, dass deine MultimediaImpl nicht public ist

Hibernate ist was Fehler angeht immer sehr hilfreich ^^
 
Du könntest sogar einfach das Commit nach den Transaktionen vergessen haben
ich hab das problem nicht bei nem query... er wirft die exception schon bei der config 😉

Möglich wäre auch noch, dass deine MultimediaImpl nicht public ist
Code:
public class MultimediaImpl extends GuidItem implements Multimedia {

die klasse multimedia wird nicht in einem eigenen hbm file beschrieben sondern wird im SiteImpl.hbm.xml beschrieben,
also wird ein
Code:
cfg.addClass(at.biooffice.osgi.service.data.domain.impl.MultimediaImpl.class);
nicht kappen.

in der xml sieht das so aus:
[XML]
...SiteImpl stuff...
<!-- Mapping MultimediaItems as Collection of Components -->
<!-- Chapter 6.2.2 in Manning/Java Persistence (must implement equals() and hashcode() )-->
<set name="multimediaItems" table="tMultimedia" lazy="true" fetch="select"
order-by="mumFileName asc">
<key column ="mumSysId" />
<composite-element class="at.biooffice.osgi.service.data.domain.impl.MultimediaImpl" >
<property name="id" type="int" formula="mumIdMultimedia" />
<property name="guid" column="mumGuidMultimedia" type="string" length="36"/>
<property name="parentCategory" type="string" column="mumSysCategory" length="30" not-null="true" />
<property name="parentId" type="int" formula="mumSysId" />
<property name="name" type="string" column="mumName"/>
<property name="fileName" type="string" column="mumFileName"/>
<property name="format" type="string" column="mumFormat" length="50"/>
<property name="version" type="string" column="mumVersion" length="30" />
<property name="copyright" type="string" column="mumCopyright" />
<property name="author" type="string" column="mumAuthor" length="100"/>
<property name="comments" type="string" column="mumComments" length="50"/>
</composite-element>
</set>
...SiteImpl stuff...
[/XML]
 
Hm...ne, ich hab absolut keine Ahnung woran es liegen könnte sorry 🙁
Besonders die xml-Konfigurationen hab ich nie benutzt weil ich Annotationen schicker finde, könnte Dir also nicht mal sagen ob an der Konfig was faul is:/
 

Zurück
Oben