2012-08-06 56 views
1

我有一个与主键和外键具有相同属性的遗留数据库。我试图从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: Foreign key as primary key?但它并没有为我工作:当我使用的复合键,Grails的问我对于accommodation_id,但我没有此属性在我的表中,因为它是id

+0

等等。你想使用accomodation id作为AccomodationPrice的id,还是你想要一个带有id/accomodation id的组合键? – 2012-08-06 19:32:19

+0

我想使用住宿ID作为AccommodationPrice的ID。 – ZoT 2012-08-07 06:41:51

回答

0

如果你想要的东西很简单,就是一个属性映射为一个id,你可以不喜欢它():

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很简单,并且工作正常。

这种策略被称为主要关联关系,您可以在here的gorm上找到关于它的良好讨论。

我希望它有帮助!

+0

感谢您的提示,但这不是我想要做的。我想使用我的主键在AccommodationPrice中的外键住宿ID。我尝试使用不同的选项(使用_name:_,不使用_name:_,使用_column:_,不使用_column:_)尝试使用不同的选项(但没有使用它们)。 – ZoT 2012-08-07 07:32:02

+0

好的。我发现了一些可行的方法。编辑我的答案。一探究竟。 – 2012-08-07 18:13:21