gpt4 book ai didi

hibernate - Grails逆向工程在脚手架时显示无效列

转载 作者:行者123 更新时间:2023-12-02 15:25:31 24 4
gpt4 key购买 nike

我看到很多与 Hibernate 和逆向工程相关的帖子。但我找不到与此相关的任何内容。对不起,如果我重复已经回答并关闭,如果有人知道,请发布 URL。

我的问题是当我使用脚手架时使用逆向工程时,Grails 显示无效列。逆向工程根据现有数据库创建域类。所以我不想在逆向工程中更改数据库或自动创建的域类中的任何内容。除了编辑域类或数据库列之外,必须有一些解决方案。

错误:

....Error 
|
2015-02-04 07:52:41,004 [http-bio-8080-exec-3] ERROR util.JDBCExceptionReporter - Invalid column name 'category_id'.
Error |
2015-02-04 07:52:41,132 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver - SQLServerException occurred when processing request: [GET] /reverseEng/expense/index
Invalid column name 'category_id'.. Stacktrace follows:
Message: Invalid column name 'category_id'.
Line | Method
->> 197 | makeFromDatabaseError in com.microsoft.sqlserver.jdbc.SQLServerException
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1493 | getNextResult in com.microsoft.sqlserver.jdbc.SQLServerStatement
| 390 | doExecutePreparedStatement in com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement
| 340 | doExecute in com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd
| 4575 | execute . . . . . . . . . in com.microsoft.sqlserver.jdbc.TDSCommand
| 1400 | executeCommand in com.microsoft.sqlserver.jdbc.SQLServerConnection
| 179 | executeCommand . . . . . . in com.microsoft.sqlserver.jdbc.SQLServerStatement

代码:
Used the plugin : compile ":db-reverse-engineer:0.5.1"
Changed the hibernate to runtime ":hibernate:3.6.10.18" instead of 4

域类 - 类别
package com.reverseEng

class Category {

BigDecimal intCatId
String strCatName

static hasMany = [expenses: Expense]

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

领域类费用
package com.reverseEng

class Expense {

Double fltAmt
Date dtDate
Category category

static belongsTo = [Category]

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

Controller :
package com.reverseEng

class ExpenseController {

/*def index() { }*/
static scaffold=Expense
}

类别 Controller :
package com.reverseEng

class CategoryController {

/* def index() { }*/
static scaffold=Category
}

数据库结构:MSSQL

表类别:
intCatId numeric(19,0) Autoincrement Primary key
strCatName varchar

表费用:
intTranId int Autoincrement primary key
fltAmt Float
dtDate date
intCatId Foreign key to the Category table.

Config.grrovy 更新为
grails.plugin.reveng.packageName = 'com.reverseEng'
grails.plugin.reveng.includeTables = ['category','expense']

执行 grails db-reverse-engineer然后执行 run-app .

最佳答案

永远不要相信生成的代码。假设这个插件和其他为你生成代码的东西充其量是一个不错的节省时间,但是无论你是手动输入每个字符还是从生成的代码开始并修复它,最终结果必须是你理解和信任的工作代码。

这里的核心问题是您有一个名为 category 的属性。在 Expense class 但它没有映射配置,因此它使用默认命名方法将类和属性名称转换为表和列名称。由于它是对另一个持久类的引用,因此它的列名是通过将驼峰式属性名(在这种情况下没有内部大写字符)转换为下划线分隔的列名并添加 _id 来派生的。 ,所以它是 category_id .但是列名是intCatId ,因此您需要将其添加到 mapping堵塞。

还有一些其他问题,我会利用这个机会拥有合理的变量名称,而不是使用数据库中使用的冗余前缀 VB 样式命名。如果您的变量名称描述了它们的作用,则它们很少需要前缀或其他提示。

对于Category我会更改名称属性并添加一个 column映射,并删除显式主键属性,如 Expense并指定其列名:

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 映射结合起来,因为这两种方法具有相同的效果):
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
}
}

关于hibernate - Grails逆向工程在脚手架时显示无效列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28323532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com