Comment enregistrer automatiquement des entités avec JPA / Hibernate: entité inconnue

Je suis confronté à un problème de configuration Hibernate / JPA qui empêche l’enregistrement automatique de mes entités annotées JPA:

java.lang.IllegalArgumentException: Unknown entity: com.example.crm.server.model.Language at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:671) at com.example.crm.server.model.Language.persist(Language.java:64) at com.example.crm.server.LanguageTest.testPersistAndRemove(LanguageTest.java:32) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

Dans ma classe d’entité j’ai:

 @Entity @Table(name="Languages") public class Language implements Serializable { @Id private Long id; private Ssortingng name; // etc... } 

Et dans MySQL, la table Langues ressemble à ceci:

 +-------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------+------+-----+---------+-------+ | Language_ID | int(11) | NO | PRI | NULL | | | Name | char(18) | YES | | NULL | | +-------------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) 

Et mon persistence.xml ressemble à:

    org.hibernate.ejb.HibernatePersistence                     

EDIT : voici comment je reçois mon EntityManager et que je persiste:

 public void persist() { EntityManager em = entityManager(); try { em.getTransaction().begin(); em.persist(this); em.getTransaction().commit(); } finally { em.close(); } } public static EntityManager entityManager() { return EMF.get().createEntityManager(); } 

C’est assez simple: listez les classes directement dans le fichier persistence.xml. Armandino et MikelRascher me conduisirent à cette réponse, bien qu’indirectement, donc pour eux.

Voici le fichier persistence.xml que j’utilise maintenant:

    org.hibernate.ejb.HibernatePersistence com.example.Language                      

Mettre à jour

Voici une approche plus semblable à JPA:

 Ejb3Configuration ejb3Configuration = new Ejb3Configuration(); ejb3Configuration.addResource("META-INF/orm.xml"); ejb3Configuration.configure("persistence.xml"); EntityManagerFactory factory = ejb3Configuration.buildEntityManagerFactory(); EntityManager em = factory.createEntityManager(); 

Et orm.xml devrait ressembler à ceci:

   org.example    

Comment construisez-vous votre gestionnaire d’entité?

Vous devriez regarder les messages log4j de niveau INFO de hibernate en définissant ceci dans log4j.properties:

 # Hibernate logging options (INFO only shows startup messages) log4j.logger.org.hibernate=INFO # Log JDBC bind parameter runtime arguments log4j.logger.org.hibernate.type=INFO 

Vous devriez voir votre classe dans les messages:

 15:39:37,519 INFO Version:156 - Hibernate Commons Annotations 3.2.0.Final 15:39:37,527 INFO Environment:148 - Hibernate 3.6.0.Final 15:39:37,529 INFO Environment:148 - hibernate.properties not found 15:39:37,532 INFO Environment:148 - Bytecode provider name : javassist 15:39:37,535 INFO Environment:148 - using JDK 1.4 java.sql.Timestamp handling 15:39:37,588 INFO Version:156 - Hibernate EntityManager 3.6.0.Final 15:39:38,036 INFO AnnotationBinder:156 - Binding entity from annotated class: com.example.crm.server.model.Language 

Allez à DEBUG si vous avez besoin de plus d’informations.

AUSSI Vous ne mentionnez pas le nom de votre unité de persistance lorsque vous créez le gestionnaire d’entités. Peut-être que ce n’est pas important:

 EntityManagerFactory emf = Persistence.createEntityManagerFactory("crm"); EntityManager em = emf.createEntityManager();