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();