Хотите ли вы таблицу для иерархии или таблицу для класса? Непонятно в вашем вопросе.
Со следующими объектами домена вы можете сделать это любым способом:
// Item.groovy
class Item {
String x
}
// Participation.groovy
class Participation extends Item {
String y
}
Используя стандартную стратегию «таблица на иерархию», будет использоваться только одна таблица для хранения элементов и всех подклассов элементов. Столбец дискриминатора по умолчанию называется class
, который Grails будет использовать автоматически. Схема, сгенерированная grails schema-export
, выглядит следующим образом:
create table item (
id bigint generated by default as identity (start with 1),
version bigint not null,
x varchar(255) not null,
class varchar(255) not null,
y varchar(255),
primary key (id)
);
Существует только одна таблица для обоих классов, которая содержит все поля, объявленные в каждом классе в иерархии, плюс столбец дискриминатора class
. Если вы сделаете запрос наподобие Participation.list()
, сгенерированный SQL grails будет выглядеть так:
select
this_.id as id1_0_,
this_.version as version1_0_,
this_.x as x1_0_,
this_.y as y1_0_
from
item this_
where
this_.class='Participation'
Изменяя стратегию наследования на таблицу для класса с помощью static mapping { tablePerHieracrchy false }
в Item.groovy, Grails создаст таблицу для каждого из классов в иерархии. В каждой таблице хранятся только поля, объявленные в каждом классе, поэтому объект участия будет представлен строкой как в таблице элементов, так и в таблице участия. Схема выглядит следующим образом:
create table item (
id bigint generated by default as identity (start with 1),
version bigint not null,
x varchar(255) not null,
primary key (id)
);
create table participation (
id bigint not null,
y varchar(255) not null,
primary key (id)
);
И SQL для Participation.list()
меняется на:
select
this_.id as id1_0_,
this_1_.version as version1_0_,
this_1_.x as x1_0_,
this_.y as y2_0_
from
participation this_
inner join
item this_1_
on this_.id=this_1_.id