2015-09-22 35 views
0

我们如何为以下场景创建域类。如何将关联列之一用作Grails中表的主键?

CREATE TABLE station 
(
    store_id integer NOT NULL, 
    pos_id integer NOT NULL, 
    CONSTRAINT pos_locations_pk PRIMARY KEY (store_id, pos_id) 
) 

CREATE TABLE header 
(
    id serial NOT NULL, 
    store_id integer NOT NULL, 
    pos_id integer NOT NULL, 
    .... 
    CONSTRAINT sales_transactions_pk PRIMARY KEY (id, store_id), 
    CONSTRAINT sales_transactions_pos_fk FOREIGN KEY (store_id, pos_id) 
     REFERENCES station (store_id, pos_id) 
) 

CREATE TABLE line_item 
(
    id serial NOT NULL, 
    sale_id bigint NOT NULL, 
    store_id integer NOT NULL, 
    ..... 
    CONSTRAINT transaction_lines_pk PRIMARY KEY (id, store_id), 
    CONSTRAINT transaction_lines_sale_fk FOREIGN KEY (sale_id, store_id) 
     REFERENCES header (id, store_id) 
) 

我开始为下面的站域

class Station { 
    int storeId 
    int posId 

    static mapping = { 
     table "station" 
     id composite: ['storeId', 'posId'] 
     storeId column: 'store_id' 
     posId column: 'pos_id' 
    } 
    } 

和头表

class Header { 
int id 
Station station 

static mapping = { 
    cache false 
    version false 
    table "header" 

    columns { 
     station { 
      column name: 'store_id' 
      column name: 'pos_id' 
     } 
    } 
    id composite: ['id', 'station.storeId'] // Where I have to use store_id alone from association column to be included as a part of composite key to header table 
} 
} 

和LINE_ITEM表

class LineItem { 
int id 
Header header 

static mapping = { 
    table "line_item" 
    columns { 
     header { 
      column name: 'sale_id' 
      column name: 'store_id' 
     } 
    } 
    id composite: ['id', 'header.station.storeId'] // something like this where I have to include store_id along from header table which instead from station table should be included as a part of composite key 
} 
} 

回答

1

的问题是有之间的不匹配表关系臀部由数据库模式和域类中的关联决定。

例如,有一个多到一个协会从,但在数据库中规定:

  1. 明确多到一个关系从工作站,通过外键
  2. 和隐含多对一部首商店(表中未示出,但我假定存在),通过复合主键

相同的情况存在用于的LineItem

Grails实际上是无意中透露了一些有关数据库模式的重要信息。没有糖衣:有缺陷。如果意图以简单英语解释为...

  1. 一家商店可以有多个电台。
  2. 一个站可以有多个标题。
  3. 标题可以有许多订单项。

...那么数据库架构应反映:

  1. 一到多,从商店到车站
  2. 一个一对多的从站头
  3. 一一对多项目

通过诸如架构,您的Grails域模型可以无缝地映射。简要回答你的问题,你不能做你想做的事情,因为Grails/Hibernate关联是基于属性而不是属性的属性。

不可改变的数据库架构

如果数据库架构不能是固定的,你必须放弃你的域类的关联。您可以使域名类别略多于Row Data Gateway。但是这样做会限制动态,地点,标准和HQL查询的功能;没有表/域连接。

如果你只需要只读访问,你就可以创建数据库视图,这里是一个疯狂的想法,可能无法连工作:建立你所需要的意见,然后将意见创建域类。

+0

假设这种情况。有许多实体商店,每个商店都有自己的标题表,其中id是按顺序生成的。现在,所有这些标题数据都会被推送到集中式云中,唯一的方法是您可以唯一标识它使用的是id和store_id,因为可以在多个商店中生成相同的id。我可以将作为标题的主键,但是这对于唯一标识具有pos_id的行并没有意义,并且也与LineItem表一样。 – gowtham

+0

该电台如何适合这张照片?而且,你允许更改数据库模式吗? –

+0

对不起,其实在以前的评论站中没有存储过。是的,我可以编辑架构,但这会对其他许多事情产生巨大影响。我正在寻找建议,无需编辑架构。 – gowtham

相关问题