绝不相信生成的代码。假设这个插件和为你生成代码的任何其他东西充其量只是一个不错的节省时间,但无论你是手工输入每个字符还是从生成的代码开始并修复它,最终结果必须是你理解和信任的工作代码。
这里的核心问题是你有一个名为的属性 category 在里面 Expense class但它没有映射配置,因此它使用默认命名方法将类和属性名转换为表名和列名。由于它是对另一个持久化类的引用,因此通过将camel-case属性名称(在本例中没有内部大写字符)转换为下划线分隔的列名并添加,来派生其列名。 _id , 所以这是 category_id 。但列名是 intCatId ,所以你需要将其添加到 mapping 块。
category
Expense
_id
category_id
intCatId
mapping
还有一些其他问题,我会利用机会获得合理的变量名称,而不是使用数据库中使用的冗余前缀VB样式命名。如果您的变量名描述了他们的行为,他们很少需要添加前缀或其他提示。
为了 Category class我将更改name属性并添加一个 column 映射,并删除显式主键属性,如 Expense 并只指定其列名:
Category
column
class Category { String name static hasMany = [expenses: Expense] static mapping = { id column: "intCatId", generator: "assigned" name column: 'strCatName' version false } }
添加映射 category 在 Expense 指定 intCatId 代替 category_id ,并喜欢 Category 我将日期和数量属性设为人类可读的(并结合显式 category 与...相关的领域 belongsTo 因为两种方法都具有相同的效果):
belongsTo
class Expense { Double amount Date date static belongsTo = [category: Category] static mapping = { id column: "intTranId", generator: "assigned" amount column: 'fltAmt' date column: 'dtDate' category column: 'intCatId' version false } }