将继承添加到域时出错:org.hibernate.transientObject异常:对象引用未保存的临时实例
我很难理解我所遇到的问题的本质。我的grails应用程序有两个将继承添加到域时出错: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
域类: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)