Създаване на класове на домейн с ограничения на външен ключ в groovy

Здравейте, опитвам се да създам клас на домейн с ограничение за външен ключ към друг съществуващ клас на домейн. Новият клас на домейн е ArEntitlement, дефиниран по-долу

package ars
import gra.Resources
class ArEntitlement {
    long id
    String entitlementname
    String entitlementdesc
    String entitlementcomm
    Integer departmentid
    Resources resource
    Integer version

    static belongsto =[resource : Resources]

    static mapping={
    table 'ar_entitlement'
    id(generator:'increment')
    column{
        id(column:'id')
        }
    }
}

Класът на ресурсен домейн е дефиниран по следния начин (създаден е преди)

package gra
import com.gra.transaction.UserTransaction

class Resources {
    Long id=1
    String resourceName
    Double resourceType
    String resourceOwner
    Double riskScore
    Integer decommissioned
    String resourceClass
    Long resourceSegment
    String targetIp
    String resCriticality
    Long resourceGroup
    Integer disabled

    static hasMany=[userTransactions:UserTransaction]

    static mapping = {
        table 'resource'
        version false
        id(generator:'increment')
                column{
                        id(column:'id') }

    }
    static constraints=
    {
        resourceName(nullable:true,blank:false)
        resourceType(nullable:true,blank:false)
        resourceOwner(nullable:true,blank:false)
        riskScore(nullable:false,blank:false)
        decommissioned(nullable:false,blank:false)
        resourceClass(nullable:false,blank:false)
        resourceSegment(nullable:false,blank:false)
        targetIp(nullable:false,blank:false)
        resCriticality(nullable:true,blank:false)
        resourceGroup(nullable:false,blank:false)
        disabled(nullable:false,blank:false)
    }
}

Създадените в резултат таблици нямат съпоставяне на външен ключ на таблицата ar_entitlement към таблицата с ресурси, тя създава колона, наречена „resource_id“, но без ограничение за външен ключ. Имам нужда да сочи към id колона на таблицата с ресурси

Опитах няколко опции, като нямах спецификатора за принадлежност, използвах hasOne (и в двата класа на домейн), но не получих необходимата връзка с външен ключ.

Някаква идея какъв е проблемът тук?

грешка в регистрационния файл, която получавам, е

2011-12-21 19:50:17,258 [main] ERROR hbm2ddl.SchemaUpdate  - Unsuccessful: alter table ar_entitlement add index FKDCD6161FEFD54E5E (resourceid_id), add constraint FKDCD6161FEFD54E5E foreign key (resourceid_id) references resource (id)

person pri_dev    schedule 22.12.2011    source източник
comment
Опитахте ли да изпълните оператора alter table от съобщението за грешка директно в базата данни?   -  person socha23    schedule 22.12.2011
comment
Здравейте, изпълних оператора за промяна на таблицата директно както е и той се провали, но току-що разбрах, че полето за id на таблицата с ресурси е неподписано - поради което се проваляше, когато направих resource_id в таблицата ar_entitlements неподписано и стартирах заявката отново беше успешно... сега искам да знам как да направя полето resource_id в класа на домейна ArEntitlement да бъде неподписано директно, така че да не трябва да създавам ограничението ръчно.   -  person pri_dev    schedule 23.12.2011


Отговори (1)


Премахнете реда „Ресурс за ресурси“ от ArEntitlement.

static belongsTo = [resource : Resources]

Трябва да покрие това и да го дефинираме два пъти може да е проблемът. Също така не трябва да се налага да указвате имената на таблиците, генератора на id или id колоната, тъй като изглежда, че използвате настройките по подразбиране на GORM. Опитайте се да премахнете и тези.

Ето модифицирания код...

package ars
import gra.Resources
class ArEntitlement {

    String entitlementname
    String entitlementdesc
    String entitlementcomm
    Integer departmentid
    Integer version

    static belongsTo = [resource : Resources]

    static mapping = {
    }
}
person Todd W Crone    schedule 22.12.2011
comment
Здравейте, изпълних оператора за промяна на таблицата директно както е и той се провали, но току-що разбрах, че полето за id на таблицата с ресурси е неподписано - поради което се проваляше, когато направих resource_id в таблицата ar_entitlements неподписано и стартирах заявката отново беше успешно... сега искам да знам как да направя полето resource_id в класа на домейна ArEntitlement да бъде неподписано директно, така че да не трябва да създавам ограничението ръчно. - person pri_dev; 23.12.2011
comment
В каква база данни работите? Със сигурност звучи така, сякаш не ви помага много тук. - person Todd W Crone; 26.12.2011
comment
Не знам за цяло число без знак, което лесно се използва в Grails като поле за идентификатор. Честно казано не съм имал такива проблеми. Премахнете „дългия идентификатор“, както направих по-горе, и оставете Grails да го добави вместо вас. - person Todd W Crone; 28.12.2011
comment
Как ще запазя само обект ArEntitlement, без да препращам към Resources? - person Indranil Acharya; 10.07.2017
comment
Мина известно време, откакто правя Grails, но ако не ме лъже паметта, все още трябва да можете просто да направите „arEntitlementInstance.save()“ - person Todd W Crone; 14.07.2017