Grails: cartographie de domaine de classe (collection des types d'utilisateurs de mise en veille prolongée)
-
26-09-2019 - |
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.
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.