【问题标题】:Hibernate generates invalid SQL query with MySQLHibernate 使用 MySQL 生成无效的 SQL 查询
【发布时间】:2009-01-14 22:23:10
【问题描述】:

我有以下 JPA 实体类(示例)。一所房子属于一条街道。一条街有许多房子。

@Entity
public class House {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Integer id;

    public String name    

    @ManyToOne
    public Street street;
}

@Entity
public class Street {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Integer id;

    @OneToMany(mappedBy="street")
    public Set<House> houses;
}

我将生成类型设置为标识,它应该自动分配一个新的 ID。

当用新街道创建新房子时,我必须首先创建并保持街道,然后是房子。这是因为我没有将 CascadeType 设置为 PERSIST,因此必须手动完成 [1]。但是,在插入新创建的街道时:

Street street = new Street();
entityManager.persist(street);

Hibernate/JPA 生成以下 SQL 查询:

insert into Street default values

哪个 MySQL 不喜欢。

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'default values' at line 1 

任何想法为什么?我正在使用 Java 6、MySQL 5.0.67 和 Hibernate 的 JPA 实现(版本 3.2.1.ga)。

[1] EJB 3 in Action 页面 318-319

【问题讨论】:

    标签: java hibernate orm jpa


    【解决方案1】:

    如果您的 SQL 语句中没有错误,那么您可能需要检查表列名称,因为它可以包含 Mysql 使用的预定义名称;例如 'column' 不能用作表列名

    【讨论】:

    • 我使用 'key' 和 'value' 作为列名。哎呀。
    【解决方案2】:

    标准 SQL 为 INSERT 指定此可选语法:

    INSERT INTO <Table Name> DEFAULT VALUES
    

    这是合法的 SQL 语法,例如,Microsoft SQL ServerPostgreSQLSQLite 支持,但 Oracle、IBM DB2 或 MySQL 不支持。

    MySQL 支持达到相同结果的其他语法:

    INSERT INTO <Table Name> () VALUES ()
    
    INSERT INTO <Table Name> (col1, col2, col3) VALUES (DEFAULT, DEFAULT, DEFAULT)
    

    在 Hibernate 中,您应该正确地configure SQL 方言,由 Hibernate 为目标 RDBMS 品牌生成有效的 SQL。

    import org.hibernate.cfg.Configuration;
    
    Configuration cfg = new Configuration();
    cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");
    

    您还可以通过将名为 hibernate.properties 的文件放在类路径的根目录中来指定属性。

    【讨论】:

      【解决方案3】:

      您可能遇到此异常的另一种情况是您将保留字作为表的列。例如 'to' 和 'from' 不适合 MySQL 的 clumn 名称。这显然是 Hibernate 中的错误,它不会检查这些列,而且即使没有创建表,它也会继续正常工作。

      【讨论】:

      • 这真是一个很大的暗示。
      【解决方案4】:

      确保 spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect 的 MySQL 版本正确

      【讨论】:

        猜你喜欢
        • 2017-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 1970-01-01
        相关资源
        最近更新 更多