Grails: сопоставление класса доменов (коллекция типов пользователей Hibernate)

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

Вопрос

Мне интересно, можно ли реализовать следующую модель домена.

Давайте имеем класс домена, который содержит набор интервалов (время Joda). Я могу использовать org.joda.time.contrib.hibernate.persistentInterval Hibernate Тип пользователя для отображения интервала в таблицу базы данных (по аналогичным образом, как в http://www.grails.org/jodatime+plugin.). Однако я не могу выяснить, как реализовать отображение, если у меня есть набор интервалов, не только один интервал.

Пример:

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

}

Внедрение выше не удалось со следующей ошибкой:

2010-10-23 18: 30: 25,483 [Главная] Ошибка Context.grailscontextLoader - ошибка выполнения Bootstraps: ошибка Создание компонента с именем «MessageSource»: инициализация файла BEAL; Вложенное исключение является org.springframework.beans.fiftory.beancreationexception.beancrationionexception: ошибка Создание компонента с именем «TransactionManager»: не может разрешить ссылку на компонент Bean 'SessionFactory' при установке свойства компонентов «SESSIC); Вложенное исключение является org.springframework.beans.ferfactory.beancreationexception: ошибка Создание компонента с именем «Sessionfactory»: вызов метода INIT не удалось; Вложенное исключение является org.hibernate.mappeException: внешний ключ (FK4FDC5B1E5107CA0: Activity_Intervalials [Пуск, конец])) Должен иметь то же количество столбцов в качестве ссылочного первичного ключа (действие [ID]) ORG.SPRINGFRAMEWORK. Создание бобов с именем «Messagesource»: инициализация фасоли не удалась; Вложенное исключение является org.springframework.beans.fiftory.beancreationexception.beancrationionexception: ошибка Создание компонента с именем «TransactionManager»: не может разрешить ссылку на компонент Bean 'SessionFactory' при установке свойства компонентов «SESSIC); Вложенное исключение является org.springframework.beans.ferfactory.beancreationexception: ошибка Создание компонента с именем «Sessionfactory»: вызов метода INIT не удалось; Вложенное исключение org.hibernate.mappingException: внешний ключ (FK4FDC5B1E5107CA0: Activity_Intervals [Пуск, конец])) Должен иметь то же количество столбцов в качестве ссылочного первичного ключа (активность [ID]) на org.grails.tomcat.tomcatserver.start ( Tomcatserver.groovy: 212)

Я думал, что работа - вокруг этого вопроса состоит в том, чтобы извлечь интервал для отделения доменного класса, расширяющего интервал и указываю сопоставление внутри него. Однако интервал является окончательным классом, поэтому расширение невозможно.

Спасибо за ваши советы.

Это было полезно?

Решение

Я отвечаю на свой вопрос, может быть, этот ответ будет полезен для кого-то.

До сих пор я нашел только один из способов реализации данной модели - Hibernate файлы отображения 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>  

И реализация класса доменов:

class Activity {    
    Long id    
    Set intervals = []

    static constraints = {
    }
}

Мне также пришлось переместить класс домена из Grails-App / Domain в каталог SRC / GROVY, в противном случае приложение работает неудачно с (Grails-1.3.5):

...
org.hibernate.duplicateMappingException: Дублирующееся класс / сопоставление объектов.
...

Вторая проблема с вышеуказанной реализацией, которую я обнаружил, что когда я включил леса (для цели тестирования):

class ActivityController {
    static scaffold = true
    ...
}

Отображение созданной активности не удалось с ошибкой:

Сообщение об исключении: нет такого свойства: ID для класса: org.joda.time.interval Возможные решения: конец, вызванные: Ошибка Оценка экспрессии [I.ID] в строке [38]: Нет такого свойства: ID для класса: org.joda .time.interval Возможные решения: конец

Но ручная реализация получения деятельности от БД и ее показано.

Редактировать: Дополнительно я нашел решение проблем лесов и дубликатем. Они были вызваны недействительным местоположением afe.hbm.xml - структура каталогов пакета отсутствовала. Правильное расположение - это Grails-App / Conf / Hibernate / Makingtestest / Activity.hbm.xml.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top