# Hibernate: Unknown entity



## kf (7. Jun 2008)

Hallo zusammen,

ich versuche gerade meine ersten Schritte mit Hibernate und habe mich für die Annotation-Variante entschieden, da ich möglichst wenig Konfigurationsdatein haben möchte. 

Ich hatte nun gedacht das es reicht, wenn ich meinen DAO-Klassen die Annotation @Entity und @Table(name=xyz) verpasse aber leider bekomme ich eine


```
org.hibernate.MappingException: Unknown entity: wgpb.pyramid.dao.PersonDAO
```

Hier die DAO-Klasse:


```
@Entity
@Table(name="person")
public class PersonDAO {
	
	@Id @GeneratedValue
	private Long id;
	
	private String titles;
	
	private String firstnames;
	
	private String lastname;
	
	private String aliasnames;
}
```

Muß ich eventuell noch etwas konfigurieren oder komme ich um das Mapping per xml nicht drumrum?

mfg


----------



## kf (7. Jun 2008)

Nachtrag:

Mir ist gerade noch eine Log-Ausgabe aufgefallen


```
WARNUNG: Package not found or wo package-info.java: wgpb.pyramid.dao
```

Ich habe das Mapping in der hibernate.cfg.xml wie folgt konfiguriert:


```
<mapping package="wgpb.pyramid.dao"/>
```


----------



## semi (8. Jun 2008)

Wenn du schon mit Annotations arbeitest, kannst du dir die hibernate.cfg.xml sparen. Eine korrekte persistence.xml 
reicht. Sind deine Entity und Table Annotationen aus dem Package javax.persistence oder aus org.hibernate.annotations?
Ansonsten fehlt noch eine Angabe, wie du das ganze initialisierst (EntityManagerFactory etc.).


----------



## kf (9. Jun 2008)

Erstmal danke für die Antwort. 

Damit ich erstmal weiterkomme habe ich mich damit beholfen, statt des Packages die Klassen einzeln zu mappen. Das funktioniert auch so weit.

Bei der Initialisierung erstelle ich eine SessionFactory und arbeite dann mit den Sessions. Das es noch eine andere Möglichkeit über eine EntityManagerFactory gibt habe ich gelesen, da meine Version funktioniert aber nicht weiter verfolgt. Gibt es irgendwelche Vorteile bei der Benutzung der EntityManager gegenüber der Sessions?


----------



## byte (9. Jun 2008)

EntityManager und persistence.xml ist JPA-Standard, das andere ist reines Hibernate. Wenn Du nicht planst, das Persistenzframework irgendwann auszutauschen, dann brauchst Du Dich auch nicht an die JPA-Spezifikation zu halten.


----------



## kf (9. Jun 2008)

Ok, vielen Dank für die Info.

Das Problem ist dann erstmal gelöst.

mfg


----------



## Alex77 (19. Dez 2008)

@semi:
Wie verwendet man dann Hibernate, wenn man nur die persistence.xml statt der hibernate.cfg.xml benutzt? NetBeans erstellt nämlich automatisch eine persistence.xml. Wäre daher schön, wenn ich nur diese verwenden bräuchte.


```
SessionFactory sf = new AnnotationConfiguration() .configure().buildSessionFactory();
```

führt zu einem Fehler: "org.hibernate.HibernateException: /hibernate.cfg.xml not found"

Oder geht es dann tatsächlich nur über:


```
EntityManagerFactory emf = Persistence.createEntityManagerFactory("TestDataPU");
EntityManager em = emf.createEntityManager();
Session session = (Session) em.getDelegate();
```


----------



## Guest (20. Dez 2008)

Genau so, nur ohne die Hibernate-Sessions. Die brauchst du nicht und kannst alles über den EntityManager erledigen.
Hier ein Beispiel für peristence.xml mit der H2 Datenbank. Netbeans kann sicherlich nicht alles generieren. Die Properties sind schon zu speziell
	
	
	
	





```
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
   <persistence-unit name="h2pu">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <properties>
         <property name="hibernate.archive.autodetection" value="class" /> 
         <property name="hibernate.connection.username" value="admin" />
         <property name="hibernate.connection.password" value="admin" />
         <property name="hibernate.connection.driver_class" value="org.h2.Driver" />
         <property name="hibernate.connection.url" value="jdbc:h2:tcp://localhost/h2db" />
         <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
         <property name="hibernate.bytecode.use_reflection_optimizer" value="true" />
         <property name="hibernate.connection.pool_size" value="1" />
         <property name="hibernate.current_session_context_class" value="thread" />
         <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
         <property name="hibernate.show_sql" value="true" />
         <property name="hibernate.format_sql" value="false" />
   </persistence-unit>
</persistence>
```
dann im Programm irgendwo
	
	
	
	





```
// EntityManagerFactory kannst du einmalig irgendwo erzeugen, da es ziemlich "kostspielig" ist
EntityManagerFactory emf = Persistence.createEntityManagerFactory("h2pu"); 
// EntityManager kann eigentlich auch einmalig erzeugt werden.
EntityManager em = emf.createEntityManager();
```
Du kannst dabei auch alle Properties, die normalerweise in persistence.xml stehen, zur Laufzeit, beim Erstellen von EntityManagerFactory angeben. Auch die URL und Dialect
	
	
	
	





```
Map<String, String> properties = new HashMap<String, String>();
properties.put("hibernate.connection.username", "admin");
properties.put("hibernate.connection.password", "admin");
emf = Persistence.createEntityManagerFactory("h2pu", properties);
...
```

Gruß,
semi


----------

