Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JPA] création des tables impossible

Cannot find the expected secondary table

    21 mai 2011 à 18:23:13

    Bonjour à tous,

    Je suis sur un projet JEE avec le framework Wicket (voilà pour l'anecdote), et j'utilise JPA pour créer mes tables. Avant que je décide d'introduire les relations @OneToMany et autres, tout passait niquel, mais dès que je les ai introduites voici donc que ça boome au départ !

    Le message d'erreur que me vomit Maven n'étant pas des plus digestes, voici la portion intéressante, indiquée par d'autres personnes sur un autre forum :

    Citation : Maven 2

    Caused by: org.hibernate.AnnotationException: Cannot find the expected secondary table: no Offre available for com.safedriving.beans.PanierClient



    Je mets quand même le message entier en fin de message.

    Il semblerait que les annotation de relation aient été incorrectes, mais après les avoir modifié l'erreur persiste. Voici le code des classes incriminées :

    La classe PanierClient :

    @Entity
    public class PanierClient implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @Version
        private int version;
    
        @ManyToOne
        @JoinColumn(name="idAgence", referencedColumnName="id")
        private Client client;
    
        @ManyToOne
        @JoinColumn(table="Offre")
        private Offre offre;
    
        @Column(length=2, nullable=false)
        private int quantite;
    
        @Column(nullable=false)
        private Timestamp dateSoumission;
        
        @Column(nullable=false)
        private Boolean paye;
    
        public PanierClient(){
        }
    
        public PanierClient(Client client, Offre offre, Timestamp dateSoumission, Boolean paye) {
            this.client = client;
            this.offre = offre;
            this.dateSoumission = dateSoumission;
            this.paye = paye;
    
    //...
        }
    


    La classe Client :

    @Entity
    public class Client extends Personne{
    
        @ManyToOne
        @JoinColumn(table="Agence", referencedColumnName="id")
        private Agence agence;
    
        @Temporal(javax.persistence.TemporalType.DATE)
        @Column(nullable=false)
        private Date dateInscription;
    
        @Temporal(javax.persistence.TemporalType.DATE)
        @Column(nullable=true)
        private Date dateCodeRoute;
    
        @ManyToOne
        @JoinColumn(table="Commercial", referencedColumnName="id")
        private Commercial commercial;
    
        @ManyToMany
        @JoinTable(name="HistoriqueClient", joinColumns=@JoinColumn(name="idClient"),
                    inverseJoinColumns=@JoinColumn(name="idSessionFormation"))
        private Collection<SessionFormation> sessionsFormation;
    
    
        
        public Client(){
        }
    
        public Client(Agence agence, String nom, String prenom, String sexe, Date naissance,
                String adresse, String ville, String telephone, String email, Date dateInscription,
                Date dateCodeRoute, Commercial commercial){
    
            this.agence=agence;
            this.nom=nom;
            this.prenom=prenom;
            this.sexe=sexe;
            this.naissance=naissance;
            this.adresse=adresse;
            this.ville=ville;
            this.telephone=telephone;
            this.email=email;
            this.dateInscription=dateInscription;
            this.dateCodeRoute=dateCodeRoute;
            this.commercial = commercial;
    
        }
    //...
    


    Et la classe Personne dont hérite Client :

    @Entity
    public abstract class Personne implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        protected Long id;
    
        @Version
        protected Long version;
    
        @Column(length=20)
        protected String login;
    
        @Column(length=50)
        protected String password;
    
        @Column(length=32)
        protected String nom;
    
        @Column(length=32)
        protected String prenom;
    
        @Column(length=3)
        protected String sexe;
    
        @Temporal(javax.persistence.TemporalType.DATE)
        protected Date naissance;
    
        @Column(length=60)
        protected String adresse;
    
        @Column(length=32)
        protected String ville;
    
        @Column(length=15)
        protected String telephone;
        
        @Column(length=50)
        protected String email;
    //...
    


    Et pour finir le persistence.xml, au cas où :

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.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_2_0.xsd">
      <persistence-unit name="safeDriving-PU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
          <!-- Autodétection des classes à persister -->
          <property name="hibernate.archive.autodetection" value="class, hbm"/>
          <!-- connexion JDBC -->
          <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
          <property name="hibernate.connection.url" value="jdbc:mysql://localhost/safeDriving"/>
          <property name="hibernate.connection.username" value="root"/>
          <property name="hibernate.connection.password" value="root"/>
          <!-- création automatique du schéma -->
          <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
          <!-- dialecte -->
          <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
        </properties>
      </persistence-unit>
    </persistence>
    


    PS : à noter que mes classes DAO sont générées automatiquement par Netbeans (ah fainéantise, tu es la souveraine des programmeurs !)

    J'ai bien entendu passer pas mal de temps à chercher l'erreur, mais étant débutant en JPA je n'ai pas trouvé.
    Je vous remercie d'avance pour votre aide.



    Et le message d'erreur tout gros tout balèze :

    Citation : Maven 2

    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

    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2011 à 1:36:08

      Essaie pour les many to one, de les remplacer par ça.
      @ManyToOne(fetch = FetchType.LAZY, optional = true)
      


      Sinon, dans les dux entités PanierClient et Client, certains champs ne sont liés à aucune colonne.

      @Temporal(javax.persistence.TemporalType.DATE)
          @Column(/* il n'y a pas la table*/nullable=false)
          private Date dateInscription;
      
      • Partager sur Facebook
      • Partager sur Twitter
        24 mai 2011 à 9:30:39

        Merci de ta réponse omegas, mais j'ai toujours la même erreur en implémentant ta solution.

        Edit : j'ai remplacé
        @ManyToOne
            @JoinColumn(table="Offre")
            private Offre offre;
        


        par :
        @ManyToOne
            @JoinColumn(name="Offre", referencedColumnName="id")
            private Offre offre;
        



        En revanche j'ai une nouvelle erreur qui apparait :

        Citation : Maven 2

        Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: com.safedriving.beans.Calendrier.client



        J'ai essayé d'implémenter la collection de Calendrier dans la classe Client, qui n'existait pas jusqu'ici, mais idem. Et je n'ai pas trouvé grand chose d'autre en cherchant sur le net.

        Classe Calendrier :

        @Entity
        public class Calendrier implements Serializable {
            private static final long serialVersionUID = 1L;
            @Id
            @GeneratedValue(strategy = GenerationType.AUTO)
            private Long id;
         
            @Version
            private int version;
         
            @OneToMany
            @JoinColumn(name="calendrierClient", referencedColumnName="id")
            @Column(nullable=true)
            private Client client;
         
            @OneToMany
            @JoinColumn(name="calendrierFormateur", referencedColumnName="id")
            @Column(nullable=true)
            private Formateur formateur;
         
            @OneToMany
            @JoinColumn(name="calendrierVehicule", referencedColumnName="id")
            @Column(nullable=true)
            private Vehicule vehicule;
         
            @Temporal(javax.persistence.TemporalType.DATE)
            @Column(nullable=false)
            private Date jour;
         
            @Column(length=2, nullable=false)
            private int heureDebut;
         
            @Column(length=2, nullable=false)
            private int heureFin;
        



        Classe Client :

        @Entity
        public class Client extends Personne{
         
            @ManyToOne
            @JoinColumn(name="Agence", referencedColumnName="id")
            private Agence agence;
         
            @Temporal(javax.persistence.TemporalType.DATE)
            @Column(nullable=false)
            private Date dateInscription;
         
            @Temporal(javax.persistence.TemporalType.DATE)
            @Column(nullable=true)
            private Date dateCodeRoute;
         
            @ManyToOne
            @JoinColumn(name="Commercial", referencedColumnName="id")
            private Commercial commercial;
         
            @ManyToMany
            @JoinTable(name="HistoriqueClient", joinColumns=@JoinColumn(name="idClient"),
                        inverseJoinColumns=@JoinColumn(name="idSessionFormation"))
            private Collection<SessionFormation> sessionsFormation;
         
        //Collection rajoutée après qu'il m'ait généré l'erreur remontée, mais ça n'a rien changé 
            @OneToMany(mappedBy="calendrierClient")
            private Collection<Calendrier> calendriers;
        
        • Partager sur Facebook
        • Partager sur Twitter

        [JPA] création des tables impossible

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown