11

次の JPA エンティティ クラスがあります (例)。ハウスは 1 つのストリートに属します。通りには多くの家があります。

@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 に設定しています。これは、新しい ID を自動的に割り当てることになっています。

新しい Street を持つ新しい House を作成するときは、最初に 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

4

4 に答える 4

14

SQL ステートメントにエラーがない場合は、Mysql が使用する定義済みの名前が含まれている可能性があるため、テーブルの列名を確認することをお勧めします。たとえば、テーブルの列名として使用できない「列」

于 2012-09-07T02:04:52.257 に答える
13

標準 SQL は、次のオプションの構文を指定しますINSERT

INSERT INTO <Table Name> DEFAULT VALUES

これは正当な SQL 構文であり、Microsoft SQL ServerPostgreSQL、およびSQLiteなどでサポートされていますが、Oracle、IBM DB2、または MySQL ではサポートされていません。

MySQL は、同じ結果を達成する他の構文をサポートしています。

INSERT INTO <Table Name> () VALUES ()

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

Hibernate では、SQL ダイアレクトを適切に構成する必要があります。ターゲット RDBMS ブランドに対して有効な SQL を生成するのは Hibernate 次第です。

import org.hibernate.cfg.Configuration;

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

という名前のファイルhibernate.propertiesをクラスパスのルート ディレクトリに配置して、プロパティを指定することもできます。

于 2009-01-14T22:47:01.887 に答える
9

この例外が発生する可能性がある別の状況は、テーブルの列として予約語がある場合です。たとえば、'to' と 'from' は MySQL に適した clumn 名ではありません。そのような列をチェックせず、さらにテーブルが作成されていなくてもエラーなしで動作し続けるのは、明らかに Hibernate のバグです。

于 2012-11-10T10:11:07.283 に答える
0

spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect が正しいバージョンの MySQL であることを確認してください

于 2020-04-09T19:08:44.080 に答える