外键(FK_ 必须与引用的主键具有相同的列数

Posted

技术标签:

【中文标题】外键(FK_ 必须与引用的主键具有相同的列数【英文标题】:Foreign key (FK_ must have same number of columns as the referenced primary key 【发布时间】:2015-09-18 22:58:17 【问题描述】:

我正在使用旧数据库,其中表 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]

    ....

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:recovery_setup [师, peid,onesol_pe_names_division,onesol_pe_names_peid])) 必须相同 作为引用主键的列数(ONESOL_pe_names [部门,pe_id])

我将 oneSolName 列设置为 ['division', 'peid']onesol_pe_names_division,onesol_pe_names_peid 来自哪里?

难道我的复合键是 PK 的一部分,但也扮演着被称为“派生身份”的 FK 的角色?

【问题讨论】:

我了解到您在映射旧数据库时遇到问题。我有一个 Grails 应用程序,它映射一个遗留数据库,其中所有表都至少有两个复合键。不同之处在于我不是使用 DomainClass 做地图,而是使用 hbm.xml 文件(Hibernate 传统方式)。 同样的情况,我的每一张表都是两个或多个复合键。是否可以使用 DomainClass 来做到这一点?如果可能,管理层会更喜欢这种方法。 我现在不记得原因了,但是我在使用 DomainClasses 映射表时遇到了问题。当我决定使用 hbm.xml 文件进行映射时,一切都开始正常工作。为了生成 hbm.xml 文件,我使用了一个名为 HibernateTools 的 Eclipse 插件。该插件连接到遗留数据库(通过 JDBC)并自动生成 hbm.xml 和 .java 相关的。 我认为我的问题可能是派生身份 【参考方案1】:

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

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

【讨论】:

完美运行,当我们说 oneSolName 不可更新或不可转换时是什么意思?这是否意味着我无法更新该表中的任何记录? 您可以根据需要在 OnesolPeNames 类中插入/更新记录。但是,当您在 RecoverySetup 类中设置 oneSolName 值时,您将设置/更新主键

以上是关于外键(FK_ 必须与引用的主键具有相同的列数的主要内容,如果未能解决你的问题,请参考以下文章

休眠:外键的列数错误

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)

如何使用主键作为JPA和Hibernate的外键引用?

外键为啥不一定与相应的主键重名

使用SQL Server创建一对多关系