1

我一直在寻找一种快速简便的方法来编写一个非常跨平台的桌面应用程序。这让我想到 JVM 是我应该去的地方。由于我的工作场所使用了 Groovy (Grails),我想我会尝试 Griffon,因为他们声称它本质上是桌面的 Grails。

我想要一个持久性管理层,而且在这个环境中 GORM 似乎还没有准备好,所以我使用 Griffon 的 Hibernate4 插件转向休眠。

并不是说我真的总体上使用过 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 更改为“创建”。仍然遇到同样的问题。hibernate 与 griffon/hsqldb/groovy 集成的示例缺乏详细信息。我是否需要为模型文件创建所有给定属性才能正确解析?我从来没有使用过休眠。也不时髦。也不是狮鹫。如果我能解决这个问题,我肯定会为社区提供反馈,否则我会推出自己的 ORM,因为这是一个相当小的项目。而不是我自己。

4

1 回答 1

3

你真的用[and包裹了字符串]吗?

我怀疑对于定义为的类

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>
于 2012-11-20T08:35:59.637 回答