名称以“结束”结尾的成员变量;ID";被grails强制成为id(hibernate)

名称以“结束”结尾的成员变量;ID";被grails强制成为id(hibernate),hibernate,grails,gorm,Hibernate,Grails,Gorm,我有一个域类,它有许多成员变量。假设它看起来像这样: class Foo { String BARID int NUM1 } 当我试图持久化对象时,Hibernate抛出一个异常(“org.springframework.orm.hibernate3.HibernateSystemException:为类提供了错误类型的id”),抱怨我的id应该是长类型而不是字符串。。。但我不希望BARID实际上是表中的一个id,它只是因为不相关的原因而以这种方式命名。我需要该变量在对象和数据

我有一个域类,它有许多成员变量。假设它看起来像这样:

class Foo {
    String BARID
    int NUM1
}
当我试图持久化对象时,Hibernate抛出一个异常(“org.springframework.orm.hibernate3.HibernateSystemException:为类提供了错误类型的id”),抱怨我的id应该是长类型而不是字符串。。。但我不希望BARID实际上是表中的一个id,它只是因为不相关的原因而以这种方式命名。我需要该变量在对象和数据库中都显示为BARID,以实现下游兼容性(其他程序要求将其称为BARID)

显然,hibernate正试图隐藏起来,找出哪些字段是ID。我怎样才能告诉hibernate,与它可能认为的相反,这不是一个id字段

更新:我意识到变量的大小写是非标准的,但我更愿意保持它们的原样,除非这是它被破坏的原因。(为了记录在案,我尝试切换到所有小写字母“barid”,但得到了完全相同的例外)

解决方案:我使用Jeff建议的显式定义映射块的解决方案:

static mapping = {
    id generator: 'increment'
}

听起来你还是想要普通的id字段,所以如果你只是把它添加到域对象中,应该没问题,我在Grails2.3.1上测试了这个

class Foo {
    Long id
    String BARID
    int NUM1
}

另外,如果您不想使用该方法,您可以始终使用映射块来配置id。

听起来您仍然需要普通id字段,所以如果您只是将其添加到域对象中,应该可以。我在Grails 2.3.1上对此进行了测试

class Foo {
    Long id
    String BARID
    int NUM1
}


另外,如果您不想使用该方法,您可以始终使用映射块来配置id。

这是一种奇怪的行为。在域类的
映射
块中是否有任何内容?属性命名约定如何?字符串barId,int num1。映射块中没有任何内容。非常规命名的原因与以下事实有关:输入文件和下游使用者中的所有CAP都引用了这些变量。仅仅为了这一点胶水代码而改变案例似乎很愚蠢。好吧,你的问题+1:-)你确定问题出在BARID上,而不是当你试图访问其中一个项目时
Foo.get(“stringHere”)
可能会导致类似的情况。这是一种奇怪的行为。在域类的
映射
块中是否有任何内容?属性命名约定如何?字符串barId,int num1。映射块中没有任何内容。非常规命名的原因与以下事实有关:输入文件和下游使用者中的所有CAP都引用了这些变量。仅仅为了这一点胶水代码而改变案例似乎很愚蠢。好吧,你的问题+1:-)你确定问题出在BARID上,而不是当你试图访问其中一个项目时
Foo.get(“stringHere”)
可能会导致类似的情况。我刚刚尝试了两种“Long id”解决方案,得到了与以前相同的异常。我还尝试了映射块更改,也得到了相同的异常。我看了一下,正在运行Grails2.2.4。。。升级grails有可能解决这个问题吗?让我试试2.2.4。我试过2.2.4,但在一个干净的grails应用程序中,上面的长id没有出现错误。见鬼,我尝试升级到2.3.1,这当然彻底破坏了一切。我回到了2.2.4,我又回到了原来的问题。啊哈!!!事实证明,问题是,我使用“运行脚本”插入了这些内容,但“运行脚本”似乎不运行编译(如“运行应用”),因此我从未尝试过您建议的更改。我最终使用了映射语句,它工作得非常好-谢谢!我刚刚尝试了两种“长id”解决方案,得到了与以前相同的异常。我还尝试了映射块更改,也得到了相同的异常。我看了一下,正在运行Grails2.2.4。。。升级grails有可能解决这个问题吗?让我试试2.2.4。我试过2.2.4,但在一个干净的grails应用程序中,上面的长id没有出现错误。见鬼,我尝试升级到2.3.1,这当然彻底破坏了一切。我回到了2.2.4,我又回到了原来的问题。啊哈!!!事实证明,问题是,我使用“运行脚本”插入了这些内容,但“运行脚本”似乎不运行编译(如“运行应用”),因此我从未尝试过您建议的更改。我最终使用了映射语句,它工作得非常好-谢谢!