Groovy Griffon с классом подключаемого модуля Hibernate4 не найдено исключение

Я искал быстрый и простой способ написать очень кросс-платформенное настольное приложение. Это наводит меня на мысль, что JVM — это то, что нужно. Поскольку на моем рабочем месте используется Groovy (Grails), я решил попробовать Griffon, поскольку они утверждают, что это, по сути, Grails для настольных компьютеров.

Мне нужен уровень управления постоянством, и похоже, что GORM готов к показу в этой среде, поэтому я перешел на спящий режим, используя плагин Hibernate4 для Griffon.

Не то чтобы я действительно использовал Hibernate в целом, но, основываясь на руководствах, я считаю, что делаю все правильно. Мои сборы показывают, что это не поддерживает аннотации для подключения классов, поэтому я использую файлы hbm.xml.

Предоставленный пример для подключаемого модуля не сложен, но я не понять, где я отклоняюсь.

Вот пример файла класса в его нынешнем виде:

package gwash

import groovy.beans.Bindable

class DeliveryMethodModel {
   // @Bindable String propName
}

Вот часть трассировки стека:

org.hibernate.InvalidMappingException: Could not parse mapping document from res
ource gwash\DeliveryMethod.hbm.xml
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Con
figuration.java:3415)
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueu
e(Configuration.java:3404)
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(C
onfiguration.java:3392)
        at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:
1341)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.jav
a:1737)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.jav
a:1788)
        at org.hibernate.cfg.Configuration$buildSessionFactory.call(Unknown Sour
ce)
        at griffon.plugins.hibernate4.Hibernate4Connector.connect(Hibernate4Conn
ector.groovy:72)
        at griffon.plugins.hibernate4.Hibernate4Connector.connect(Hibernate4Conn
ector.groovy)
        at griffon.plugins.hibernate4.Hibernate4Connector$connect.call(Unknown S
ource)
        at Hibernate4GriffonAddon.addonInit(Hibernate4GriffonAddon.groovy:27)
        at griffon.core.GriffonAddon$addonInit.call(Unknown Source)
        at griffon.core.GriffonAddon$addonInit.call(Unknown Source)
        at org.codehaus.griffon.runtime.util.AddonHelper.handleAddon(AddonHelper
.groovy:155)
        at org.codehaus.griffon.runtime.util.AddonHelper.handleAddonsAtStartup(A
ddonHelper.groovy:105)
        at org.codehaus.griffon.runtime.core.DefaultAddonManager.doInitialize(De
faultAddonManager.java:33)
        at org.codehaus.griffon.runtime.core.AbstractAddonManager.initialize(Abs
tractAddonManager.java:101)
        at org.codehaus.griffon.runtime.util.GriffonApplicationHelper.initialize
AddonManager(GriffonApplicationHelper.java:320)
        at org.codehaus.griffon.runtime.util.GriffonApplicationHelper.prepare(Gr
iffonApplicationHelper.java:123)
        at org.codehaus.griffon.runtime.core.AbstractGriffonApplication.initiali
ze(AbstractGriffonApplication.java:221)
        at griffon.swing.AbstractSwingGriffonApplication.bootstrap(AbstractSwing
GriffonApplication.java:74)
        at griffon.swing.AbstractSwingGriffonApplication.run(AbstractSwingGriffo
nApplication.java:131)
        at griffon.swing.SwingApplication.main(SwingApplication.java:36)
Caused by: org.hibernate.PropertyNotFoundException: field [id] not found on gwas
h.DeliveryMethodModel
        at org.hibernate.property.DirectPropertyAccessor.getField(DirectProperty
Accessor.java:182)
        at org.hibernate.property.DirectPropertyAccessor.getField(DirectProperty
Accessor.java:189)
        at org.hibernate.property.DirectPropertyAccessor.getField(DirectProperty
Accessor.java:189)
        at org.hibernate.property.DirectPropertyAccessor.getField(DirectProperty
Accessor.java:189)
        at org.hibernate.property.DirectPropertyAccessor.getField(DirectProperty
Accessor.java:189)
        at org.hibernate.property.DirectPropertyAccessor.getField(DirectProperty
Accessor.java:174)
        at org.hibernate.property.DirectPropertyAccessor.getGetter(DirectPropert
yAccessor.java:197)
        at org.hibernate.internal.util.ReflectHelper.getter(ReflectHelper.java:2
53)
        at org.hibernate.internal.util.ReflectHelper.reflectedPropertyClass(Refl
ectHelper.java:229)
        at org.hibernate.mapping.SimpleValue.setTypeUsingReflection(SimpleValue.
java:326)
        at org.hibernate.cfg.HbmBinder.bindSimpleId(HbmBinder.java:449)
        at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBi
