【问题标题】:Grails db-reverse-engineer id and versionGrails db-reverse-engineer id 和版本
【发布时间】:2011-03-17 13:47:17
【问题描述】:

我还是 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;

【问题讨论】:

    标签: grails mapping grails-plugin


    【解决方案1】:

    Hibernate 可以使用乐观锁定,默认情况下它对所有 GORM 域类都启用。但是,如果您在旧表中没有可用于该列的列,或者由于某种原因想要显式禁用它,您可以将 version false 添加到映射块中,它不会处于活动状态。

    乐观锁定是通过将​​您认为正在编辑的版本与更新行时的当前版本进行比较来实现的,如果存在不匹配,则假定在您读取要显示的行之间存在另一个用户的编辑编辑表单以及提交更新数据的时间。之所以称为乐观,是因为没有显式锁定,更安全但代价高昂,并且希望两个用户不会同时编辑同一行。

    如果您在数据库中看到带有该映射块的新“id”列,则说明有问题。这应该告诉 GORM 主键列有一个非标准的列名 'ttx_id' 并使用它而不是它通常使用的 'id' 列。请在 Grails-Reverse-Engineer 组件下的http://jira.codehaus.org/browse/GRAILSPLUGINS 处创建一个错误报告,并包括当前数据库表 SQL 和生成的域类的内容,我会看看。

    【讨论】:

    • 如果我什至可以找到在哪里创建一个新问题,我会的。我去了链接,它不允许我提出新问题。所以问题版本是错误的,并且 id 被映射到一个非标准的命名 id 列,但是当我将数据库连接标记为更新时,它仍然创建了列“id 和版本”。
    • 您只需在jira.codehaus.org/secure/Signup!default.jspa注册一个帐户
    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多