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

class Foo {
    String BARID
    int NUM1
}

当我尝试持久化对象时,Hibernate抛出异常(“org.springframework.orm.hibernate3.HibernateSystemException:为类提供了错误类型的ID”)抱怨我的ID应该是Long类型而不是String。但我不希望BARID实际上是表中的ID,出于无关的原因,它只是以这种方式命名。为了下游兼容,我需要该变量在对象以及数据库中都显示为BARID。(其他程序要求将其称为BARID)。

显然,冬眠试图在幕后花哨并找出哪些字段是ID。我如何告诉休眠与它可能的想法相反,这不是id字段?

更新:我意识到可变大小写是非标准的,但是我宁愿保持原样,除非那是造成这种情况的原因。 (出于记录,我尝试切换到所有小写的“barid”,但得到的异常完全相同)。

解决方案:我使用了Jeff建议的显式定义映射块的解决方案:
static mapping = {
    id generator: 'increment'
}

最佳答案

听起来您仍然仍然想要普通的id字段,所以如果您将其添加到域对象中,应该没问题,我在Grails 2.3.1上对此进行了测试

class Foo {
    Long id
    String BARID
    int NUM1
}

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

10-07 12:02