【问题标题】:user table with javaDB and Hibernate from within grailsgrails 中带有 javaDB 和 Hibernate 的用户表
【发布时间】:2010-04-16 07:57:54
【问题描述】:

让我们看看我能否以一种可以理解的方式问这个问题......

我从 grails 开始并创建了一个名为 user 的域类。据我了解,Hibernate 用于将这个域类映射到数据库。这与 hsqldb 配合得很好。

现在我尝试切换到 javaDB 并收到一条错误消息,因为该表称为“用户”(这似乎是 javaDB 的保留字)。

所以像

这样的声明
create table user ...

将导致错误消息。

create table "user" ...

有效,但 Hibernate 似乎没有将表名放在引号中。

如何将 Hibernate 配置为使用引号以使其与我的表名一起使用?

PS:是的,我知道,我可以将域类映射到另一个表名...:-)

【问题讨论】:

  • 请更正休眠 -> 休眠以保持标签一致性。

标签: hibernate orm grails derby javadb


【解决方案1】:

您是否尝试用双引号将 table 名称括起来:

class User {
  ..
  static mapping = {
      table '"user"'
  }
}

更新:这样做的后果之一是您还必须使用 joinTable 关键字自定义连接表的名称。这听起来很合理,但约定是 Grails 的好处之一,不依赖它们在某种程度上违背了它的理念。我个人会避免在这里使用保留字(即不是user)。

【讨论】:

  • 不起作用,因为 hibernate 创建了其他表,这些表在名称中包含此表名:不成功:创建表“user”_permissions (user_id bigint, permissions_string varchar(255))
  • @Ralf 是的,没想到。
【解决方案2】:

知道了。 正如 Pascal 已经提到的,映射条目是关键。但是不要使用双引号,反引号会带来成功:

static mapping = {
  table "`user"
}

这告诉 hibernate 在生成 sql 时将表名放在引号中。 它似乎也适用于所有相应的表......但不知何故,它在其中一些表中删除了“用户”的最后一个字符...... :-(

因此,似乎确实将域类重新映射到不会导致任何问题的表名将是最好的方法:

static mapping = {
  table "appuser"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多