Grails GORM数据库映射为单向1:n关系

时间:2012-12-17 15:47:53

标签: hibernate grails mapping gorm cardinality

我目前正在尝试基于遗留的MySQL数据库创建一个新的Grails应用程序。应用程序应该只读取信息。具体的DB模式为特定的域类使用每个类层次结构的表,以及用于向这些类添加新的所需信息的属性类。

目前我无法检索transation的属性信息。没有例外,但我也无法访问字段properties。我可能遇到的一个问题是,properties这个词是域字段Grails的关键字。但由于特定的遗留表命名,我需要使用它。

旧表名为transactiontransaction_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}"
}
   }

1 个答案:

答案 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()
}
}