Hibernate, ошибка javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: не удалось выполнить оператор [duplicate]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
42
задан Channa 8 March 2014 в 15:58
поделиться

2 ответа

user является зарезервированным словом, и обычно не рекомендуется использовать зарезервированные слова для идентификаторов (таблицы, столбцы).

Если вы настаиваете на том, что вы должны поместить имя таблицы в двойное цитаты:

create table "user" (...);

Но тогда вам всегда нужно использовать двойные кавычки, ссылаясь на таблицу. Кроме того, имя таблицы затем учитывает регистр. "user" - другое имя таблицы, чем "User".

Если вы хотите сэкономить много проблем, используйте другое имя. users, user_account, ...

Более подробную информацию о цитируемых идентификаторах можно найти в руководстве: http://www.postgresql.org/docs/current/static/sql -syntax-lexical.html # SQL-синтаксических ИДЕНТИФИКАТОРЫ

76
ответ дан krock 20 August 2018 в 08:11
поделиться
  • 1
    К сожалению, это не ответ в проекте на базе Hibernate, так как упоминается упомянутая тема. =). Фактическая проблема здесь заключается в том, что Hibernate не выполняет такой способ экранирования автоматически. Несмотря на то, что ему сказали правильный диалект! Итак, надлежащий ответ должен сказать, как сделать работу в Hibernate, а не в PSQL :( – Maksim Gumerov 20 March 2018 в 11:30
  • 2
    @MaksimGumerov: правильный ответ: не используйте имена, которым требуются котируемые идентификаторы - независимо от уровня обфускации, который вы используете. – a_horse_with_no_name 20 March 2018 в 11:48
  • 3
    Нет, это не одно :) В итоге вы привяжете свой код к конкретной базе данных и ее ключевым словам (и этот набор может быть изменен). Одно фактическое решение заключается в том, чтобы ускользнуть в глобальном масштабе (не пробовал это сам, хотя), другой полагается на анализаторы диалектов Hibernate (но, как мы видим, они не всегда выполняют свою работу по определению того, нужно ли нам что-то избегать). – Maksim Gumerov 20 March 2018 в 11:55

Можно указать имя таблицы с JPA со следующим синтаксисом:

@Table(name="\"user\"")
6
ответ дан mnv 20 August 2018 в 08:11
поделиться
Другие вопросы по тегам:

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