开发者

Mapping multiple domain objects to the same table using GORM DSL

开发者 https://www.devze.com 2022-12-22 02:07 出处:网络
I\'m creating a grails app over a legacy database. There is a table out of which I would like to create several different domain objects (Type1, Type2 and Type3 in my example below).

I'm creating a grails app over a legacy database.

There is a table out of which I would like to create several different domain objects (Type1, Type2 and Type3 in my example below).

The table is like this :

ID    TYPE    DESCRIPTION
1     type1   description of a type1 object
2     type1   description of another type1 object
3     type2   description of a type2 object
4     type3   description of a type3 object
...

So I would like to create 3 different domain classes, each containing a field named "description", and corresponding to a specific "type", because the rows represent different concepts.

Is there any kind of constraint that allows me to filter the rows by type ?

I mean, could I do something like :

class Type1 {
    String type
    St开发者_如何学编程ring description

    static mapping = {
       table 'mytable'
    }

    static constraints = { type == 'type1' } // Is there anything like this ?

 }

Then I would expect Type1.list() to produce a query like :

SELECT type, description 
FROM mytable
WHERE type = 'type1'

Update :

Actually the documentation says that I can use a discriminator to achieve this.

However, I tried to set my class as follows :

class Type1 extends BaseType {

  static mapping = {
    discriminator column:'type', value: 'type1'
  }

}

I activated hibernate SQL tracing, and instead of seeing

SELECT ... FROM mytable WHERE type = 'type1'

I see

SELECT ... FROM mytable WHERE class = 'type1'

It seems the discriminator is completely ignoring my custom column name :-(

I'm using Grails 1.2.1


Ok so the Grails documentation is not up to date (it should though).

The solution is :

In the BaseType class :

static mapping = { discriminator column:"type" }

In the subclasses :

static mapping = { discriminator value:"type1" } // or type2, type3, etc...


The GORM Documentation seems to suggest you can, so long as all your TypeX classes extend a common base class

0

精彩评论

暂无评论...
验证码 换一张
取 消