当前位置:  开发笔记 > 编程语言 > 正文

Hibernate使用MySQL生成无效的SQL查询

如何解决《Hibernate使用MySQL生成无效的SQL查询》经验,为你挑选了3个好方法。

我有以下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 houses;
}

我将生成类型设置为identity,应该自动分配新ID.

在创建一个拥有新街道的新房子时,我必须首先创建并坚持Street,然后是House.这是因为我没有将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页



1> 小智..:

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



2> Bill Karwin..:

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

INSERT INTO  DEFAULT VALUES

这是合法的SQL语法,例如,Microsoft SQL Server,PostgreSQL和SQLite支持,但不支持Oracle,IBM DB2或MySQL.

MySQL支持其他语法,可以实现相同的结果:

INSERT INTO 
() VALUES () INSERT INTO
(col1, col2, col3) VALUES (DEFAULT, DEFAULT, DEFAULT)

在Hibernate中,您应该正确配置 SQL方言,并且由Hibernate来为目标RDBMS品牌生成有效的SQL.

import org.hibernate.cfg.Configuration;

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

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



3> Stepan Yakov..:

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

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有