Grails 列默认值不默认

Grails column default value not defaulting

我正在使用 Grails 2.4.3 并拥有此域 class:

class StockItem extends DisplayableDomain {

String name
Integer quantityOnHand
BigDecimal wholesalePrice
BigDecimal retailPrice
BigDecimal profit

static constraints = {
    name minSize: 3, maxSize: 80
    wholesalePrice min: 0.0, scale: 2
    retailPrice min: 0.0, scale: 2, validator: { retailPrice, StockItem obj ->
        if (retailPrice < obj.wholesalePrice) {
            ['retailLessThanWholesale']
        }
    }
    quantityOnHand min: 0
    profit nullable: true
}

@Override   
String getDisplayString() {
    name
}

static mapping = {
    profit formula: "RETAIL_PRICE - WHOLESALE_PRICE"
    quantityOnHand column: 'quantityOnHand', defaultValue: "0"
}
}

当我尝试添加 StockItem 时,出现此错误:

Message: Validation Error(s) occurred during save():
- Field error in object 'com.waldoware.invoicer.StockItem' on field 'quantityOnHand': rejected value [null]; codes [com.waldoware.invoicer.StockItem.quantityOnHand.nullable.error.com.waldoware.invoicer.StockItem.quantityOnHand,com.waldoware.invoicer.StockItem.quantityOnHand.nullable.error.quantityOnHand,com.waldoware.invoicer.StockItem.quantityOnHand.nullable.error.java.lang.Integer,com.waldoware.invoicer.StockItem.quantityOnHand.nullable.error,stockItem.quantityOnHand.nullable.error.com.waldoware.invoicer.StockItem.quantityOnHand,stockItem.quantityOnHand.nullable.error.quantityOnHand,stockItem.quantityOnHand.nullable.error.java.lang.Integer,stockItem.quantityOnHand.nullable.error,com.waldoware.invoicer.StockItem.quantityOnHand.nullable.com.waldoware.invoicer.StockItem.quantityOnHand,com.waldoware.invoicer.StockItem.quantityOnHand.nullable.quantityOnHand,com.waldoware.invoicer.StockItem.quantityOnHand.nullable.java.lang.Integer,com.waldoware.invoicer.StockItem.quantityOnHand.nullable,stockItem.quantityOnHand.nullable.com.waldoware.invoicer.StockItem.quantityOnHand,stockItem.quantityOnHand.nullable.quantityOnHand,stockItem.quantityOnHand.nullable.java.lang.Integer,stockItem.quantityOnHand.nullable,nullable.com.waldoware.invoicer.StockItem.quantityOnHand,nullable.quantityOnHand,nullable.java.lang.Integer,nullable]; arguments [quantityOnHand,class com.waldoware.invoicer.StockItem]; default message [Property [{0}] of class [{1}] cannot be null]

显然 quantityOnHand 的默认值没有设置。我试过将默认值和一个独立的整数值放在引号中。我也试过将 quantityOnHand 设置为 nullable。这可以防止错误,但该列为空。

正如@Biswas 评论的那样,在属性定义处进行简单赋值即可解决默认值问题。

class StockItem extends DisplayableDomain {
    Integer quantityOnHand = 0
}

此外,在 OP 的情况下,使用 int 可以解决问题。像 IntegerDoubleBoolean 这样的包装器 类 默认情况下将它们的值设置为 null,尽管这两种类型都是 Groovy 中的对象。

class IntTest {
    Integer intWrapper
    int intPrimitive
}

def test = new IntTest()
println "Integer: ${test.intWrapper}"
println "int: ${test.intPrimitive}"

输出:

Integer: null
int: 0

所以这也行得通:

class StockItem extends DisplayableDomain {
    int quantityOnHand
}

当我不希望属性可以为空时,我使用原始标识符(也是 Groovy 中的对象)来避免此类错误。