使用Grails访问旧版PostgreSQL表时丢失表错误

时间:2013-05-06 10:17:14

标签: hibernate postgresql grails gorm

我一直试图从我的 Grails 应用程序连接到 PostgreSQL 数据库的遗留表几天,但没有成功。

我想要什么

我想要的只是从我的grails应用程序查询此表(已存储用户)以检查登录凭据。用户登录grails应用程序,我必须检查提供的密码是否与此表中存储的密码匹配。

由于我尝试访问的表名为“ user ”(这是一个关键字),我创建了一个别名视图“ users ”,这是一个我使用grails,只是为了避免可能的问题。

下面我提供有关我的问题的其他信息,希望有人可以帮助我。

手动查询结果

在控制台中直接从postgres执行select * from public.users时,我得到以下结果:

                id                    |   name    |           apikey          |          created           | about | openid |            password           | fullname |            email             | reset_key 
--------------------------------------+-----------+---------------------------+----------------------------+-------+--------+-------------------------------+----------+------------------------------+-----------
 ef8661be-6627-40e3-8b58-e78f3363680f | logged_in | this-is-an-api-key-sample | 2012-12-11 14:17:28.949515 |       |        |                               |          |                              | 
 0c49f23a-350c-43d9-a1ec-34057125acd7 | visitor   | this-is-an-api-key-sample | 2012-12-11 14:17:28.953194 |       |        |                               |          |                              | 
 591798d4-f85e-4bc2-a352-a41635c83653 | admin     | this-is-an-api-key-sample | 2013-04-10 15:08:47.104103 |       |        | thisisanencodedpasswordsample | admin    | username@email.com           | 
 25c8b15f-ec67-472b-b551-3c7112d4a2db | grails    | this-is-an-api-key-sample | 2013-04-10 15:12:44.257821 |       |        | thisisanencodedpasswordsample | grails   | username@email.com           | 

从我的grails app我有以下文件:

用户域类

class User {
    String user_id
    String name
    String apikey
    String created
    String about
    String openid
    String password
    String fullname
    String email
    String resetKey

    static mapping = {
        version false
        autoTimestamp false
        table "public.users"
        resetKey column: "reset_key"
        created column: "created", sqlType: "timestamp without time zone"
        user_id column: "id", sqlType: "text"
        id name:  'user_id'
    }
}

数据源

dataSource {
    pooled = true
    dbCreate = "validate"
    logSql = true
    url: "jdbc:postgresql://192.168.1.100:5432/ecodata"
    driverClassName = "org.postgresql.Driver"
    dialect = net.sf.hibernate.dialect.PostgreSQLDialect
    username = "ecodata"
    password = "******"
}

POM依赖

    <dependency>
        <groupId>org.grails.plugins</groupId>
        <artifactId>hibernate</artifactId>
        <version>2.1.2</version>
        <scope>runtime</scope>
        <type>zip</type>
    </dependency>

    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.1-901.jdbc4</version>
        <scope>runtime</scope>
    </dependency>

错误我在启动Grails应用时遇到的错误是:

  

[...]由以下原因引起:org.hibernate.HibernateException:缺少表:   用户 [...]

我希望有人可以帮忙解决这个问题。 提前谢谢。

此致

1 个答案:

答案 0 :(得分:3)

跟进:

我终于解决了问题!实际上这是我的错,虽然这是一个难以察觉的棘手错字......

在我的dataSource中,您可以看到以下行:

url: "jdbc:postgresql://192.168.1.100:5432/ecodata"

但实际应该是:

url = "jdbc:postgresql://192.168.1.100:5432/ecodata"

当我调整grails与数据库连接的深度时,我意识到了这个错字。我看到除数据源的url之外的所有内容都有正确的配置。 url字段具有默认的内存数据库值。那很奇怪......然后,再次仔细检查dataSource,我看到了冒号而不是等号。该死的!我喜欢动态语言,但这种拼写错误可能非常令人沮丧...

第一个问题解决了。

另一个问题: hibernate_sequence错误(也已解决)

一旦我解决了前一个问题,就会出现另一个错误:

Caused by: org.hibernate.HibernateException: Missing sequence or table: hibernate_sequence 

在阅读了一下后,我发现由于对遗留数据库执行的验证而发生此错误。我解决了删除验证的问题。这样做是注释以下行(也在dataSource中)

//    dbCreate = "validate"

我希望这篇文章可以帮助将来的某个人。这就是为什么我将解决方案发布到我最初的问题以及hibernate_sequence问题。