【问题标题】:hibernate generates wrong sql "select max(id) from my_table"hibernate 生成错误的 sql "select max(id) from my_table"
【发布时间】:2012-09-07 09:55:27
【问题描述】:

我用 Hibernate 做了一个小应用程序。仅来自 HB 网站提供的样本。

Hibernate 对 DB 说:

drop table if exists some_db.my_table 

create table some_db.my_table ......

select max(id) from my_table 

当我从 HSQL db 转到 MySQL 时。

我有错误 “调试 ohejdbc.spi.SqlExceptionHelper - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在第 1 行的 'my_table' 附近使用的正确语法 [n/a]”

因为HB固执地想说

select max(id) from my_table 

而不是

select max(id) from some_db.my_table 

这是正确的语法

public void testBasicUsage() {
    // create a couple of events...
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    session.save( new Event( ..... ) );   // <<-------------------HERE
    session.save(new Event( ..... ));
    session.getTransaction().commit();
    session.close();

改变方言也无济于事。

我试过切换到不同的hb版本,例如

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.1.6.Final</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.21</version>
</dependency>

但这也无济于事。

更改连接(标准“root”/“”访问),如

jdbc:mysql://localhost:3306/some_db 

而不是

jdbc:mysql://localhost:3306

也无济于事。

这似乎是一个错误,但有什么解决方案?

【问题讨论】:

  • 实体声明如下:@Entity @Table(name = "Event", schema = "some_db")
  • 实体声明如下:@Entity @Table(name = "my_table", schema = "some_db")

标签: mysql sql hibernate code-generation


【解决方案1】:

您确实需要为此发布带注释的实体/休眠 XML 映射。

最可能的原因是您没有在table annotation 中指定架构属性。

即类似于

@Table(schema="some_db")

【讨论】:

  • 是的,我做到了。正如我在我的帖子中所说 - 如果存在 some_db.my_table 创建表 some_db.my_table ......从 my_table 中选择 max(id) 并且只有最后一个总是没有架构/数据库名称。
【解决方案2】:

您可以使用架构参数:

<generator class="increment">
    <param name="schema">some_db</param>
</generator>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多