Запрос гибернации заканчивается ошибкой синтаксиса SQL - PullRequest
0 голосов
/ 02 сентября 2018

Я создал боб UserPreferences. Первичным ключом является id столбец. Вот определение боба:

@Entity
public class UserPreferences {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column(unique = true)
    @ColumnDefault("")
    private String id;

    private String email;

    // Getters and Setters
}

Теперь я использую Kotlin для вставки данных в этот компонент. Вот код для этого:

val newUserPreferences = UserPreferences().apply { email = newUserRequest.email }
mUserPreferenceService.save(newUserPreferences)

Предположим, что newUserRequest.email не null. Настройка auto-dll в моем application.yml равна update. Когда этот код выполняется, я вижу, что Hibernate генерирует следующий запрос для создания таблицы:

create table user_preferences (
   id varchar(255) default  not null
   email varchar(255),
   primary key (id)
) engine=MyISAM

В этот момент приложение не загружается со следующей ошибкой:

Причина: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MariaDB для правильного использования синтаксиса около 'не ноль,

Глядя на исключение, очень ясно, что код не работает, потому что вместо использования пустого String в качестве значения по умолчанию, hibernate просто помещает пробел в сгенерированный запрос. Итак, вот мои вопросы:

  1. Должно ли это рассматриваться как ошибка в Hibernate?
  2. Как справиться с такой ситуацией, когда я хотел бы иметь пустую строку "" в качестве значения по умолчанию для столбца?

1 Ответ

0 голосов
/ 02 сентября 2018

Я не пользователь Hibernate, но я нашел https://github.com/hibernate/hibernate-orm/blob/master/documentation/src/test/java/org/hibernate/userguide/schema/ColumnDefaultTest.java показывает:

@ColumnDefault("'N/A'")

Похоже, что когда вы определяете значение по умолчанию для типа строки SQL, вы должны использовать разделители строки SQL (одинарные кавычки) внутри строки Java. В вашем случае, так как вы хотите пустую строку, вы должны использовать:

@ColumnDefault("''")

Другой способ определить значение по умолчанию - установить атрибут в аннотации @Column, как показано в другом ответе переполнения стека: Как установить значение по умолчанию в Hibernate

Так что это может быть не ошибка, но использование Hibernate нелогично для некоторых пользователей и, возможно, не задокументировано явно.

P.S .: Я бы посчитал ошибкой, что Hibernate по-прежнему генерирует операторы CREATE TABLE с engine=MyISAM , если вы не укажете правильный hibernate.dialect . Этот механизм хранения не рекомендуется. MyISAM медленнее, чем InnoDB, в большинстве случаев и не поддерживает какие-либо свойства ACID. MySQL постепенно сворачивает MyISAM, и я не рекомендую использовать его для каких-либо текущих проектов.

...