Действительно ли это является незаконным для именования объекта JPA “Группой”?

Я разрабатываю JEE6-приложение, с помощью JPA 2.0 и В спящем режиме С 3.5.2 финалом как Поставщик (и MySQL 5.1.41). Моим Сервером приложений является Glassfish V3.0.1. У меня уже есть рабочее Приложение типа CRUD с некоторыми объектами и отношениями.

Теперь я добавил (действительно простой) объект с именем "Группа". Класс объекта похож на это:

package model
//Imports...
@Entity
public class Group {
  @Id @GeneratedValue
  private Long id;

  @NotNull
  private String name;

  //Getters and Setters
}

Конечно, я также добавил его к persistence.xml, как <class>model.Group</class>. Мой persistence.xml отбрасывает и воссоздает все таблицы на, развертываются.

Таким образом, когда я развертываю свое приложение, таблицы для всех моих объектов сгенерированы, за исключением группы таблицы. В быть в спящем режиме журналах я обнаружил следующую ошибку (который не предотвращает приложение, которое будет развернуто),

[#|2010-06-30T11:54:29.862+0200|INFO|glassfish3.0.1|org.hibernate.cfg.AnnotationBinder|_ThreadID=11;_ThreadName=Thread-1;|Binding entity from annotated class: model.Group|#]
[#|2010-06-30T11:54:29.862+0200|INFO|glassfish3.0.1|org.hibernate.cfg.annotations.EntityBinder|_ThreadID=11;_ThreadName=Thread-1;|Bind entity model.Group on table Group|#]
[#|2010-06-30T11:54:33.773+0200|SEVERE|glassfish3.0.1|org.hibernate.tool.hbm2ddl.SchemaExport|_ThreadID=11;_ThreadName=Thread-1;|Unsuccessful: create table Group (id bigint not null auto_increment, name varchar(255) not null, primary key (id))|#]
[#|2010-06-30T11:54:33.773+0200|SEVERE|glassfish3.0.1|org.hibernate.tool.hbm2ddl.SchemaExport|_ThreadID=11;_ThreadName=Thread-1;|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 'Group (id bigint not null auto_increment, name varchar(255) not null, primary ke' at line 1|#]
[#|2010-06-30T11:54:54.883+0200|INFO|glassfish3.0.1|org.hibernate.cfg.AnnotationBinder|_ThreadID=25;_ThreadName=Thread-1;|Binding entity from annotated class: model.Group|#]
[#|2010-06-30T11:54:54.884+0200|INFO|glassfish3.0.1|org.hibernate.cfg.annotations.EntityBinder|_ThreadID=25;_ThreadName=Thread-1;|Bind entity model.Group on table Group|#]
[#|2010-06-30T11:54:58.402+0200|SEVERE|glassfish3.0.1|org.hibernate.tool.hbm2ddl.SchemaExport|_ThreadID=25;_ThreadName=Thread-1;|Unsuccessful: create table Group (id bigint not null auto_increment, name varchar(255) not null, primary key (id))|#]
[#|2010-06-30T11:54:58.403+0200|SEVERE|glassfish3.0.1|org.hibernate.tool.hbm2ddl.SchemaExport|_ThreadID=25;_ThreadName=Thread-1;|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 'Group (id bigint not null auto_increment, name varchar(255) not null, primary ke' at line 1|#]

Теперь, когда я переименовываю объект к чему-то как "MyGroup" (свойства остаются такими же), измените persistence.xml соответственно и повторно разверните мое приложение, таблица "MyGroup" успешно создается! Я нашел следующие строки в журналах, показывающих, что MyGroup правильно создается:

[#|2010-06-30T11:58:51.456+0200|INFO|glassfish3.0.1|org.hibernate.cfg.AnnotationBinder|_ThreadID=11;_ThreadName=Thread-1;|Binding entity from annotated class: model.MyGroup|#]
[#|2010-06-30T11:58:51.456+0200|INFO|glassfish3.0.1|org.hibernate.cfg.annotations.EntityBinder|_ThreadID=11;_ThreadName=Thread-1;|Bind entity model.MyGroup on table MyGroup|#]
[#|2010-06-30T11:59:21.569+0200|INFO|glassfish3.0.1|org.hibernate.cfg.AnnotationBinder|_ThreadID=25;_ThreadName=Thread-1;|Binding entity from annotated class: model.MyGroup|#]
[#|2010-06-30T11:59:21.569+0200|INFO|glassfish3.0.1|org.hibernate.cfg.annotations.EntityBinder|_ThreadID=25;_ThreadName=Thread-1;|Bind entity model.MyGroup on table MyGroup|#]

Кто-либо понял, какова проблема? Хорошо, я мог просто переименовать Группу к MyGroup, но я действительно хочу знать то, что продолжается здесь. Есть ли какое-либо ограничение, из которого я должен теперь, как "не называют Группу объекта"? Но если это так, почему ошибка, я становлюсь таким образом неясным?

7
задан Pascal Thivent 12 September 2010 в 07:31
поделиться

3 ответа

Группа - это зарезервированное слово в вашей базе данных MySQL см. здесь

Изменить:

package model
//Imports...
@Entity
@Table(name = "group_table")
public class Group {
  @Id @GeneratedValue
  private Long id;

  @NotNull
  private String name;

  //Getters and Setters
}
4
ответ дан 6 December 2019 в 09:18
поделиться

Вы можете использовать зарезервированные ключевые слова для имен объектов базы данных, если вы укажете провайдеру JPA их экранировать. Это стандартизировано в JPA 2.0, как описано в следующем разделе спецификации:

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

(...)

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

  • Можно указать, что все идентификаторы базы данных, используемые для единица сохранения состояния должна рассматриваться как идентификаторы с разделителями, указав элемент в пределах значений по умолчанию для единиц сохранения элемент объектного / реляционного xml файл сопоставления. Если элемент указано, его нельзя переопределить.

  • Можно указать для каждого имени, что имя для объект базы данных должен быть интерпретирован в качестве идентификатора с разделителями следующим образом:

    • Используя аннотации, имя указывается в качестве идентификатора с разделителями заключая имя в двойное кавычки, при этом внутренние кавычки сбежал, например, @Table (name = "\" customer \ "") .
    • Когда используя XML, имя указывается как идентификатор с разделителями с использованием двойного кавычки, например, <таблица name = "" customer "" />

Таким образом, JPA 2.0 может указать таблицу следующим образом:

@Entity
@Table(name="\"Group\"")
public class Group {
  @Id @GeneratedValue
  private Long id;

  @NotNull
  private String name;

  //Getters and Setters
}

Это определенно поддерживается Hibernate (см. HHH-4553 ), никакой дырявой абстракции здесь нет.

14
ответ дан 6 December 2019 в 09:18
поделиться

В некоторых реализациях JPA вы можете использовать классы с такими именами, и реализация JPA делает разумную вещь и «цитирует» имя в любом SQL (поскольку это зарезервированное слово, как указал Пол Уилан), поэтому оно принимается. DataNucleus , безусловно, не допускает этой проблемы.

2
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: