Hibernate / Eclipse

Nspecht

Mitglied
Hallo,
ich lerne gerade Hibernate und bekomme gleich beim ersten Testprojekt mit Eclipse eine ClassNotFoundException:

Okt. 29, 2024 12:43:56 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 5.6.8.Final
Okt. 29, 2024 12:43:57 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
Okt. 29, 2024 12:43:57 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Okt. 29, 2024 12:43:57 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.cj.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/testschema]
Okt. 29, 2024 12:43:57 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=root}
Okt. 29, 2024 12:43:57 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Okt. 29, 2024 12:43:57 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Okt. 29, 2024 12:43:57 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect
Okt. 29, 2024 12:43:57 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/testschema]
Exception in thread "main" org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [hibernateCon/src/main/java/hibernateDB/User.java]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:133)
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:101)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:164)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:158)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:86)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:479)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:85)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:709)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:746)
at hibernateDB.GeneralDB.main(GeneralDB.java:13)
Caused by: java.lang.ClassNotFoundException: hibernateCon/src/main/java/hibernateDB/User.java
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:534)
at java.base/java.lang.Class.forName(Class.java:513)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:130)
... 9 more

Die Klasse User.java ist bei mir im Ordner aber im Ordner "C:\Users\nspec\eclipse-workspace\hibernateCon\src\main\java\hibernateDB\User.java" vorhanden, in der hibernate.cfg.xml ist sie so auch aufgeführt:

<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/testschema</property>
<property name="connection.username">root</property>
<property name="connection.password">******</property>
<property name="show_sql">true</property>

<mapping class= "hibernateCon/src/main/java/hibernateDB/User.java" />
</session-factory>
</hibernate-configuration>

Kann mir jemand helfen, weshalb die Klasse nicht geladen werden kann?

Danke
Norbert
 
<mapping class= "hibernateCon/src/main/java/hibernateDB/User.java" />

Das ist falsch an. Die Klasse ist hibernateDb.User


Hibernate interessiert sich nicht wo der Source auf der Platte liegt - sondern für den qualifizierten Namen der kompilierten Klasse.
 
@LimDul: Nein, das war es nicht. Die Schreibweise müsste auch richtig sein, <mapping class= "hibernateCon/src/main/java/hibernateDB/User.java" /> entspricht der Schreibweise im Projekt Explorer:

1730278076867.png


Ich hatte extra Copy Qualified Name verwendet.



@Oneixee5:
Hier kommt meine pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.norbert.hibernate</groupId>
<artifactId>hibernateCon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hibernateConnectionTest</name>

<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.8.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>

<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>

</project>
 
@LimDul: Nein, das war es nicht. Die Schreibweise müsste auch richtig sein, <mapping class= "hibernateCon/src/main/java/hibernateDB/User.java" /> entspricht der Schreibweise im Projekt Explorer:

Anhang anzeigen 23212


Ich hatte extra Copy Qualified Name verwendet.
Nein, das ist definitiv nicht richtig. Sorry, ich würde dir empfehlen dich mit Java Grundlagen (Was ist ein Package, was ist eine Klasse, wie werden sie benannt etc.) zu beschäftigen,
 
Also ich versuche mal ein paar Grundlagen auf die Schnelle zusammen zu fassen:

Du musst zwei Dinge unterscheiden:
1. Entwicklungsumgebung und Dateien des Projekts
Das ist dann dein Maven Projekt mit allen Dateien. Die Sourcen liegen dann innerhalb des src Ordners. Bei Bauen wird dann irgendwas gemacht (Das wird bei Dir durch Maven erfolgen) und dabei wird ein Ergebnis erzeugt.
2. Das Ergebnis ist dann das erzeugte Programm. Das ist unabhängig von der Entwicklungsumgebung und den Sourcen zu sehen. Und nur dieser Part ist für die Ausführung da. Und das ist dann etwas, das bei dem Bau des Projektes innerhalb des target Verzeichnisses entsteht. Wobei da oft deutlich mehr entsteht, als Du dann am Ende wirklich brauchst - es gibt halt sowas wie Zwischenergebnisse, Logfiles, ....

In Deiner Entwicklungsumgebung gibt es also ein hibernateCon/src/main/java/hibernateDB/User.java, aber das hat nichts mit der Laufzeit zu tun.

Die Hibernate Konfiguration ist eine sogenannte Ressource Datei. Als solche sollte sie in src/main/resources liegen. Diese werden dann in der Regel auch mit kopiert damit diese zur Laufzeit zur Verfügung stehen. Aber ganz wichtig: Der Zugriff erfolgt nicht über den Pfad, wo diese in der Entwicklungsumgebung liegen!
Zur Laufzeit schaut also Hibernate nach der Konfiguration und liest diese. Dabei wird aber nur auf die Elemente der Runtime zugegriffen. Das sind also in der Regel Dinge, die dann im sogenannten Classpath liegen.

Die java Dateien gibt es aber nur in der Entwicklungsumgebung. Zur Laufzeit gibt es dann nur die übersetzen class Dateien. Ein Verweis auf eine java Datei kann also (in der Regel) nie korrekt sein!

Und wenn man dann schaut: Hibernate will da eine class haben. Und Klassen werden über den Classloader geladen und bestehen immer aus dem Package und dem Namen nach class - getrennt durch einen Punkt. (Das ist dann der volle Name der Klasse!)
 
XML:
<mapping class="hibernateDB.User" />
Darf man fragen, wie du dazu kommst Übungen mit einer alten Hibernate-Version zu machen und was das Ziel dieser Übungen ist?
Hibernate ist ja ein Framework, welches man eher auf Servern einsetzt. Dort würde man dann nicht Hibernate üben sondern JPA oder Jakarta Data.
 

Zurück
Oben