ОШИБКА: синтаксическая ошибка у или около пользователя - PullRequest
14 голосов
/ 27 января 2012

Я использую Hibernate и у меня есть постоянный класс под названием «Пользователь».Поскольку это ключевое слово, я пометил атрибут @Entity другим именем (я видел, например, этот вопрос: Невозможно использовать таблицу с именем "user" в postgresql hibernate )

Однако я все еще сталкиваюсь с проблемами, потому что этот класс расширяет другой, и похоже, что hibernate все еще пытается использовать «пользователя» в качестве имени столбца и запутывается:

@Entity( name = "XonamiUser" )
public class User extends PropertyContainer {
    ...

и

@MappedSuperclass
public abstract class PropertyContainer implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected long key;
    /** tags */
    @ElementCollection
    protected Set<String> tags;

    @ElementCollection
    protected Set<String> searchList;
    ...

Другие мои классы, расширяющие PropertyContainer, работают нормально.

Это ошибка в спящем режиме?Есть ли способ обойти рефакторинг?Спасибо!

Вот ошибки, которые я вижу (слегка исправленные):

WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42601
ERROR org.hibernate.util.JDBCExceptionReporter - Batch entry 0 insert into user_search_list (user, search_list) values ('1', 'bjorn') was aborted.  Call getNextException to see the cause.
WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42601
ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: syntax error at or near "user"
  Position: 31

Ответы [ 4 ]

42 голосов
/ 27 января 2012

user является зарезервированным ключевым словом в PostgreSQL.Это допускается только как заключенный в кавычки идентификатор .

Вы должны заставить Hibernate использовать в этой команде INSERT значение "user".

Я не эксперт по Hibernate, но возможноэто Спящий режим сохранения модели пользователя в Postgres поможет?

3 голосов
/ 27 января 2012

Я немного запутался, если вы ссылаетесь на столбец или таблицу с именем User ... Вы можете использовать аннотацию @ Table , чтобы задать имя таблицы для сущности в JPA:

@Entity
@Table(name = "XonamiUser")
public class User extends PropertyContainer {
2 голосов
/ 29 января 2012

В конце я реорганизовал пользователя класса в XonamiUser. Это было не совсем то, что я хотел, но он работал отлично.

1 голос
/ 27 января 2012

Справочное руководство Hibernate содержит пример, показывающий, как определить имя таблицы, используемой для хранения элементов коллекции.И случается, что для этого используется сущность «Пользователь», и для столбца определяется как user_id, а не как пользователь.

Для вашего случая это сопоставление должно быть в порядке:

@ElementCollection
@CollectionTable(name = "user_search_list", 
                 joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "search_list")
protected Set<String> searchList;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...