org.hibernate.MappingException: Unknown entity

Status
Nicht offen für weitere Antworten.

0knowledge

Mitglied
Ich bin nach einer Anleitung im Web vorgegangen um ein Beispielprojekt mit Java 5 SE und Hibernate zu erstellen. Leider erzeugt die ausführung nur folgenden Fehler
Exception in thread "main" org.hibernate.MappingException: Unknown entity: artikel
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:550)
at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:180)
at org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:512)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:70)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
at start.main(start.java:13)
Die wichtigsten Codefragmente sind
start.java
Code:
import org.hibernate.*;
public class start {
	public static void main(String[] args) {
		artikel test = new artikel();
		test.setPreis(30.25);
		test.setSteuer(7.25);
	    Session session = HibernateUtil.getSessionFactory().openSession();
	    Transaction tx = session.beginTransaction();
	    session.persist(test);
	    tx.commit();
	    session.close();
	}
}
HibernateUtil.java
Code:
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {
  private static final SessionFactory sessionFactory;

  static {
    try {
      sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    } catch (Throwable ex) {
      System.err.println("Initial SessionFactory creation failed." + ex);
      throw new ExceptionInInitializerError(ex);
    }
  }

  public static SessionFactory getSessionFactory() {
    return sessionFactory;
  }
}
artikel.java
Code:
import javax.persistence.Id;
import org.hibernate.annotations.Entity;
import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime;
import org.hibernate.annotations.Table;

@Entity
@Table(appliesTo="t1")
public class artikel {

	@Id
	@Generated(value=GenerationTime.INSERT)
	private long id;
	private String name;
	private String beschr;
	private double preis;
	private double steuer;

	public artikel() {}
	
	<getter und setter>
}
und die hibernate.cfg.xml
Code:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
  <session-factory>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://<IP>/test1</property>
    <property name="connection.username">testuser</property>
    <property name="connection.password">xxxxxxxxxx</property>
    <property name="connection.pool_size">1</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="show_sql">true</property>
    <mapping class="artikel"/>
  </session-factory>
</hibernate-configuration>
Wo liegt hier der Fehler :?: Die Klasse artikel ist doch eindeutig als Entity definiert.
 
Du musst den voll qualifizierten Namen der Klasse im Mapping angeben, also inkl. Package-Angabe.
 
Danke für deine Hilfe.
Ich habe für dieses mini Projekt kein package erstellt, daher sollte die Angabe so richtig sein. Sobald ich die mapping Zeile verändere kommt es auch zu einem neuen Fehler der Art
Initial SessionFactory creation failed.org.hibernate.MappingException: Unable to load class declared as <mapping class=".artikel"/> in the configuration:
Exception in thread "main" java.lang.ExceptionInInitializerError
 
.artikel ist nur ein Beispiel um zu zeigen das der Fehler im Ursprungsposting wahrscheinlich nicht in der Zeile
<mapping class="artikel"/>
liegt. Sicher ist es sinnvoll Klassennamen groß zu schreiben, da ich es hier aber nicht gemacht habe steht der Name natürlich auch klein in der hibernate.cfg.xml.
 
Der neue Fehler könnte auch daher kommen, dass .artikel nicht mal ein gültiger Klassenbezeichner ist. :autsch:

Ich kann auch nur mutmaßen, dass es am Default-Package liegt. Man sollte in Java generell nie mit Default-Package arbeiten. Ändere das also mal, schreib gleich den Klassennamen groß, wie es sich gehört und dann schaun wir weiter. Der Rest sieht sonst nämlich ok aus auf den ersten Blick.
 
Alle *.java Dateien in Package t1 zusammengefasst
Code:
 <mapping class="t1.Artikel"/>
leider bleibt der Fehler der gleiche.
Exception in thread "main" org.hibernate.MappingException: Unknown entity: t1.Artikel
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:550)
at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:180)
at org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:512)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:70)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
at t1.start.main(start.java:15)
Sonst noch irgentwelche Ideen ???:L
 
Hallo, gibt es mittlerweile eine Lösung? Bin beim googeln auf diesen Eintrag gestoßen und stehe vor dem gleichen Problem. Ich habe die gemappte Klasse in einem Package und beim Mapping den voll qualifizierten Namen angegeben...
Danke!
 
Hab die Lösung bzw. den Fehler gefunden und möchte sie der Welt nicht vorenthalten:

@Entity muss @javax.persitence.Entity sein, also der import muss dann lauten:

Code:
import javax.persistence.Entity;

@org.hibernate.annotations.Entity [...] ist eine Erweiterung zu @javax.persistence.Entity und kann nur zusätzlich verwendet werden [...]
(aus "Sebastian Hennebrüder; Hibernate - Das Praxisbuch für Entwickler; Galileo Computing; 2007")

Beispiel:
Code:
import java.io.Serializable;

import javax.persistence.Entity
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.SequenceGenerator;

@Entity
@org.hibernate.annotations.Entity(mutable=true, dynamicInsert=true, dynamicUpdate=true)
@SequenceGenerator(name="myclass_seq", sequenceName="myclass_id_seq")
public class MyClass implements Serializable {

    private static final long serialVersionUID = 7628430776579817658L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "myclass_seq")
    private Long id;
    private String name;

// ...

}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben