Странная проблема с hasMany в Grails с использованием PostgreSQL."ОШИБКА: столбецне существует" - PullRequest
2 голосов
/ 30 марта 2012

Я с трудом пытаюсь заставить "hasMany" работать в Grails 2.0.1 с использованием PostgreSQL 9.1.У меня есть две таблицы:

CREATE TABLE "_QUESTIONS"
(
  "QUESTION_ID" bigint NOT NULL,
  "TEXT" text,
  CONSTRAINT "PK" PRIMARY KEY ("QUESTION_ID" )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "_QUESTIONS"
  OWNER TO postgres;

CREATE TABLE "_ANSWERS"
(
  "ANSWER_ID" bigint NOT NULL,
  "TEXT" text,
  "QUESTION_ID" bigint,
  CONSTRAINT "PK1" PRIMARY KEY ("ANSWER_ID" ),
  CONSTRAINT "FK" FOREIGN KEY ("QUESTION_ID")
      REFERENCES "_QUESTIONS" ("QUESTION_ID") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "_ANSWERS"
  OWNER TO postgres;

и два класса домена:

class Question {
    String text

    String toString(){
        text
    }

    static constraints = {
    }    
    static hasMany = [answers: Answer]    
    static mapping = {
        table '`_QUESTIONS`'
        version false
        id generator: 'identity'
        id column: '`QUESTION_ID`'
        text column: '`TEXT`'
    }
}

class Answer {
    String text
    Question question

    String toString(){
        text
    }

    static constraints = {
    }

    static  belongsTo = [question : Question]

    static mapping = {
        table '`_ANSWERS`'
        version false
        id generator: 'identity'
        id column: '`ANSWER_ID`'
        text column: '`TEXT`'
        question column: '`QUESTION_ID`'
    }
}

Я сгенерировал представления и контроллеры для них обоих, и когда я пытаюсь просмотреть конкретный вопрос, я получаюследующая ошибка:

URI:/hasManyTest/question/show/1
Class:org.postgresql.util.PSQLException
Message:ERROR: column answers0_.question_id does not exist Position: 8

с трассировкой стека:

Line | Method
->>    8 | runWorker in \grails-app\views\question\show.gsp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Caused by SQLGrammarException: could not initialize a collection: [hasmanytest.Question.answers#1]
->>   26 | doCall    in C__Users_root_IdeaProjects_hasManyTest_grails_app_views_question_show_gsp$_run_closure2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     55 | run       in C__Users_root_IdeaProjects_hasManyTest_grails_app_views_question_show_gsp
|   1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    603 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run . . . in java.lang.Thread

Caused by PSQLException: ERROR: column answers0_.question_id does not exist
  Position: 8
->> 2103 | receiveErrorResponse in org.postgresql.core.v3.QueryExecutorImpl
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1836 | processResults in     ''
|    257 | execute . in     ''
|    512 | execute   in org.postgresql.jdbc2.AbstractJdbc2Statement
|    388 | executeWithFlags in     ''
|    273 | executeQuery in     ''
|     96 | executeQuery in org.apache.commons.dbcp.DelegatingPreparedStatement
|     26 | doCall    in C__Users_root_IdeaProjects_hasManyTest_grails_app_views_question_show_gsp$_run_closure2
|     55 | run . . . in C__Users_root_IdeaProjects_hasManyTest_grails_app_views_question_show_gsp
|   1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    603 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run       in java.lang.Thread

В последние пару дней я много занимался гимнастикой, и, кажется, ничто не помогает, когда я удаляю связьвсе работает нормально, хотя.Я что-то упускаю из виду?

Ответы [ 2 ]

1 голос
/ 15 августа 2012

Кажется, что проблема заключается в несоответствии между предположениями, сделанными отображением Grails / GORM, и SQL, используемым для создания таблиц.

Если вы опустите кавычки вокруг имен таблиц и столбцов в приведенном выше SQL, таблицы и столбцы будут без учета регистра. От http://wiki.postgresql.org/wiki/Things_to_find_out_about_when_moving_from_MySQL_to_PostgreSQL:

Имена баз данных, таблиц, полей и столбцов в PostgreSQL не зависят от регистра, если только вы не создали их с двойными кавычками вокруг их имени, в этом случае они чувствительны к регистру. В MySQL имена таблиц могут быть чувствительными к регистру или нет, в зависимости от используемой операционной системы.

Извлечение Грааля из уравнения, если вы создаете таблицу, используя следующее:

CREATE TABLE "_QUESTIONS"
(
  "QUESTION_ID" bigint NOT NULL,
  "TEXT" text,
  CONSTRAINT "PK" PRIMARY KEY ("QUESTION_ID" )
)
WITH (
  OIDS=FALSE
);

Тогда:

test=> select * from _questions;
ERROR:  relation "_questions" does not exist
LINE 1: select * from _questions
                      ^
test=> select * from _QUESTIONS;
ERROR:  relation "_questions" does not exist
LINE 1: select * from _QUESTIONS;
                      ^
test=> select * from "_QUESTIONS";
 QUESTION_ID | TEXT 
-------------+------
(0 rows)

Однако, если вы создаете таблицу без кавычек вокруг имен таблиц и столбцов:

CREATE TABLE _QUESTIONS
(
  QUESTION_ID bigint NOT NULL,
  TEXT text,
  CONSTRAINT PK PRIMARY KEY (QUESTION_ID)
)
WITH (
  OIDS=FALSE
);

Тогда:

test=> select * from _questions;
 question_id | text 
-------------+------
(0 rows)

test=> select * from _QUESTIONS;
 question_id | text 
-------------+------
(0 rows)

test=> select * from "_QUESTIONS";
ERROR:  relation "_QUESTIONS" does not exist
LINE 1: select * from "_QUESTIONS";
                  ^
0 голосов
/ 02 апреля 2012

Мне удалось выяснить это. Оказалось, почему-то ORM пытается получить доступ к столбцу ассоциации через его имя в нижнем регистре, изменение имени решило проблему.

...