将继承添加到域时出错:org.hibernate.transientObject异常:对象引用未保存的临时实例

将继承添加到域时出错:org.hibernate.transientObject异常:对象引用未保存的临时实例,hibernate,grails,gorm,Hibernate,Grails,Gorm,我很难理解我所遇到的问题的本质。我的grails应用程序有两个域类:HeadOfHousehold和Dependent。除了几个地方外,它们几乎一模一样;首先,HeadOfHousehold拥有Dependent使用构造:static hasMany=[dependents:Dependent],而Dependent拥有static belongsTo=[HeadOfHousehold:HeadOfHousehold],其次,Dependent具有属性String type,该属性可以是配偶或D

我很难理解我所遇到的问题的本质。我的grails应用程序有两个
域类:
HeadOfHousehold
Dependent
。除了几个地方外,它们几乎一模一样;首先,
HeadOfHousehold
拥有
Dependent
使用构造:
static hasMany=[dependents:Dependent]
,而
Dependent
拥有
static belongsTo=[HeadOfHousehold:HeadOfHousehold]
,其次,
Dependent
具有属性
String type
,该属性可以是
配偶
Dependent
,而
房屋所有者
具有一个
瞬态
方法
getType()
,该方法只返回
Self
,最后还有两个属性
currentAddress
previousAddress
,它们也是
HeadOfHousehold
中包含的
域对象
,而任何
依赖的
都指向
HeadOfHousehold
的地址。现在,我在执行任何类型的查询时都遇到了问题,这些查询将使用
依赖
上的
当前地址
的多个方面,因此我决定通过继承来组合这些对象,这样我就可以查询这两个对象的父类,并从
户主
相关
中获取结果

因此,我以以下方式将它们结合起来:
父类

class Person {
    String firstName
    String lastName
    String middleName
    String suffix
    Date dateOfBirth
    Date dateAdded
    String driversLicenseNumber
    String driversLicenseState
    String ssn
    String gender
    Address currentAddress
    Address previousAddress
    MVR mvr
    CreditReport creditReport
    ClueAuto clueAuto
    ClueProperty clueProperty

    static transients =['reportDOB','reportDlNumberState','firstLastMiddleSuffix',
                    'reportAddressString']
    static constraints = {
            middleName blank: false, nullable: true
            suffix blank: true, nullable: true
        ssn matches: "[0-9]{9}"
        gender blank: true, nullable: true, matches: "M|F"
        currentAddress nullable: true
        previousAddress blank: true, nullable: true
        mvr nullable: true
        creditReport nullable: true
        clueAuto nullable: true
        clueProperty nullable: true
        dateAdded nullable: true
    }

    public String toString(){
        String returnValue = lastName + ", " + firstName + " " + middleName
        return returnValue.replaceAll("null"," ")
    }


    //   I'm not sure if this is correct place for these, but they deal with
    // the transformation necessary to create the order object to send it
    // off to the broker in a byte[].
    def getReportDOB(){//dealing with dates is stupid in java X_X
            if(dateOfBirth){
            GregorianCalendar calendar = new GregorianCalendar()
            calendar.setTime(dateOfBirth)
            return DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar)
        }
    }

    def getReportDlNumberState(){
        return driversLicenseNumber +"_" + driversLicenseState
    }

    def getFirstLastMiddleSuffix(){
        return (firstName+"_"+lastName+"_"+middleName+"_"+suffix).replaceAll("null","")
    }

    def getReportAddressString(){
        if(!previousAddress.isEmpty()){
        return "0_HOME,1_BUSINESS"
        } else{
                return "0_HOME"
            }
    }

    //TODO This really shouldn't be necessary I need to figure out why it is.
        def convertGender(){
        switch(gender){
            case "M":
                return "M"
            case "F":
                return "F"
            default:
                return null
        }
        }
    }
子类
从属

class Dependent extends Person{
String type //relationship to head of household.


static belongsTo = [headOfHousehold: HeadOfHousehold]

static constraints = {

}

public String toString(){
    String returnValue = lastName + ", " + firstName + " " + middleName
    return returnValue.replaceAll("null","")
}

def beforeInsert(){
    currentAddress = headOfHousehold.currentAddress
    previousAddress = headOfHousehold.previousAddress
    dateAdded = new Date()
}
}

子类
户主

class HeadOfHousehold extends Person{



static hasMany = [dependents: Dependent]
static transients =['type']

static mapping = {

}

static constraints = {


}

def getType(){
    return "Self"
}


}    
现在,这很好用,只是我在实例化对象时遇到了一些大问题。我一直收到一个错误:

Message: Error executing bootstraps; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: ....clients.Address
我通过直接向构造函数添加地址,然后立即保存地址来解决这个问题 因此:

而不是:

HeadOfHousehold hh2 = FactoryHelperPicardAndPike.createPike(pikeAdded, picardBirthDate) 
  Address currentAddress2 = FactoryHelperPicardAndPike.createPikeCurrentAddress() 
  Address previousAddress2 = FactoryHelperPicardAndPike.createPikePreviousAddress() 

  hh2.setCurrentAddress(currentAddress2)
  hh2.setPreviousAddress(previousAddress2)
  saveIt(currentAddress2)
  saveIt(previousAddress2)
  saveIt(hh2)
我不太明白到底是什么问题;以及为什么它只有在我添加了继承之后才出现。我只能通过反复试验来解决这个问题,这对我将来遇到这个问题并没有什么帮助。现在,我已经阅读了所有关于
未保存的瞬态实例
的问题,我能想到的最好的错误是,我的
地址
对象在保存之前被视为瞬态对象,出于某种原因,它不会与
household
Dependent
进行级联保存。我不明白继承对象和独立对象有何不同。那么,有人能解释为什么我在继承对象时出错,而不是相反吗?此外,是否有对错误的深入解释?我读过,但它并没有完全启发我

我知道这很长,我非常感谢你的关注

HeadOfHousehold hh2 = FactoryHelperPicardAndPike.createPike(pikeAdded, picardBirthDate) 
  Address currentAddress2 = FactoryHelperPicardAndPike.createPikeCurrentAddress() 
  Address previousAddress2 = FactoryHelperPicardAndPike.createPikePreviousAddress() 

  hh2.setCurrentAddress(currentAddress2)
  hh2.setPreviousAddress(previousAddress2)
  saveIt(currentAddress2)
  saveIt(previousAddress2)
  saveIt(hh2)