Grails: cartographie de domaine de classe (collection des types d'utilisateurs de mise en veille prolongée)

StackOverflow https://stackoverflow.com/questions/4012853

Question

Je me demande si on peut mettre en œuvre suivant le modèle de domaine.

Ayons une classe de domaine qui contient l'ensemble des intervalles (temps de Joda). Je peux utiliser le type d'utilisateur mise en veille prolongée org.joda.time.contrib.hibernate.PersistentInterval pour la cartographie de l'intervalle à la table de base de données (par la même manière que dans http://www.grails.org/JodaTime+Plugin ). Cependant, je ne peux pas comprendre comment mettre en œuvre la cartographie si j'ai mis des intervalles, non seulement un intervalle.

Exemple:

class Activity {  
   ...    
   Set intervals = []  
   ...  
   static hasMany = [    
       intervals: org.joda.time.Interval  
   ]  

   // This is incorrect implementation, I have set of intervals  
   // and this would be correct if I had only one interval  
   // How to implement mapping in this case?  
   static mapping = {  
       intervals type: PersistentInterval, {  
           column name: "start"  
           column name: "end"  
       }  
   }  
     

}

La mise en œuvre ci-dessus échoue avec l'erreur suivante:

  

23/10/2010 18: 30: 25.483 [main] ERREUR   context.GrailsContextLoader - Erreur   exécution bootstraps: création d'erreur   haricot avec le nom « MessageSource »:   Initialisation du haricot a échoué; nichée   exception   org.springframework.beans.factory.BeanCreationException:   Erreur de création de haricot avec le nom   « TransactionManager »: Impossible de résoudre   référence aux haricots « sessionFactory »   tout en définissant la propriété de haricots   'SessionFactory'; exception imbriquée est   org.springframework.beans.factory.BeanCreationException:   Erreur de création de haricot avec le nom   'SessionFactory': Invocation d'initialisation   procédé a échoué; exception imbriquée est   org.hibernate.MappingException:   Clé étrangère   (FK4FDC5B1E5107CA0: activity_intervals   [Début, fin])) doit avoir le même nombre de   colonnes que la clé primaire référencée   (Activité [id])   org.springframework.beans.factory.BeanCreationException:   Erreur de création de haricot avec le nom   « MessageSource »: Initialisation   haricot a échoué; exception imbriquée est   org.springframework.beans.factory.BeanCreationException:   Erreur de création de haricot avec le nom   « TransactionManager »: Impossible de résoudre   référence aux haricots « sessionFactory »   tout en définissant la propriété de haricots   'SessionFactory'; exception imbriquée est   org.springframework.beans.factory.BeanCreationException:   Erreur de création de haricot avec le nom   'SessionFactory': Invocation d'initialisation   procédé a échoué; exception imbriquée est   org.hibernate.MappingException:   Clé étrangère   (FK4FDC5B1E5107CA0: activity_intervals   [Début, fin])) doit avoir le même nombre de   colonnes que la clé primaire référencée   (Activité [id])           à org.grails.tomcat.TomcatServer.start (TomcatServer.groovy: 212)

Je pensais que le travail autour de cette question est d'extraire l'intervalle pour séparer la classe de domaine extension d'intervalle et préciser la cartographie à l'intérieur. Cependant, l'intervalle est classe finale d'extension est donc pas possible.

Merci pour vos conseils.

Était-ce utile?

La solution

Je réponds à ma propre question, peut-être cette réponse sera utile pour quelqu'un.

Jusqu'à présent j'ai trouvé qu'une seule façon comment mettre en œuvre le modèle donné - par Hibernate fichiers de mappage XML :

<hibernate-mapping package="mappingtest">  
    <class name="Activity">  
        <id name="id">  
            <generator class="native"/>  
        </id>  
        <set name="intervals">  
            <key column="activity_id" not-null="true"/>  
            <element type="org.joda.time.contrib.hibernate.PersistentInterval">  
                <column name="startDate"/>  
                <column name="endDate"/>  
            </element>  
        </set>  
    </class>  
</hibernate-mapping>  

et la mise en œuvre de classe de domaine:

class Activity {    
    Long id    
    Set intervals = []

    static constraints = {
    }
}

J'ai aussi dû déplacer la classe de domaine de Grails-app / domaine dans le répertoire src / groovy, sinon l'application en cours d'exécution a échoué avec (Grails-1.3.5):

  

...
  org.hibernate.DuplicateMappingException:   classe en double / cartographie de l'entité   mappingtest.Activity
  ...

Deuxième problème avec la mise en œuvre ci-dessus, je l'ai découvert est que lorsque je me suis tourné sur un échafaudage (à des fins de test) par:

class ActivityController {
    static scaffold = true
    ...
}

montrant l'activité créée échoué avec l'erreur:

  

Message d'exception: Aucun bien:   id pour la classe: org.joda.time.Interval   Solutions possibles: fin causée par:   Erreur d'évaluer l'expression [i.id] sur   ligne [38]: Aucun bien: id pour   Classe: org.joda.time.Interval possible   solutions: fin

mais la mise en œuvre manuelle d'obtenir des activités de DB et sa montrant travaillé.

Edit: en plus j'ai trouvé solution de problèmes d'échafaudage et DuplicateMappingException. Ils ont été causés par emplacement non valide de Activity.hbm.xml - structure de répertoire du paquet était manquant. Emplacement correct est Grails-app / conf / mise en veille prolongée / mappingtest / Activity.hbm.xml.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top