Как сопоставить внешний ключ как первичный ключ в Grails?

У меня есть устаревшая база данных с тем же свойством для первичного ключа и внешнего ключа. Я пытаюсь сопоставить его с Grails, но у меня с этим проблемы. Это мой класс домена:

class AccommodationPrice {
    Integer id
    Accommodation accommodation

    static mapping = {
         table 'alojamiento_precios'
         id generator: 'assigned', name: accommodation, type: 'integer'
         accommodation column: 'id'
    }
}

Это таблица базы данных:

CREATE TABLE alojamiento_precios
(
  id integer NOT NULL,
  CONSTRAINT alojamientoprecios_pkey PRIMARY KEY (id),
  CONSTRAINT "FK alojamiento" FOREIGN KEY (id)
      REFERENCES alojamiento (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

Я прочитал этот вопрос Grails: внешний ключ в качестве первичного ключа?, но это не так. У меня это не работает: когда я использую составной ключ, Grails запрашивает у меня accommodation_id, но у меня нет этого свойства в моей таблице, потому что это id.


person zot24    schedule 06.08.2012    source источник
comment
Ждать. Вы хотите использовать идентификатор размещения в качестве идентификатора AccomodationPrice или вам нужен составной ключ с идентификатором/идентификатором размещения?   -  person Tiago Farias    schedule 06.08.2012
comment
Я хочу использовать идентификатор размещения в качестве идентификатора AccommodationPrice.   -  person zot24    schedule 07.08.2012


Ответы (1)


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

    class AccommodationPrice {

        String price

        long accomodationId

        static mapping = {
             table 'alojamiento_precios'
             id generator: 'assigned', name:'accomodationId'
         version false
        }

        static transients = ['accomodation']

        Accomodation getAccomodation() {
        Accomodation.get(accomodationId)
        }

        void setAccomodation(Accomodation a) {
             accomodationId = a?.id
        }
    }

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

Эта стратегия известна как ассоциация первичного ключа, и вы можете найти хорошее обсуждение на gorm в здесь.

Я надеюсь, что это помогает!

person Tiago Farias    schedule 06.08.2012
comment
Спасибо за подсказку, но это не совсем то, чем я хочу заниматься. Я хочу использовать идентификатор размещения внешнего ключа, такой как мой первичный ключ в AccommodationPrice. Я пытался сделать то, что вы упомянули, используя разные параметры (с name:, без name:, с column:, без column: ), но ни один из них не работал. - person zot24; 07.08.2012
comment
В порядке. Я нашел то, что работает. Отредактировал мой ответ. Проверьте это. - person Tiago Farias; 07.08.2012