我目前正在尝试基于遗留的MySQL数据库创建一个新的Grails应用程序。应用程序应该只读取信息。具体的DB模式为特定的域类使用每个类层次结构的表,以及用于向这些类添加新的所需信息的属性类。
目前我无法检索transation
的属性信息。没有例外,但我也无法访问字段properties
。我可能遇到的一个问题是,properties
这个词是域字段Grails的关键字。但由于特定的遗留表命名,我需要使用它。
旧表名为transaction
和transaction_properties
。一个transcation
可以有多个transaction_properties
。关联是通过transaction_id
表中的密钥transaction_properties
完成的。
表交易
id bigint(20)
transaction_id varchar(255) (bad naming here, transaction_id is used to store additional meta information)
表 transaction_properties
transaction_id bigint(20) -> referencing to transation.id
property_value varchar(255)
property_key varchar(32)
etc.
域类交易
class Transaction {
static hasMany = [properties : TransactionProperty]
static constraints = {
// transactionProperty unique: true
}
static mapping = {
table "transaction"
version false
columns {
id column : "id"
beginDate column : "start"
endDate column : "end"
type column : "DTYPE"
amount column : "total_amount"
metaId column : "transaction_id"
purchase column : "purchase_id"
service column : "service_id"
origin column : "origin_id"
properties column : "id"
}
}
Long id
Date beginDate
Date endDate
String type
String amount
String metaId
Purchase purchase
Origin origin
Service service
etc.
}
域类 TransactionProperty
class TransactionProperty {
static mapping = {
table "transaction_properties"
version false
columns {
id name : "transaction_id"
key column : "property_key"
value column : "property_value"
}
}
String value
String key
Long id
def asString(){
return "${key} = ${value}"
}
}
答案 0 :(得分:0)
你的代码很乱。
您需要在TransactionProperty域类中添加static belongsTo = [transaction: Transaction]
。这将告诉grails使用该表中的外键而不是想要一个连接表。
您也无需在任一表格中指定Long id
。默认情况下,这是在Grails中完成的。
在Transaction域类中删除这些列映射:
id column : "id"
properties column : "id"
在TransactionProperty中,它在技术上没有主键(除非你将它隐藏起来),因此你必须使用property_key和property_value的复合键。
id name : "transaction_id"
应该是:
id composite: ['key', 'value']
请阅读此处的其他要求:http://grails.org/doc/latest/guide/GORM.html#5.5.2.5%20Composite%20Primary%20Keys
我最好的修复课程的尝试:
交易:
class Transaction {
static hasMany = [properties : TransactionProperty]
static constraints = {
}
static mapping = {
table "transaction"
version false
columns {
beginDate column : "start"
endDate column : "end"
type column : "DTYPE"
amount column : "total_amount"
metaId column : "transaction_id"
purchase column : "purchase_id"
service column : "service_id"
origin column : "origin_id"
}
}
Date beginDate
Date endDate
String type
String amount
String metaId
Purchase purchase
Origin origin
Service service
}
TransactionProperty:
import org.apache.commons.lang.builder.HashCodeBuilder
class TransactionProperty implements Serializable {
static belongsTo = [transaction: Transaction]
static mapping = {
table "transaction_properties"
version false
columns {
key column : "property_key"
value column : "property_value"
}
}
String value
String key
def toString(){
return "${key} = ${value}"
}
boolean equals(other) {
if (!(other instanceof TransactionProperty)) {
return false
}
other.key == key && other.value == value
}
int hashCode() {
def builder = new HashCodeBuilder()
builder.append key
builder.append value
builder.toHashCode()
}
}