gpt4 book ai didi

grails - 我可以引用丢失的数据从关联(joinTable)中恢复吗

转载 作者:行者123 更新时间:2023-12-02 14:04:06 26 4
gpt4 key购买 nike

我已经阅读了很多文章和文档,并且一定缺少一些内容。

在我的应用程序(下面的模型)中,我遇到了一个数据问题,这似乎超出了我的控制范围,在联接表JOBORDERCATEGORIES中有一个categoryId,而在CATEGORY表中没有相应的行。我正在通过JobOrder中的getJobCategories()访问类别数据。当我的类别表缺少引用的行时,这将产生以下错误:

2012-03-07 08:02:10,223 [quartzScheduler_Worker-1] ERROR listeners.SessionBinderJobListener  - Cannot flush Hibernate Sesssion, error will be ignored
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.matrixres.domain.Category#416191]

我的代码停止了。

我尝试使用ignoreNotFound,但它不能帮助我克服上面的错误。

如果我错过了有关该问题的解决方法的文章,请链接至该文章,否则欢迎您思考如何前进。也许有一条更直接的途径可以实现我要获得一个良好的类别列表的目标,但是我对框架还不足够了解下一步要做什么。注意,我不能写任何这些表。

谢谢,有钱

我的模型的简化版本:

作业订单对象:
class JobOrder {
def getJobCategories() {
def cats = []
try {
def jocategories = this.categories
if(!jocategories.isEmpty() && jocategories!=null){
println "we got categories for ${this.id}"

jocategories.each { cat ->
if(cat?.parentCategoryID == 0){
if(cat.occupation != null){
cats << cat.occupation
} else {
cats << cat.name
}
}
}
}
} catch(e) {
cats << "Other Area(s)"
}
cats
}

static mapping = {
table 'dbo.JOBORDER'
version false
id generator: 'identity', column: 'JOBORDERID'

/*
* several other mapped columns deleted here
*/

categories joinTable:[name:'jobOrderCategories', column: 'categoryId', key:'jobOrderID']
}

/*
* several properties deleted here
*/
static hasMany = [categories: Category] //several other hasMany associations exist

}

类别对象:
class Category {

static mapping = {
table 'CATEGORY'
version false
id generator: 'identity', column: 'categoryID'
occupation column: 'OCCUPATION'
name column: 'NAME'
parentCategoryID column: 'PARENTCATEGORYID'
/*
* several other mapped columns deleted here
*/

jobOrders joinTable:[name:'jobOrderCategories', column: 'jobOrderID', key:'categoryId']
}

String name
String occupation
int parentCategoryID
/*
* several properties deleted here
*/

static belongsTo = [JobOrder]
static hasMany = [jobOrders:JobOrder]
}

联接表:
class JobOrderCategories {
static mapping = {
table 'JOBORDERCATEGORIES'
version false
isDeleted column: 'ISDELETED'
jobOrderID column: 'JOBORDERID'
categoryId column: 'CATEGORYID'
}

Boolean isDeleted
Integer jobOrderID
Integer categoryId
}

最佳答案

这类情况并不是最有趣,但是我之前不得不处理这种“一劳永逸”的ORM问题;)基本上,您要在此处执行的操作是存储未键入为对象引用,但作为整数,虽然您将丢失一些动态查找器,但GORM如此精美,但您将获得一种相当直接的访问数据的方式,而无需涉及与Hibernate的内在纠缠。

基本上,这将涉及放弃JobOrder和Category上的hasMany和belongsTo属性。相反,您需要做类似的事情

def myJobOrder = JobOrder.get(yourId);
def myCategoryIds = JobOrderCategories.findAllByJobOrderID(myJobOrder.id)
def myCategories = Categories.withCriteria {
in('id', myCategoryIds)
}

您可以将这些遍历的变体放在类的帮助器方法中,例如,您的getJobCategories方法可能会变成
class JobOrder {
//...
def getJobCategories() {
def myCategoryIds = JobOrderCategories.findAllByJobOrderID(this.id)
def myCategories = Categories.withCriteria {
in('id', myCategoryIds)
}
}
}

等等。这绝对不是世界上最漂亮的东西,而且您失去了使用GORM轻松浏览事物的能力(例如
jobOrder.withCriteria {
categories {
eq('name', blah)
}
}

成为一种情况的executeQuery类型。)
但是总的来说,处理起来还不错:)
希望有帮助!

关于grails - 我可以引用丢失的数据从关联(joinTable)中恢复吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9603964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com