用于保存域对象的Grails可重用服务

用于保存域对象的Grails可重用服务,grails,Grails,我有一个包含多个域类的Grails项目,我希望通过在持久性服务中只包含一个save()使其尽可能可重用。为了实现这一点,我在我的项目中做了以下工作 //PersistenceService.groovy @Transactional class PersistenceService { def create(Object object) { object.save flush: true object } //BaseRestfulController clas

我有一个包含多个域类的Grails项目,我希望通过在持久性服务中只包含一个save()使其尽可能可重用。为了实现这一点,我在我的项目中做了以下工作

//PersistenceService.groovy

@Transactional
class PersistenceService {
def create(Object object) {        
    object.save flush: true
    object
}
//BaseRestfulController

class BaseRestfulController extends RestfulController {

def persistenceService

def save(Object object) {
    persistenceService.create(object)
}
class BookController extends BaseRestfulController {

private static final log = LogFactory.getLog(this)

static responseFormats = ['json', 'xml']

BookController() {
    super(Book)
}

@Transactional
def save(Book book) {
    log.debug("creating book")

    super.save(book)

}
//图书管理员

class BaseRestfulController extends RestfulController {

def persistenceService

def save(Object object) {
    persistenceService.create(object)
}
class BookController extends BaseRestfulController {

private static final log = LogFactory.getLog(this)

static responseFormats = ['json', 'xml']

BookController() {
    super(Book)
}

@Transactional
def save(Book book) {
    log.debug("creating book")

    super.save(book)

}
所以基本上我有一堆域,比如Author等,每个域都有自己的控制器,类似于bookController。那么,有没有一种方法可以像我在上面尝试的那样重用服务以实现持久性呢


谢谢

我正在做类似的事情,但主要是因为我的所有实体实际上都没有从数据库中删除,而是“标记”为已删除。对于一些应用程序,您需要这种方法,因为它对于防止任何类型的数据丢失都至关重要

由于大多数数据库不支持这种情况,因此在删除父域实例时,不能依靠外键来删除依赖域实例。 因此,我有一个名为GenericDomainService的基本服务类,它有保存、删除(标记)、取消删除(取消标记)的方法

该服务提供了一个基本的实现,可以应用于任何域

class GenericDomainService {

def save( instance ) {
    if( !instance || instance.hasErrors() || !instance.save( flush: true ) ) {
        instance.errors.allErrors.each {
            if( it instanceof org.springframework.validation.FieldError ) {
                log.error "${it.objectName}.${it.field}: ${it.code} (${it.rejectedValue})"
            }
            else {
                log.error it
            }
        }
        return null
    }
    else {
        return instance
    }
}

def delete( instance, date = new Date() ) {
    instance.dateDisabled = date
    instance.save( validate: false, flush: true )
    return null
}

def undelete( instance ) {
    instance.dateDisabled = null
    instance.save( validate: false, flush: true )
    return null
}

}
然后,在我的控制器模板中,我总是声明两个服务:通用服务和具体服务(可能不存在):

这将一个名为Book的域转换为:

def bookService
def genericDomainService
在控制器方法中,我使用如下服务:

def service = bookService ?: genericDomainService
service.save( instance )
最后,给定域的服务将从此域继承,为这些操作提供(如果需要)自定义逻辑:

class BookService extends GenericDomainService {

def delete( instance, date = new Date() ) {
    BookReview.executeUpdate( "update BookReview b set b.dateDisabled = :date where b.book.id = :bookId and b.dateDisabled is null", [ date: date, bookId: instance.id ] )
    super.delete( instance, date )
}

def undelete( instance ) {
    BookReview.executeUpdate( "update BookReview b set b.dateDisabled = null where b.dateDisabled = :date and b.book.id = :bookId", [ date: instance.dateDisabled, bookId: instance.id ] )
    super.undelete( instance )
}

}

希望能有所帮助。

我认为这是可行的,但您必须将方法create(Object Object)的签名更改为create(def Object),将save(Object Object)的签名更改为save(def Object)在BaseRestfulController类中。
def
Object
相同,或者在方法签名中没有类型信息:这3个方法完全相同:
create(o)
==
create(Object o)
=
create(def o)
@user2816352我无法理解您在这里试图实现的目标