Domanda

Mi chiedo se è possibile implementare seguente modello di dominio.

Diamo una classe di dominio che contiene un insieme di intervalli (tempo Joda). Posso usare org.joda.time.contrib.hibernate.PersistentInterval tipo di utente Hibernate per la mappatura di intervallo di tabella di database (per modo simile come in http://www.grails.org/JodaTime+Plugin ). Tuttavia non riesco a capire come implementare la mappatura se ho impostato di intervalli, non solo un intervallo.

Esempio:

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"  
       }  
   }  
     

}

Attuazione precedente non riesce con errore seguente:

  

2010-10-23 18: 30: 25.483 [principale] ERRORE   context.GrailsContextLoader - Errore   l'esecuzione di bootstrap: creazione Errore   fagioli con nome 'MessageSource':   L'inizializzazione di Bean non è riuscito; nidificato   eccezione è   org.springframework.beans.factory.BeanCreationException:   Errore nella creazione di fagioli con nome   'TransactionManager': non può risolvere   riferimento fagiolo 'sessionFactory'   mentre la proprietà impostazione di fagioli   'SessionFactory'; l'eccezione annidata è   org.springframework.beans.factory.BeanCreationException:   Errore nella creazione di fagioli con nome   'SessionFactory': Invocazione di init   Metodo fallito; l'eccezione annidata è   org.hibernate.MappingException:   chiave esterna   (FK4FDC5B1E5107CA0: activity_intervals   [Inizio, fine])) deve avere lo stesso numero di   colonne come la chiave primaria di riferimento   (Attività [id])   org.springframework.beans.factory.BeanCreationException:   Errore nella creazione di fagioli con nome   'MessageSource': inizializzazione   fagiolo non è riuscita; l'eccezione annidata è   org.springframework.beans.factory.BeanCreationException:   Errore nella creazione di fagioli con nome   'TransactionManager': non può risolvere   riferimento fagiolo 'sessionFactory'   mentre la proprietà impostazione di fagioli   'SessionFactory'; l'eccezione annidata è   org.springframework.beans.factory.BeanCreationException:   Errore nella creazione di fagioli con nome   'SessionFactory': Invocazione di init   Metodo fallito; l'eccezione annidata è   org.hibernate.MappingException:   chiave esterna   (FK4FDC5B1E5107CA0: activity_intervals   [Inizio, fine])) deve avere lo stesso numero di   colonne come la chiave primaria di riferimento   (Attività [id])           a org.grails.tomcat.TomcatServer.start (TomcatServer.groovy: 212)

ho pensato che il lavoro-around di questo problema è quello di estrarre Intervallo di classe dominio separato che si estende Intervallo e specificare la mappatura all'interno di esso. Tuttavia, Interval è di classe finale in modo che si estende non è possibile.

Grazie per i vostri consigli.

È stato utile?

Soluzione

I rispondo alla mia domanda, forse questa risposta sarà utile per qualcuno.

Fino ad ora ho trovato solo un modo come implementare dato modello - dal Hibernate file di mapping 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>  

e l'implementazione della classe di dominio:

class Activity {    
    Long id    
    Set intervals = []

    static constraints = {
    }
}

Ho dovuto anche alla classe di dominio passaggio dal graal-app / dominio directory src / Groovy, altrimenti applicazione in esecuzione non riuscita con (graal-1.3.5):

  

...
  org.hibernate.DuplicateMappingException:   Classe Duplicate / mappatura entità   mappingtest.Activity
  ...

Secondo problema con sopra implementazione che ho scoperto è che quando ho acceso ponteggi (per testare scopo) da:

class ActivityController {
    static scaffold = true
    ...
}

che mostra l'attività creata non riuscita con errore:

  

Messaggio di eccezione: No tali beni:   id per la classe: org.joda.time.Interval   Possibili soluzioni: fine causati da:   Errore di valutazione di espressione [i.id] su   linea [38]: No tale proprietà: id per   Classe: org.joda.time.Interval Possible   Le soluzioni: end

ma manuale realizzazione di ottenere attività da DB e la sua rappresentazione ha funzionato.

Edit: Inoltre ho trovato la soluzione di problemi di ponteggi e DuplicateMappingException. Essi sono stati causati da posizione non valida di Activity.hbm.xml - struttura di directory del pacchetto mancava. posizione corretta è graal-app / conf / hibernate / mappingtest / Activity.hbm.xml.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top