nder.java:382)
        at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:322)
        at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:173)
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Con

Мой файл сопоставления xml:

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="gwash">
    <class name="DeliveryMethodModel" table="[DELIVERY METHODS]">
        <id name="id" column="[DELIVERY METHOD ID]">
            <generator class="increment"/>
        </id>
        <property name="method" column="[DELIVERY METHOD]"/>
    </class>
</hibernate-mapping>

РЕДАКТИРОВАТЬ: я удалил скобки и пробелы, как указано. Изменен DataSource.groovy на «создание» на стороне БД. Все еще испытываю те же проблемы. Примеры интеграции гибернации с griffon/hsqldb/groovy скудны по деталям. Нужно ли мне создавать все заданные свойства для файлов модели, чтобы это правильно анализировалось? Я никогда не использовал спящий режим. Ни заводной. Ни грифон. Я определенно предоставлю отзыв сообществу, если смогу решить эту проблему, если нет, я буду запускать свой собственный ORM, поскольку это довольно небольшой проект. Скорее не кати мне собственное.


person Rig    schedule 20.11.2012    source источник


Ответы (1)


у вас действительно есть строки, обернутые [и ]?

Я подозреваю, что для класса, определенного как

package gwash
import groovy.beans.Bindable
class DeliveryMethodModel {
    Long id
    @Bindable String method
}

файл сопоставления будет

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="gwash">
    <class name="DeliveryMethodModel" table="DELIVERY_METHODS">
        <id name="id" column="DELIVERY_METHOD_ID">
            <generator class="increment"/>
        </id>
        <property name="method" column="DELIVERY_METHOD"/>
    </class>
</hibernate-mapping>
person Andres Almiray    schedule 20.11.2012
comment
Возможно ли, что имена таблиц были определены с пробелами? Скобки были просто тем, что я пытался. Эти строки изначально не имели этого и все еще генерировали ошибки. - person Rig; 20.11.2012
comment
PS: я должен добавить, что база данных основана на HSQLDB, изначально разработанной в LibreOffice. В именах таблиц есть пробелы. - person Rig; 20.11.2012
comment
Я могу подтвердить, что наличие пробелов в именах таблиц приводит к странным проблемам как с HSQLDB, так и с H2. - person Andres Almiray; 20.11.2012
comment
Вы пришли к каким-либо решениям по этому поводу или вам пришлось переименовать свои таблицы? - person Rig; 20.11.2012
comment
Я переименовал таблицы, чтобы не было пробелов и не буквенно-цифровых символов. - person Andres Almiray; 20.11.2012
comment
Это вполне может быть ответом, который я ищу. Я попробую сегодня вечером и вернусь к этому. - person Rig; 20.11.2012
comment
Я удалил скобки и переименовал свои таблицы, но все равно получаю очень похожий результат. Моим первым побуждением было начать с БД с чистого листа. Я установил для DataSource.groovy значение «создать». Насколько я понимаю, он должен создать новую базу данных с этой схемой. По-прежнему не удается проанализировать тот же файл hbm.xml с тем же сообщением. - person Rig; 21.11.2012
comment
PS: нужно ли объявлять свойства в классах модели, чтобы эта компиляция работала? Документация по плагину отсутствует, и в противном случае у меня 0% спящего режима. - person Rig; 21.11.2012
comment
Да, в классе модели должны быть определены те же свойства, что и в файле сопоставления. Обратите внимание на классы модели Griffon != классы предметной области, такие как в Grails, они являются моделями представления, поэтому этот плагин не обеспечивает поведение, подобное GORM. Документация плагина hibernate4 предполагает некоторое рабочее знание Hibernate со стороны разработчика, поскольку она просто предоставляет средства для подключения к БД через спящий режим; до сих пор проблема заключалась в понимании синтаксиса файла сопоставления. В настоящее время мы работаем над GORM-подобным API для Griffon, но он еще не готов для публичного использования. - person Andres Almiray; 21.11.2012