GORM Playground Link

https://github.com/go-gorm/playground/pull/671

Description

When using a belongs-to relation with foreignKey and references overwrites preloading does not work. Without the overwrite it works as expected.

type Country1 struct {
    Name string `gorm:"primaryKey"`
}

type Country2 struct {
    CName string `gorm:"primaryKey"`
}

type Address1 struct {
    CountryName string
    Country     Country1
}

type Address2 struct {
    CName   string
    Country Country2 `gorm:"foreignKey:CName;references:CName"`
}

type Org struct {
    ID        int
    Adress1_1 Address1 `gorm:"embedded;embeddedPrefix:address1_1_"`
    Adress1_2 Address1 `gorm:"embedded;embeddedPrefix:address1_2_"`
    Adress2_1 Address2 `gorm:"embedded;embeddedPrefix:address2_1_"`
    Adress2_2 Address2 `gorm:"embedded;embeddedPrefix:address2_2_"`
}

In the example above Address1 does not overwrite foreignKey nor references, and preloading works as expected. Address2 overwrites foreignKey and references, preloading does not work.

    c1_1 := Country1{Name: "c1_1"}
    c1_2 := Country1{Name: "c1_2"}
    c2_1 := Country2{CName: "c2_1"}
    c2_2 := Country2{CName: "c2_2"}

    org := Org{
        Adress1_1: Address1{Country: c1_1},
        Adress1_2: Address1{Country: c1_2},
        Adress2_1: Address2{Country: c2_1},
        Adress2_2: Address2{Country: c2_2},
    }
    DB.Create(&org)

    var result Org
    DB.Preload(clause.Associations).First(&result)

    if result.Adress1_1.Country.Name != "c1_1" {
        t.Error("Adress1_1 country has not been resolved")
    }
    if result.Adress1_2.Country.Name != "c1_2" {
        t.Error("Adress1_2 country has not been resolved")
    }
    if result.Adress2_1.Country.CName != "c2_1" {
        t.Error("Adress2_1 country has not been resolved")
    }
    if result.Adress2_2.Country.CName != "c2_2" {
        t.Error("Adress2_2 country has not been resolved")
    }

Fails with: Adress2_1 country has not been resolved && Adress2_2 country has not been resolved

Hint: Only overwriting the reference and auto detecting the foreignKey works as expected. Example:

type Address3 struct {
    CountryID   string
    Country Country2 `gorm:"references:CName"`
}

Comment From: a631807682

https://github.com/go-gorm/gorm/issues/5793#issuecomment-1588667116