我还是Grails和Hibernate的新手,所以如果你回答,请记住我只使用了IDE 5天。我有一个我想连接的MYSQL数据库。我将数据库设置为更新,因为我稍后需要。然后我运行db-reverse-engineer插件,它会在STS中为所有表自动生成groovy文件。当我查看文件时我注意到的文件是静态映射。我测试了一个表并创建了它的控制器以显示所有记录。它运行得很完美。当我查看表结构时,它会创建2个新列“id”和“version”。所以我注意到静态映射看起来像这样:
class TopTen {
Integer ttMlId
Integer ttWeekId
Integer ttAmount
Integer ttRank
static mapping = {
id column: "tt_id"
version false
}
}
当我删除它们时,它根本不起作用。我可以理解第二行,但不知道为什么它会在数据库中创建一个新列,我不明白它是什么版本或为什么它在逆向工程时把它放在那里。
这是MySQL数据库版本5.0.51中的db表
DROP TABLE IF EXISTS `top_ten`;
CREATE TABLE `top_ten` (
`tt_id` int(10) unsigned NOT NULL auto_increment,
`tt_ml_id` int(10) unsigned NOT NULL default '0',
`tt_week_id` int(10) unsigned NOT NULL default '601',
`tt_amount` int(10) unsigned NOT NULL default '0',
`tt_rank` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`tt_id`)
) ENGINE=InnoDB AUTO_INCREMENT=511 DEFAULT CHARSET=latin1;
答案 0 :(得分:3)
Hibernate可以使用乐观锁定,默认情况下,它为所有GORM域类启用。但是,如果在遗留表中没有要使用的列,或者由于某种原因要显式禁用它,则可以将version false
添加到映射块,它将不会处于活动状态。< / p>
通过将您认为正在编辑的版本与更新行时的当前版本进行比较来实现乐观锁定,如果存在不匹配,则假设在读取要显示的行之间存在另一个用户的编辑编辑表单以及提交更新数据的时间。它被称为乐观,因为没有明确的锁定,这更安全但更昂贵,并且希望两个用户不会同时编辑同一行。
如果您在数据库中看到一个带有该映射块的新“id”列,则表明存在问题。这应该告诉GORM主键列的非标准列名称为'ttx_id',并使用它而不是它通常使用的'id'列。请在Grails-Reverse-Engineer组件下的http://jira.codehaus.org/browse/GRAILSPLUGINS创建一个错误报告,并包含当前数据库表SQL和生成的域类的内容,我将看一下。