如何删除grails中的许多关系而不属于

时间:2015-09-22 06:31:20

标签: java grails

我有以下情景

class User{

String name
static constraints = {
details  nullable: true
}
 static hasMany = [details: Details]
}

class Details{
String applicationID
static constraints = {
images  nullable: true
}
static belongsTo = [user: User]
 static hasMany = [images: Images]
}
class Images{
String applicationImage
}

我有一个用户,其中有许多详细信息和详细信息有很多Images.when我试图删除用户get java.util.ConcurrentModificationException。我该如何删除用户。

def deleteUser()
User user=User.get(params.id)
if(user.details) {
                Details details = Details.get(user.details.id)

                if(user.details.images) {
                    def detls= Details.findAllByDetails(details)
                    detls.each {
                        def image = it.images
                        if(image) {
                            Details detailsInstance = Details.get(it.id)
                            image.each { im ->
                                Image image1 = Image.get(im.id);
                                println(image1)
                                detailsInstance.removeFromImages(image1)
                                image1.delete(flush: true)
                            }
                            detailsInstance.save(flush: true, failOnError: true)
                        }
                    }
                }
user.delete(flush:true)
}

1 个答案:

答案 0 :(得分:0)

好的,首先,控制器中的代码与您的域类的代码不匹配(例如,域类的名称不匹配)。这可能就是我无法重现ConcurrentModificationException的原因。

这取决于删除用户时您想要做的事情。如果您只想删除用户及其详细信息而不删除图像,则只需删除

即可
def delete() {
    User user = User.get(params.id)
    user.delete(flush: true)
}

如果您还想删除他的图片,可以添加

static belongsTo = [detail: Detail]

到Image类。在这种情况下,图像将通过级联删除(有关更好的理解,请参阅http://spring.io/blog/2010/07/02/gorm-gotchas-part-2/

如果你想在某些情况下保留图像,你可以这样做:

User user = User.get(params.id)

def images  = []

if (user) {
    user.details.each { detail ->
        detail.images.each { image ->
            images.add(image)
        }
    }

    user.delete(flush: true)
    images*.delete(flush: true)
}