Я разрабатываю 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, но я действительно хочу знать то, что продолжается здесь. Есть ли какое-либо ограничение, из которого я должен теперь, как "не называют Группу объекта"? Но если это так, почему ошибка, я становлюсь таким образом неясным?
Группа - это зарезервированное слово в вашей базе данных MySQL см. здесь
Изменить:
package model
//Imports...
@Entity
@Table(name = "group_table")
public class Group {
@Id @GeneratedValue
private Long id;
@NotNull
private String name;
//Getters and Setters
}
Вы можете использовать зарезервированные ключевые слова для имен объектов базы данных, если вы укажете провайдеру 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 ), никакой дырявой абстракции здесь нет.
В некоторых реализациях JPA вы можете использовать классы с такими именами, и реализация JPA делает разумную вещь и «цитирует» имя в любом SQL (поскольку это зарезервированное слово, как указал Пол Уилан), поэтому оно принимается. DataNucleus , безусловно, не допускает этой проблемы.