grails - 即使我省略了EmiratesTo关键字,GORM为什么仍要执行级联删除?

标签 grails groovy gorm

我有以下域类:

假期:

class Holiday {
    String justification
    User user
    //static belongsTo = User
        static constraints = {
        }
}

用户:
class User {
    String login
    String password
    static hasMany = [ holidays : Holiday ]
        static constraints = {
    }
}

我在HolidayUser之间创建了一对多关系。请注意,我没有在belongsTo类中包括Holiday。现在,我编写了以下集成测试:
void testWithoutBelongsTo() {       
        def user1 = new User(login:"anto", password:"secret")
        user1.save()
        def holiday1 = new Holiday(justification:"went to trip")
        holiday1.save()
        user1.addToHolidays(holiday1)
        assertEquals 1, User.get(user1.id).holidays.size()
        user1.delete()
        assertFalse User.exists(user1.id)
        assertFalse Holiday.exists(holiday1.id)
    }

显然,在上述测试案例中,我仅删除了user1实例,但是当我使用assert语句运行时,我可以看到GORM也隐式删除了holiday1。我的测试用例已经通过!即使我在belongsTo类中没有给Holiday关键字,这怎么可能发生?

我正在使用Grails 1.3.7版。

最佳答案

holiday1从未保存,因为它无法验证:user属性既未设置也不能为空。

这是Holiday.groovy中的代码应如下所示:

class Holiday {
    String justification
    User user
    //static belongsTo = User
    static constraints = {
        user(nullable: true)
    }
}

然后进行测试,并在user中正确设置属性holiday1:
void testWithoutBelongsTo()
{
    def user1 = new User(login:"anto", password:"secret")
    user1.save(failOnError: true)
    def holiday1 = new Holiday(justification:"went to trip", 
                               user: user1) // Set user properly
    holiday1.save(failOnError: true)
    user1.addToHolidays(holiday1)
    assert 1, User.get(user1.id).holidays.size()
    holiday1.user = null  // Unset user as otherwise your DB
                          // won't be happy (foreign key missing)
    user1.delete()
    assert ! User.exists(user1.id)
    assert Holiday.exists(holiday1.id)
 }

为了快速消除测试中的验证错误,请始终使用save(failOnError: true)。如果您的对象未通过验证,它将引发异常。

关于grails - 即使我省略了EmiratesTo关键字,GORM为什么仍要执行级联删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8352237/

相关文章:

grails - 从grails中的字符串反序列化joda时间?

grails - Grails集成测试中的奇怪行为

maven - 我如何在Groovy项目中使用 cucumber 定义缺少的步骤?

grails - 尝试在Grails中搜索多对多关系时出错

hibernate - 在应用程序关闭时删除没有后备域类的表

xml - 在 grails 中 pretty-print XML 响应的最佳方式

spring - 错误dynamiccontroller.DynamicControllerManager [Grails]

java - Spring boot 1.5.2.RELEASE 在静态方法中访问 application.yml 属性

java - Java 中的 Groovy 语法检查

grails - 当ID在show.gsp中具有不同的名称时,如何修改g:form标记以使删除工作?