Hibernate 外键(FK_)的列数必须与引用的主键的列数相同

Hibernate 外键(FK_)的列数必须与引用的主键的列数相同,hibernate,grails,gorm,Hibernate,Grails,Gorm,我正在使用一个遗留数据库,其中表a由3个组合键组成,表B由2个组合键组成,这两个组合键与表a中的两个组合键相同 OnesolPeNames class OnesolPeNames implements Serializable { static mapping = { table "ONESOL_pe_names" id composite: ["division", "peid"] columns{ divi

我正在使用一个遗留数据库,其中表a由3个组合键组成,表B由2个组合键组成,这两个组合键与表a中的两个组合键相同

OnesolPeNames

class OnesolPeNames implements Serializable {

    static mapping = {
        table "ONESOL_pe_names"

        id composite: ["division", "peid"]

        columns{
            division column: 'division', length: 8, sqlType: "char"
            peid column: 'pe_id', length: 12, sqlType: "char"
            peNameU column: 'pe_name_u', length: 50, sqlType: "char"
        }
    }

    static hasMany = [ recoverySetups : RecoverySetup]

    ....
class RecoverySetup implements Serializable {

    static mapping = {
        table "recovery_setup"

        id composite: ["division", "peid", "orgkey"]

        columns {
            division column: 'division', length: 10, sqlType: "char"
            peid column: 'peid', length: 12, sqlType: "char"
            orgkey column: 'org_key', length: 8, sqlType: "char"

            oneSolName column: ['division', 'peid']


        }
    }

    static belongsTo = [oneSolName: OnesolPeNames]

    ....
恢复设置

class OnesolPeNames implements Serializable {

    static mapping = {
        table "ONESOL_pe_names"

        id composite: ["division", "peid"]

        columns{
            division column: 'division', length: 8, sqlType: "char"
            peid column: 'pe_id', length: 12, sqlType: "char"
            peNameU column: 'pe_name_u', length: 50, sqlType: "char"
        }
    }

    static hasMany = [ recoverySetups : RecoverySetup]

    ....
class RecoverySetup implements Serializable {

    static mapping = {
        table "recovery_setup"

        id composite: ["division", "peid", "orgkey"]

        columns {
            division column: 'division', length: 10, sqlType: "char"
            peid column: 'peid', length: 12, sqlType: "char"
            orgkey column: 'org_key', length: 8, sqlType: "char"

            oneSolName column: ['division', 'peid']


        }
    }

    static belongsTo = [oneSolName: OnesolPeNames]

    ....
我正试图像这样访问OnesolPeNames

recoverySetup.onesolPeNames.peNameU

我得到以下错误

由MappingException导致:外键 (FK_ib9w9pn893cwi1dkk84qs31bx:恢复设置[部门, peid、onesol_pe_name_division、onesol_pe_name_peid])必须具有相同的名称 作为引用主键的列数(ONESOL\u pe\u名称 [部门,pe_id])

我正在将oneSolName列设置为
['division','peid']
,其中
onesol\u pe\u names\u division,onesol\u pe\u names\u peid
来自哪里


是否我的复合密钥是PK的一部分,但也扮演着FK的角色,即所谓的“派生身份”

我遇到了类似的问题,我用这种方式解决了映射表:

class RecoverySetup implements Serializable {

    static mapping = {
        table "recovery_setup"
        id composite: ["division", "peid", "orgkey"]
        columns {
            orgkey column: 'org_key', length: 8, sqlType: "char"

            oneSolName {
                column name: 'division'
                column name: 'peid'
            }
        }
        oneSolName updateable: false, insertable: false
    }

    static belongsTo = [oneSolName: OnesolPeNames]
    ...
}

我有一个类似的问题,我用这种方式解决了映射表:

class RecoverySetup implements Serializable {

    static mapping = {
        table "recovery_setup"
        id composite: ["division", "peid", "orgkey"]
        columns {
            orgkey column: 'org_key', length: 8, sqlType: "char"

            oneSolName {
                column name: 'division'
                column name: 'peid'
            }
        }
        oneSolName updateable: false, insertable: false
    }

    static belongsTo = [oneSolName: OnesolPeNames]
    ...
}

我有一个类似的问题,我用这种方式解决了映射表:

class RecoverySetup implements Serializable {

    static mapping = {
        table "recovery_setup"
        id composite: ["division", "peid", "orgkey"]
        columns {
            orgkey column: 'org_key', length: 8, sqlType: "char"

            oneSolName {
                column name: 'division'
                column name: 'peid'
            }
        }
        oneSolName updateable: false, insertable: false
    }

    static belongsTo = [oneSolName: OnesolPeNames]
    ...
}

我有一个类似的问题,我用这种方式解决了映射表:

class RecoverySetup implements Serializable {

    static mapping = {
        table "recovery_setup"
        id composite: ["division", "peid", "orgkey"]
        columns {
            orgkey column: 'org_key', length: 8, sqlType: "char"

            oneSolName {
                column name: 'division'
                column name: 'peid'
            }
        }
        oneSolName updateable: false, insertable: false
    }

    static belongsTo = [oneSolName: OnesolPeNames]
    ...
}


我发现您在映射遗留数据库时遇到问题。我有一个Grails应用程序,它映射一个遗留数据库,其中所有表都至少有两个组合键。不同之处在于,我没有使用DomainClass进行映射,我使用的是hbm.xml文件(Hibernate的传统方式)。同样的情况下,我的每个表都是两个或多个组合键。是否可以使用DomainClass进行此操作?如果可能的话,管理层会更喜欢这种方法。我现在不记得原因了,但我在使用DomainClass映射表时遇到了问题。当我决定使用hbm.xml文件进行映射时,一切都开始正常工作。为了生成hbm.xml文件,我使用了一个Eclipse插件HibernateTools。这个插件连接到一个遗留数据库(通过JDBC),并自动生成hbm.xml和与.java相关的。我想我的问题可能是派生标识。我发现您在映射遗留数据库时遇到了问题。我有一个Grails应用程序,它映射一个遗留数据库,其中所有表都至少有两个组合键。不同之处在于,我没有使用DomainClass进行映射,我使用的是hbm.xml文件(Hibernate的传统方式)。同样的情况下,我的每个表都是两个或多个组合键。是否可以使用DomainClass进行此操作?如果可能的话,管理层会更喜欢这种方法。我现在不记得原因了,但我在使用DomainClass映射表时遇到了问题。当我决定使用hbm.xml文件进行映射时,一切都开始正常工作。为了生成hbm.xml文件,我使用了一个Eclipse插件HibernateTools。这个插件连接到一个遗留数据库(通过JDBC),并自动生成hbm.xml和与.java相关的。我想我的问题可能是派生标识。我发现您在映射遗留数据库时遇到了问题。我有一个Grails应用程序,它映射一个遗留数据库,其中所有表都至少有两个组合键。不同之处在于,我没有使用DomainClass进行映射,我使用的是hbm.xml文件(Hibernate的传统方式)。同样的情况下,我的每个表都是两个或多个组合键。是否可以使用DomainClass进行此操作?如果可能的话,管理层会更喜欢这种方法。我现在不记得原因了,但我在使用DomainClass映射表时遇到了问题。当我决定使用hbm.xml文件进行映射时,一切都开始正常工作。为了生成hbm.xml文件,我使用了一个Eclipse插件HibernateTools。这个插件连接到一个遗留数据库(通过JDBC),并自动生成hbm.xml和与.java相关的。我想我的问题可能是派生标识。我发现您在映射遗留数据库时遇到了问题。我有一个Grails应用程序,它映射一个遗留数据库,其中所有表都至少有两个组合键。不同之处在于,我没有使用DomainClass进行映射,我使用的是hbm.xml文件(Hibernate的传统方式)。同样的情况下,我的每个表都是两个或多个组合键。是否可以使用DomainClass进行此操作?如果可能的话,管理层会更喜欢这种方法。我现在不记得原因了,但我在使用DomainClass映射表时遇到了问题。当我决定使用hbm.xml文件进行映射时,一切都开始正常工作。为了生成hbm.xml文件,我使用了一个Eclipse插件HibernateTools。这个插件连接到一个遗留数据库(通过JDBC),并自动生成hbm.xml和与.java相关的。我想我的问题可能是派生标识工作得很好,当我们说oneSolName不可更新或不可插入时,这意味着什么?这是否意味着我无法更新该表中的任何记录?您可以根据需要在OnesolPeNames类中插入/更新记录。但是,当您在RecoverySetup类中设置oneSolName值时,您将执行设置/更新主键的操作。当我们说oneSolName不可更新或不可插入时,这意味着什么?这是否意味着我无法更新该表中的任何记录?您可以根据需要在OnesolPeNames类中插入/更新记录。但是,当您在RecoverySetup类中设置oneSolName值时,您将执行设置/更新主键的操作。当我们说oneSolName不可更新或不可插入时,这意味着什么?这是否意味着我无法更新该表中的任何记录?您可以根据需要在OnesolPeNames类中插入/更新记录。但是,当您在RecoverySetup类中设置oneSolName值时,您将执行设置/更新主键的操作。当我们说oneSolName不可更新或不可插入时,这意味着什么?这是否意味着我无法升级