与具有字符串 id 列的域的 Grails 多对多关系
Grails Many-to-Many Relationship with a domain which has String id column
如何与 id 列为字符串的域创建多对多关系?
UnitObj 值示例为:'0'、'1'、'001'、'002'、'1234' 等。
因此,由于这些值,我无法创建 id 列(UnitObj 中的值列)long 或 integer。
如有任何帮助,我们将不胜感激。
以下是域:
class UnitObj {
String value
String unit
UnitObj parent
static constraints = {
value(unique: true, nullable: false)
unit(nullable: false)
parent(nullable: true)
}
static mapping = {
version false
id generator: 'assigned', name: "value", type: 'string'
table name: "unit_obj", schema: "db"
}
}
这是我要更改的那个。
class UserUnitObj {
User user
String unit //This should be UnitObj not string
String subUnit //This should be UnitObj not string
static constraints = {
user(nullable: false)
unit(nullable: false)
subUnit(nullable: true)
}
static mapping = {
version false
table name: "user_unit_obj", schema: "db"
}
}
---------编辑--------
如果我将字符串更改为 UnitObj,在尝试创建 UserUnitObj 时它会给出:
UserUnitObj u = new UserUnitObj()
u.user = User.get(userUnitJson.user)
u.unit = UnitObj.findByValue(userUnitJson.unit.id.toString())
u.subUnit = UnitObj.findByValue(userUnitJson.subUnit.id.toString())
u.save(flush: true)
这是错误:
2016-12-05 17:51:14,305 [http-bio-8080-exec-4] ERROR spi.SqlExceptionHelper - ERROR: column "sub_unit_id" is of type bigint but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 79
Error |
org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not execute statement; bad SQL grammar [n/a]; nested exception is org.postgresql.util.PSQLException: ERROR: column "sub_unit_id" is of type bigint but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
问题不在于您使用 String
作为分配的 ID。问题是因为您没有告诉 UserUnitObj
您正在使用 value
而不是 id
。默认情况下,GORM 总是将 FK
分配给名为 id
的列。如果你做了不同的事情,你必须告诉它。有关如何执行此操作的说明,请参阅 documentation here。
如何与 id 列为字符串的域创建多对多关系?
UnitObj 值示例为:'0'、'1'、'001'、'002'、'1234' 等。 因此,由于这些值,我无法创建 id 列(UnitObj 中的值列)long 或 integer。
如有任何帮助,我们将不胜感激。 以下是域:
class UnitObj {
String value
String unit
UnitObj parent
static constraints = {
value(unique: true, nullable: false)
unit(nullable: false)
parent(nullable: true)
}
static mapping = {
version false
id generator: 'assigned', name: "value", type: 'string'
table name: "unit_obj", schema: "db"
}
}
这是我要更改的那个。
class UserUnitObj {
User user
String unit //This should be UnitObj not string
String subUnit //This should be UnitObj not string
static constraints = {
user(nullable: false)
unit(nullable: false)
subUnit(nullable: true)
}
static mapping = {
version false
table name: "user_unit_obj", schema: "db"
}
}
---------编辑--------
如果我将字符串更改为 UnitObj,在尝试创建 UserUnitObj 时它会给出:
UserUnitObj u = new UserUnitObj()
u.user = User.get(userUnitJson.user)
u.unit = UnitObj.findByValue(userUnitJson.unit.id.toString())
u.subUnit = UnitObj.findByValue(userUnitJson.subUnit.id.toString())
u.save(flush: true)
这是错误:
2016-12-05 17:51:14,305 [http-bio-8080-exec-4] ERROR spi.SqlExceptionHelper - ERROR: column "sub_unit_id" is of type bigint but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 79
Error |
org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not execute statement; bad SQL grammar [n/a]; nested exception is org.postgresql.util.PSQLException: ERROR: column "sub_unit_id" is of type bigint but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
问题不在于您使用 String
作为分配的 ID。问题是因为您没有告诉 UserUnitObj
您正在使用 value
而不是 id
。默认情况下,GORM 总是将 FK
分配给名为 id
的列。如果你做了不同的事情,你必须告诉它。有关如何执行此操作的说明,请参阅 documentation here。