Как реализовать TablePerHierarchy с дисклиминатором в граалях? - PullRequest
2 голосов
/ 04 марта 2011

У меня есть класс hirarchy:

class Item {}
class Participation extends Item{}
class Contribution extends Participation{}
class Question extends Participation{}

Я хотел бы иметь таблицу для каждого класса, поэтому я добавляю tablePerHierarchy false в Item

Мне нужен дискриминатор для реализации запроса:где class = "Вклад"

Я стараюсь много реализации, но она не работает.

Как это сделать?

Спасибо

1 Ответ

6 голосов
/ 04 марта 2011

Хотите ли вы таблицу для иерархии или таблицу для класса? Непонятно в вашем вопросе.

Со следующими объектами домена вы можете сделать это любым способом:

// 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
...