Grails无法更新ID不是id的行

时间:2016-12-08 23:03:47

标签: grails

我正在尝试使用Grails来管理Microsoft SQL数据库中的预先存在的表。问题是该表没有int ID列。它作为主键的是String字段。

在我的域类中,我有以下代码,这应该可以使它工作:

static mapping = {
        id name: "myPK", generator: "assigned", column: "myPK"
        version false
    }

这是更新功能:

@Transactional
    def update(MyDomain myDomain) {
        if (myDomain== null) {
            transactionStatus.setRollbackOnly()
            notFound()
            return
        }

        if (myDomain.hasErrors()) {
            transactionStatus.setRollbackOnly()
            respond myDomain.errors, view:'edit'
            return
        }

        myDomain.save flush:true

        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.updated.message', args: [message(code: 'myDomain.label', default: 'MyDomain'), myDomain.myPK])
                redirect myDomain
            }
            '*'{ respond myDomain, [status: OK] }
        }
    }

正如你所看到的,除了用'myPK'替换id之外,我并没有真正改变它所生成的内容。我也尝试了这个而没有替换id。

这是我收到的错误消息:

MyDomain not found with id myString

我也遇到了创建新问题的问题,因为它保存了新条目,但无法重定向到它,并且它在数据库中不存在。不过,我要从中进行选择,并查看所有条目。

我正在使用Grails 3.1.1

如果您还有其他想要查看的代码,请告诉我。

修改1

这是完整的域类:

class MyDomain{

    String myPK
    Character prop1
    Character prop2
    Character prop3
    Character prop4
    Character prop5
    Character prop6
    Character prop7
    Character prop8
    Character prop9
    Character prop10
    Character prop11
    Date prop12
    Character prop13

    static mapping = {
        id name: "myPK", generator: "assigned", column: "myPK"
        version false
    }

    static constraints = {
        myPKmaxSize: 10
        prop1 nullable: true, maxSize: 1
        prop2 nullable: true, maxSize: 1
        prop3 nullable: true, maxSize: 1
        prop4 nullable: true, maxSize: 1
        prop5 nullable: true, maxSize: 1
        prop6 nullable: true, maxSize: 1
        prop7 nullable: true, maxSize: 1
        prop8 nullable: true, maxSize: 1
        prop9 nullable: true, maxSize: 1
        prop10 nullable: true, maxSize: 1
        prop11 nullable: true, maxSize: 1
        prop12 nullable: true
        prop13 nullable: true, maxSize: 1
    }
}

编辑2 这是我用来创建域类的新条目的保存函数:

    @Transactional
    def save(MyDomain myDomain) {
        if (myDomain== null) {
            transactionStatus.setRollbackOnly()
            notFound()
            return
        }

        if (myDomain.hasErrors()) {
            transactionStatus.setRollbackOnly()
            respond myDomain.errors, view:'create'
            return
        }

        myDomain.save flush:true

        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.created.message', args: [message(code: 'myDomain.label', default: 'MyDomain'), myDomain.myPK])
                redirect myDomain
            }
            '*' { respond myDomain, [status: CREATED] }
        }
    }

2 个答案:

答案 0 :(得分:0)

我相信Grails Domain始终具有id属性。我不相信你可以给它一个不同的名字,比如myPK。如果可以,所有动态方法都会被命名为错误,即:findAllById()将不存在。您可以将其键入为String并将其映射到所需的任何DB列:


class MyDomain {
    String id
    ...
    static mapping = {
        id column: 'myPK', generator: 'assigned'
        ...
    }
}

如果您想要一个名为myPk的媒体资源,则可以在您的网域中创建一个瞬态:


    ...
    static transients = ['myPk']
    String getMyPK(){
        return id
    }
    ...

答案 1 :(得分:0)

在没有运气的情况下尝试了Bryan G Campbell的答案之后,我决定在表格中添加一个id列,这解决了问题。我确保将列设为big int和null,并为所有先前的条目提供唯一的id。