Grails应用程序连接到PostgreSQL的奇怪行为

时间:2014-02-07 23:52:08

标签: postgresql grails gorm

我正在尝试将我的grails应用程序从h2切换到PostgreSQL。 我为实现目标所做的步骤:

  1. http://jdbc.postgresql.org/download.html下载JDBC(JDBC4 Postgresql驱动程序,版本9.3-1100)
  2. 将JDBC附加到/ lib文件夹
  3. 更改数据源。现在看起来像:

    dataSource {
        pooled = true
        driverClassName = "org.postgresql.Driver"
        dialect="org.hibernate.dialect.PostgreSQLDialect"
        username = "postgres"
        password = "admin"
    }
    hibernate {
        cache.use_second_level_cache = true
        cache.use_query_cache = false
        cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
    }
    // environment specific settings
    environments {
        development {
            dataSource {
                dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
                //url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
                url = "jdbc:postgresql://localhost:5432/admin_panel"
            }
        }
        test {
            dataSource {
                dbCreate = "update"
                url = "jdbc:postgresql://localhost:5432/admin_panel"
            }
        }
        production {
            dataSource {
                dbCreate = "update"
                url = "jdbc:postgresql://localhost:5432/admin_panel"
                pooled = true
                properties {
                   maxActive = -1
                   minEvictableIdleTimeMillis=1800000
                   timeBetweenEvictionRunsMillis=1800000
                   numTestsPerEvictionRun=3
                   testOnBorrow=true
                   testWhileIdle=true
                   testOnReturn=true
                   validationQuery="SELECT 1"
                }
            }
        }
    }
    
  4. 现在比赛开始了。我在GGTS中输入'run-app',我收到一个错误。由于验证,我尝试使用BootStrap创建的对象无法初始化:Error initializing the application: Validation Error(s) occurred during save()。 这很奇怪,因为该消息表明对先前创建的对象的引用为null:Field error in object 'adminpanel.component.Text' on field 'subpage': rejected value [null];。 这行中“subpage”不可能为null,所以我去pgAdmin III检查是否创建了这条记录,并且我注意到根本没有创建表。

    如果应用程序连接到H2,则Everetyhing工作正常,但是当我将其切换到postgres时开始变得怪异。此外,当我从BootStrap中删除所有内容时,应用程序启动并且我可以正常创建对象,但我仍然无法将它们看到pgAdmin。当我使用PostgreSQL时,您有什么建议我可以检查或为什么GORM不在我的应用程序中创建表格?

    提前致谢。


    编辑:

    我经过几次测试后发现了问题的根源...... PostgreSQL为每个表中的“id”列提供了一个奇怪的值。当我使用H2时,我在每个表中都有1..x的值,在PostgreSQL中我有这样的东西:

    table1
    id:
    1
    2
    3
    -
    7
    8
    9
    
    table2
    id:
    4
    5
    6
    -
    10
    11
    

    正如您可能已经注意到的那样,对于不同表中的所有行,值可以互换使用,因此我不能使用例如对象table1的id为1,对象table2的id为1.你知道为什么吗?

1 个答案:

答案 0 :(得分:1)

Grails / Hibernate使用Sequence作为Postgres(或Oracle等)等数据库的对象ID。默认情况下,Grails使用共享序列(hibernate_sequence)。因此,所有对象都将具有uniq id,但每个数据库都是唯一的,而不是每个表。

您可以将域配置为对域使用不同的序列,例如:

static mapping = {
    id generator: 'sequence', params: [sequence: 'my_own_sequence']
}

另见