【问题标题】:Using Postgresql with Grails : Missing sequence or table: hibernate_sequence将 Postgresql 与 Grails 一起使用:缺少序列或表:hibernate_sequence
【发布时间】:2012-02-07 11:34:11
【问题描述】:

我在使用 Grails 2.0 和 Postgresql 9.1 时遇到问题

我正在尝试使用顺序 ID 映射现有数据库。 但是,即使没有在域中创建任何类,我也会遇到错误:

Compiling 1 source files.....
| Running Grails application
| Error  executing bootstraps:
      Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; 
      nested exception is org.springframework.beans.factory.BeanCreationException:
      Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory';
      (...)
      Invocation of init method failed; nested exception is org.hibernate.HibernateException:
           Missing sequence or table: hibernate_sequence

我的数据源是:

dataSource {
    pooled = true
    driverClassName = "org.postgresql.Driver"
    username = "postgres"
    password = "postgrespass"
    dialect = org.hibernate.dialect.PostgreSQLDialect
    logSql = true
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = true
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "" 
            url = "jdbc:postgresql://localhost:5432/Rambo"
        }
    }
}

Tee 现有数据库是一个扑克软件数据库(Holdem manager)。我正在研究一个不使用序列的 PlayerHand 对象,但 Player 对象有一个序列表。

奇怪的是,在之前的程序中,我可以很容易地使 Player 对象与 Postgresql 8.3 和 Grails 2.0 一起工作。

【问题讨论】:

    标签: hibernate postgresql grails grails-orm


    【解决方案1】:

    您可以将 Postgres 配置为每个表使用一个序列 - 我在这里描述过:http://grails.1312388.n4.nabble.com/One-hibernate-sequence-is-used-for-all-Postgres-tables-td1351722.html

    但您仍需要创建序列。 dbCreate='update' 不会创建序列(只有 createcreate-drop 会创建),因此您需要手动创建它们或使用像 http://www.grails.org/plugin/database-migration 这样的迁移工具

    【讨论】:

    • 问题是我的 grails 应用程序可以针对我无法触及的数据库工作。所以我不能迁移它。
    • 数据库中的主键类型是什么?您只需调整mapping 块以使用数据库中的任何内容。如果您可以使用现有的序列,请添加 id generator: 'sequence', params: [sequence: 'seq_foo'] 替换正确的名称。
    • 我使用的是自定义方言解决方案,我发现它最有效地避免了我必须在所有域中输入id generator。这也使我能够保持最大的可移植性,因为现在序列控制是在方言中定义的,而不是在实际模型中定义(并非所有数据库引擎都支持序列)。谢谢伯特!
    • 我在 Grails 3 中也使用它来启用 PostgreSQL 功能。
    【解决方案2】:

    您可能有一个实体使用序列 ID 生成器而没有配置任何序列名称,因此 Hibernate 使用默认序列名称:hibernate_sequence,但没有找到它。

    配置序列名称(并使用现有序列),或在数据库中创建 hibernate_sequence 序列,或不使用基于序列的生成器。

    【讨论】:

    • Grails 1.x 和 Grails 2.0 之间的配置似乎在这个问题上发生了变化。我已经能够使用 GRAG 对其进行配置。
    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多