Hibernate, MySQL и таблица с именем «Повторить» - странное поведение - PullRequest
1 голос
/ 10 июля 2010

У меня странная проблема. Но сначала orm.xml:

<entity class="de.test.businessobjects.Repeat">
    <table name="repeat"/>
    <attributes>
        <id name="id">
            <generated-value strategy="TABLE"/>
        </id>
        <many-to-one name="repeatType" fetch="LAZY">
            <join-column name="id_repeatType"/>
        </many-to-one>
        <many-to-one name="trainingSet" fetch="LAZY">
            <join-column name="id_trainingSet"/>
        </many-to-one>
    </attributes>
</entity>

Я использую Hibernate / JPA. Все работает нормально с HSQL и Derby, поэтому мои BO, DAO и модульные тесты должны быть в порядке. При тестировании с MySQL я получаю эту ошибку:

org.springframework.dao.InvalidDataAccessResourceUsageException: не может выполнить запрос; SQL [выбрать repeat0_.id как id8_, repeat0_.id_repeatType as id2_8_, repeat0_.id_trainingSet as id3_8_ from repeat repeat0 _];

Однако меняется

<table name="repeat"/>

до

<table name="repeatt"/>

решает проблему с MySQL.

Что не так? Является ли «repeat» зарезервированным ключевым словом или это ошибка в реализации JPA Hibernate?

Спасибо и ура Er

Ответы [ 2 ]

4 голосов
/ 10 июля 2010

Средство проверки зарезервированных слов SQL сообщает мне, что "repeat" является зарезервированным ключевым словом SQL в MySQL (и DB2), поэтому вам необходимо его избежать.

JPA 1.0 не определяет стандартный способ справиться с этим, поэтому вам придется использовать решение Hibernate, которое опирается на кавычки. Из Справочного руководства по Hibernate:

5,4. SQL-идентификаторы в кавычках

Вы можете заставить Hibernate цитировать идентификатор в сгенерированном SQL по заключая имя таблицы или столбца в кавычки в документе сопоставления. Hibernate будет использовать правильный стиль цитаты для диалекта SQL. Обычно это двойные кавычки, но SQL Server использует скобки и MySQL использует backticks.

<class name="LineItem" table="`Line Item`">
    <id name="id" column="`Item Id`"/><generator class="assigned"/></id>
    <property name="itemNumber" column="`Item #`"/>
    ...
</class>

I Предположим, это будет работать и в orm.xml.

JPA 2.0 пошел дальше и определил способ указания идентификаторов с разделителями:

2.13 Именование объектов базы данных

...

Чтобы указать идентификаторы с разделителями, необходимо использовать один из следующих подходов:

  • Можно указать, что все идентификаторы базы данных, используемые для модуля персистентности, будут обрабатываться как идентификаторы с разделителями, указав элемент <delimited-identifiers/> в элементе persistence-unit-defaults файла отображения объекта / реляционного xml. Если указан элемент <delimited-identifiers/>, он не может быть переопределен.
  • Для каждого имени можно указать, что имя объекта базы данных следует интерпретировать как идентификатор с разделителями следующим образом:
    • Используя аннотации, имя указывается в качестве идентификатора с разделителями, заключая в себе имя в двойных кавычках, в результате чего внутренние кавычки экранируются, например, @Table(name="\"customer\"").
    • При использовании XML имя указывается в качестве идентификатора с разделителями с использованием двойного цитаты, например, <table name="&quot;customer&quot;"/>

Если вы используете JPA 2.0, я бы рекомендовал использовать портативное решение.

1 голос
/ 10 июля 2010

Да, повтор - это зарезервированное слово в MySQL

http://dev.mysql.com/doc/refman/5.7/en/keywords.html

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