gpt4 book ai didi

grails - Grails 2.5,Delete无法访问一对多关系之前

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

在这里使用Grails 2.5.6。我试图在beforeDelete GORM事件中访问域类之外的一组字符串。我什至在beforeDelete中到达断点之前,就已经在数据库日志中发布了对该集合的删除。

我在域类的下面的println(strings)上收到NullPointerException。

我的测试域类看起来像

class DeleteTest {
Integer id
Set<String> stringSet
String prop1
String prop2

static hasMany = [stringSet: String]

static constraints = {
prop1(maxSize: 20)
prop2(maxSize: 20)
}

static mapping = {
stringSet(joinTable: [column: 'delete_test_string_set', length: 15])
}

def beforeDelete() {
withNewSession {
Set<String> strings = this."stringSet"
println(strings)
}
}
}

我已经做了一个这样的测试 Controller 。
class DeleteTestController {

def create() {
DeleteTest test = null
DeleteTest.withTransaction {
test = new DeleteTest(
prop1: 'Test',
prop2: 'another test',
stringSet: ['str1', 'str2', 'str3']
).save()
}

render (test as JSON)
}

def delete() {
DeleteTest test = DeleteTest.findByProp1('Test')
DeleteTest.withTransaction {
test.delete()
}

render(test as JSON)
}
}

如何在beforeDelete事件中获取stringSet?

最佳答案

一种简单的方法是确保在调用delete之前先加载stringSet。但是,这里显然存在一些奇怪的行为,我将描述到目前为止我发现的东西。

简单答案

def delete() {
DeleteTest test = DeleteTest.findByProp1('Test')
test.stringSet?.size() // <-- force load here
DeleteTest.withTransaction {
test.delete()
}
render(test as JSON)
}

其他注意事项

我试图使 stringSet渴望加载。这没有按预期方式工作,在 beforeDelete代码中,它通常是单个值或空白。

我还尝试将StringSet设置为Set,在其中定义了一个包含该值的单个GORM对象MyString。确实有效(尽管我必须急切地将其取回),但是我认为这不是针对您的情况的有效解决方案,因为我假设您已经有数据并且不能仅仅替换它。

基于一些调试挖掘,我猜测(但实际上只是一个猜测)集合在 beforeDelete事件触发之前被删除,因此即使在新事务中也不能延迟加载该集合。我希望其他人可能会权衡这是否正确,但是最近有2种专业知识越来越难找到。

关于grails - Grails 2.5,Delete无法访问一对多关系之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60452970/

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