簡體   English   中英

Hibernate 使用 MySQL 生成無效的 SQL 查詢

[英]Hibernate generates invalid SQL query with MySQL

我有以下 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。

用新的 Street 創建新的 House 時,我必須先創建並堅持 Street,然后才是 House。 這是因為我沒有將 CascadeType 設置為 PERSIST,所以必須手動完成 [1]。 但是,在插入新創建的 Street 時:

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 操作頁 318-319

如果您的 SQL 語句中沒有錯誤,那么您可能需要檢查您的表列名,因為它可以包含 Mysql 使用的預定義名稱; 例如不能用作表列名的“列”

標准 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 中,您應該正確配置SQL 方言,並且由 Hibernate 為目標 RDBMS 品牌生成有效的 SQL。

import org.hibernate.cfg.Configuration;

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

您還可以通過在類路徑的根目錄中放置一個名為hibernate.properties的文件來指定屬性。

另一種可能出現此異常的情況是將保留字用作表的列。 例如,'to' 和 'from' 不是 MySQL 的合適名稱。 這顯然是 Hibernate 中的錯誤,它不檢查這些列,而且即使沒有創建表,它也會繼續工作而不會出錯。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM