我正在尝试使用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] }
}
}
答案 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。