Pregunta

Me pregunto si es posible implementar el siguiente modelo de dominio.

Tengamos una clase de dominio que contenga un conjunto de intervalos (tiempo joda).Puedo usar el tipo de usuario de hibernación org.joda.time.contrib.hibernate.PersistentInterval para mapear el intervalo a la tabla de la base de datos (de manera similar a como en http://www.grails.org/JodaTime+Plugin).Sin embargo, no puedo entender cómo implementar el mapeo si tengo un conjunto de intervalos, no solo un intervalo.

Ejemplo:

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 implementación anterior falla con el siguiente error:

2010-10-23 18: 30: 25,483 [Principal] Contexto de error. GrailScontextLoader-Error al ejecutar bootstraps:Error a crear bean con el nombre 'Messagesurce':Falló la inicialización del bean;La excepción anidada es org.springframework.beans.factory.beanCreationException:Error a crear Bean con el nombre 'TransactionManager':No se puede resolver la referencia a Bean 'SessionFactory' al establecer la propiedad de Bean 'SessionFactory';La excepción anidada es org.springframework.beans.factory.beanCreationException:Error a crear Bean con el nombre 'SessionFactory':La invocación del método init falló;La excepción anidada es org.hibernate.MappingException:Clave externa (FK4FDC5B1E5107CA0: Activity_Intervals [Start, End])) debe tener el mismo número de columnas que la clave principal referenciada (Actividad [ID]) org.springframework.beans.factory.BeanCreatCeationException:Error a crear bean con el nombre 'Messagesurce':La inicialización del bean falló;La excepción anidada es org.springframework.beans.factory.beanCreationException:Error a crear Bean con el nombre 'TransactionManager':No se puede resolver la referencia a Bean 'SessionFactory' al establecer la propiedad de Bean 'SessionFactory';La excepción anidada es org.springframework.beans.factory.beanCreationException:Error a crear Bean con el nombre 'SessionFactory':La invocación del método init falló;La excepción anidada es org.hibernate.MappingException:Clave externa (FK4FDC5B1E5107CA0: Activity_Intervals [Start, End])) debe tener el mismo número de columnas que la clave primaria referenciada (Actividad [id]) en org.grails.tomcat.tomcatserver.start (TomCatserver.groovy: 212)

Pensé que la solución a este problema es extraer Interval para separar la clase de dominio que extiende Interval y especificar el mapeo dentro de él.Sin embargo, Interval es la clase final, por lo que no es posible ampliarla.

Gracias por tus consejos.

¿Fue útil?

Solución

Estoy respondiendo mi propia pregunta, tal vez esta respuesta sea útil para alguien.

Hasta ahora sólo he encontrado una manera de implementar el modelo dado: mediante Hibernar archivos de mapeo 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 implementación de clase de dominio:

class Activity {    
    Long id    
    Set intervals = []

    static constraints = {
    }
}

También tuve que mover la clase de dominio de grails-app/domain al directorio src/groovy; de lo contrario, la ejecución de la aplicación falló con (grails-1.3.5):

...
org.hibernate.DuplicateMappingException:Mapeo de mapeo de clase/entidad duplicada. Actividad
...

El segundo problema con la implementación anterior que descubrí es que cuando activé el andamio (con fines de prueba) mediante:

class ActivityController {
    static scaffold = true
    ...
}

La demostración de la actividad creada falló con el error:

Mensaje de excepción:No existe tal propiedad:identificación de la clase:org.joda.time.interval posibles soluciones:final Causado por:Error Evaluación de la expresión [i.id] en línea [38]:No existe tal propiedad:ID para la clase:org.joda.time.interval posibles soluciones:fin

pero la implementación manual para obtener actividades de la base de datos y su visualización funcionó.

Editar:Además, encontré una solución para problemas de andamios y DuplicateMappingException.Fueron causados ​​por una ubicación no válida de Activity.hbm.xml: faltaba la estructura del directorio del paquete.La ubicación correcta es grails-app/conf/hibernate/mappingtest/Activity.hbm.xml.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top