Grails: сопоставление класса доменов (коллекция типов пользователей Hibernate)
-
26-09-2019 - |
Вопрос
Мне интересно, можно ли реализовать следующую модель домена.
Давайте имеем класс домена, который содержит набор интервалов (время 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.