"Unable to configure Entity Manager"
Bonjour à tous,
Je bosse sur un projet Wicket et j'en suis à la phase de persistance des données. Malheureusement j'ai le gros message d'erreur ci-dessous.
J'avais pourtant réussi à créer la BDD à partir des entities annotées (pas de xml), puis quand j'ai essayé de mettre les relations entre les tables (@OneToOne, etc.) voici ce que ça me dit :
Citation:
ATTENTION: failed wicket.SafeDriving: javax.persistence.PersistenceException: [PersistenceUnit: safeDriving-PU] Unable to configure EntityManagerFactory
20 mai 2011 12:54:35 org.mortbay.log.Slf4jLog warn
GRAVE: Failed startup of context org.mortbay.jetty.plugin.Jetty6PluginWebAppContext@2c0cf70f{/SafeDriving,/home/GiZeus/NetBeansProjects/SafeDriving/src/main/webapp}
javax.persistence.PersistenceException: [PersistenceUnit: safeDriving-PU] Unable to configure EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:265)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:125)
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
at com.safedriving.dao.AgenceJpaController.<init>(AgenceJpaController.java:38)
at com.safedriving.SafeDrivingApplication.populateDataBase(SafeDrivingApplication.java:54)
at com.safedriving.SafeDrivingApplication.init(SafeDrivingApplication.java:41)
at org.apache.wicket.protocol.http.WicketFilter.init(WicketFilter.java:726)
at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:713)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)
at org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebAppContext.java:115)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:132)
at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:454)
at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:396)
at org.mortbay.jetty.plugin.AbstractJettyRunMojo.execute(AbstractJettyRunMojo.java:210)
at org.mortbay.jetty.plugin.Jetty6RunMojo.execute(Jetty6RunMojo.java:184)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.hibernate.AnnotationException: Cannot find the expected secondary table: no Client available for com.safedriving.beans.PanierClient
at org.hibernate.cfg.Ejb3Column.getJoin(Ejb3Column.java:293)
at org.hibernate.cfg.Ejb3Column.getTable(Ejb3Column.java:272)
at org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:1939)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1361)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:754)
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:546)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:291)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1115)
at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1226)
at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:173)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:854)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:191)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:253)
... 48 more
20 mai 2011 12:54:35 org.mortbay.log.Slf4jLog info
J'utilise les classes générées par Netbeans pour la persistance, qui avaient bien fonctionné jusque là.
Dans le message d'erreur, il me dit que le problème viendrait du constructeur de la classe AgenceJPAController (première dao à être générée dans ma fonction populateDB() chargée dans l'init de la classe d'application de wicket).
Voici son code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| public class AgenceJpaController {
public AgenceJpaController() {
/*
* ERREUR REMONTÉE PAR MAVEN
*/
emf = Persistence.createEntityManagerFactory("safeDriving-PU");
}
private EntityManagerFactory emf = null;
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public void create(Agence agence) {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
em.persist(agence);
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
public void edit(Agence agence) throws NonexistentEntityException, Exception {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
agence = em.merge(agence);
em.getTransaction().commit();
} catch (Exception ex) {
String msg = ex.getLocalizedMessage();
if (msg == null || msg.length() == 0) {
int id = agence.getId();
if (findAgence(id) == null) {
throw new NonexistentEntityException("The agence with id " + id + " no longer exists.");
}
}
throw ex;
} finally {
if (em != null) {
em.close();
}
}
}
public void destroy(int id) throws NonexistentEntityException {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
Agence agence;
try {
agence = em.getReference(Agence.class, id);
agence.getId();
} catch (EntityNotFoundException enfe) {
throw new NonexistentEntityException("The agence with id " + id + " no longer exists.", enfe);
}
em.remove(agence);
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
public List<Agence> findAgenceEntities() {
return findAgenceEntities(true, -1, -1);
}
public List<Agence> findAgenceEntities(int maxResults, int firstResult) {
return findAgenceEntities(false, maxResults, firstResult);
}
private List<Agence> findAgenceEntities(boolean all, int maxResults, int firstResult) {
EntityManager em = getEntityManager();
try {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
cq.select(cq.from(Agence.class));
Query q = em.createQuery(cq);
if (!all) {
q.setMaxResults(maxResults);
q.setFirstResult(firstResult);
}
return q.getResultList();
} finally {
em.close();
}
}
public Agence findAgence(int id) {
EntityManager em = getEntityManager();
try {
return em.find(Agence.class, id);
} finally {
em.close();
}
}
public int getAgenceCount() {
EntityManager em = getEntityManager();
try {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
Root<Agence> rt = cq.from(Agence.class);
cq.select(em.getCriteriaBuilder().count(rt));
Query q = em.createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
} finally {
em.close();
}
}
} |
Après pas mal de recherches, je n'ai pas trouvé ce qui n'allait pas. Je penche pour une mauvaise utilisation des annotation (pourtant le bean de cette classe n'est propriétaire d'aucune relation.
Quelqu'un a une idée ?
PS : Au cas où mes relations ManyToOne et autres seraient fausses, est-il possible de spécifier uniquement la table @JoinColumn pour indiquer une clé étrangère sans spécifier de relation ?