Grails: mapping column names of a field and a belo

2019-05-05 21:49发布

问题:

I'm trying to map the column names of this class:

class Amount{

    String total //Total amount of something
    String type  //Type of amount, Dollars, %, Times something
    Bonification bonificationRate  //the amount can be "x times another bonification"

    static belongsTo = [parentBonification: Bonification]

    static mapping = {
       table "AMOUNTS"
       total column: "AMOU_TTOTAL"
       type column: "AMOU_TTYPE"
       parentBonification column: "BONI_CID"
       bonificationRate column: "BONI_TRATE_CID"
    }

}


class Bonification {  
    //among other things:  
    Amount amount
}

The thing is none of the field with the Bonification class are created in the DB, not with the name I give them and neither with the default suppossed names.

Comment Edit:

  1. Both are Domain Classes;
  2. Datasource is on dbCreate = "update"
  3. I dropped the Table in Oracle and let Grails create it again. Still no Bonification columns.
  4. I can not dbCreate = "create-drop" because there is data that I can't delete for now.
  5. I mounted a new local Derby Database with dbCreate = create-drop. Still no luck.

(PD: All other fields are persisted and mapped with the right column names, only those two Bonification fields are the problem)
Is there another way of doing this?

Grails: 1.3.9
BD: Oracle 9

Edit for asked DataSource.groovy (External file accessed from Config.groovy grails.config.locations = [ "file:${extConfig}/${appName}Config.groovy"])

package xx.xxx.xxxx.xxxXxxx

dataSource 
{
    pooled = true
    dialect = "org.hibernate.dialect.Oracle10gDialect"
    driverClassName = "oracle.jdbc.OracleDriver"    
    username = "XXX"
    password = "XXX" 
    properties {
                maxActive = 100
                maxIdle = 25
                minIdle = 5
                initialSize = 5
                minEvictableIdleTimeMillis = 60000
                timeBetweenEvictionRunsMillis = 60000
                maxWait = 10000
                validationQuery = "select 1 from dual"
                }

}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = true
    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
}

// environment specific settings
environments {
    development {
println "Including external DataSource"
        dataSource {            
            dbCreate = "update"
            url = "jdbc:oracle:thin:@xxx.xxx.xx:xxxx:XXXX"
        }
    }
}

回答1:

Ok, finally I got it.

I used the "mappedBy" property.

http://grails.org/doc/2.1.0/ref/Domain%20Classes/mappedBy.html

The documentation (6.2.1.2 One-to-many) said that is for use in the "hasMany" side. That confused me because I didn't have a hasMany but rather two field of the same type in Class Amount. And what I really had to do was to use the mappedBy property, not in the Amount Class, but in the Bonification Class that has just one reference to Amount.

And with that I tell to the Amount Class, wich Bonification he has to back reference so "he" doesn't get confused, and take the bonificationRate field just as a field and not as a reference as I think he was doing before.

class Amount{

    String total //Total amount of something
    String type  //Type of amount, Dollars, %, Times something
    Bonification bonificationRate  //the amount can be "x times another bonification"

    static belongsTo = [parentBonification: Bonification]

    static mapping = {
       table "AMOUNTS"
       total column: "AMOU_TTOTAL"
       type column: "AMOU_TTYPE"
       parentBonification column: "BONI_CID"
       bonificationRate column: "BONI_TRATE_CID"
    }

}


class Bonification {  
    //among other things:  
    Amount amount

    static mappedBy = [amount: "parentBonification"]
}

That didn't created the parentBonification "BONI_CID" column but it Did created the bonificationRate "BONI_TRATE_CID" wich I needed.

Sorry if it's too messy. Thanks for the time and help anyway.