Hibernate генерирует неверный SQL-запрос с MySQL - PullRequest
11 голосов
/ 15 января 2009

У меня есть следующие классы сущностей 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;
}

У меня установлен тип генерации для идентификатора, который должен автоматически назначать новый идентификатор.

При создании нового Дома с новой улицей я должен сначала создать и сохранить улицу, а затем Дом. Это потому, что у меня нет 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 с реализацией JPA в Hibernate (версия 3.2.1.ga).

[1] EJB 3 в страницах действий 318-319

Ответы [ 3 ]

13 голосов
/ 07 сентября 2012

Если в вашем операторе SQL нет ошибки, вы можете проверить имя столбца таблицы, поскольку оно может содержать предопределенное имя, которое использует Mysql; например, «столбец», который нельзя использовать в качестве имени столбца таблицы

13 голосов
/ 15 января 2009

Стандартный SQL указывает этот необязательный синтаксис для INSERT:

INSERT INTO <Table Name> DEFAULT VALUES

Это допустимый синтаксис SQL, поддерживаемый, например, Microsoft SQL Server , PostgreSQL и SQLite , но не Oracle, IBM DB2, или MySQL.

MySQL поддерживает другой синтаксис, который достигает того же результата:

INSERT INTO <Table Name> () VALUES ()

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

В Hibernate необходимо правильно настроить диалект SQL, и только Hibernate может генерировать действительный SQL для целевой марки СУБД.

import org.hibernate.cfg.Configuration;

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

Вы также можете указать свойства, поместив файл с именем hibernate.properties в корневой каталог classpath.

8 голосов
/ 10 ноября 2012

Другая ситуация, когда вы можете иметь это исключение, это когда вы зарезервировали слова в качестве столбцов для таблицы. Например, «to» и «from» не подходят для имен столбцов для MySQL. Очевидно, это ошибка в Hibernate, которая не проверяет такие столбцы и, более того, продолжает работать без ошибок, даже если таблица не создана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...