我正在尝试将我的grails应用程序从h2切换到PostgreSQL。 我为实现目标所做的步骤:
更改数据源。现在看起来像:
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"
}
}
}
}
现在比赛开始了。我在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.你知道为什么吗?
答案 0 :(得分:1)
Grails / Hibernate使用Sequence
作为Postgres(或Oracle等)等数据库的对象ID。默认情况下,Grails使用共享序列(hibernate_sequence
)。因此,所有对象都将具有uniq id,但每个数据库都是唯一的,而不是每个表。
您可以将域配置为对域使用不同的序列,例如:
static mapping = {
id generator: 'sequence', params: [sequence: 'my_own_sequence']
}
另见