首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单向1:n关系的Grails数据库映射

单向1:n关系的Grails数据库映射
EN

Stack Overflow用户
提问于 2012-12-17 15:47:53
回答 1查看 1.3K关注 0票数 1

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

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

遗留表名为transactiontransaction_properties。一个transcation可以有多个transaction_properties。关联是通过transaction_properties表中的键transaction_properties完成的。

事务

代码语言:javascript
复制
id  bigint(20)
transaction_id  varchar(255) (bad naming here, transaction_id is used to store additional meta information)

transaction_properties

代码语言:javascript
复制
transaction_id  bigint(20) -> referencing to transation.id
property_value  varchar(255)
property_key    varchar(32)
etc.

域类事务

代码语言:javascript
复制
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

代码语言:javascript
复制
  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}"
}
   }
EN

回答 1

Stack Overflow用户

发布于 2012-12-17 20:13:13

你的代码一团糟。

您需要在static belongsTo = [transaction: Transaction]域类中添加一个TransactionProperty。这将告诉grails使用该表中的外键,而不是想要一个联接表。

您也不需要在两个表中指定Long id。这在Grails中是默认的。

在事务域类中也删除这些列映射:

代码语言:javascript
复制
id column : "id"
properties column : "id"

在TransactionProperty中,它在技术上没有主键(除非您对我们隐藏它),所以您必须使用property_key和property_value的复合键。

代码语言:javascript
复制
id name : "transaction_id"

应:

代码语言:javascript
复制
id composite: ['key', 'value']

请阅读此处的附加要求:http://grails.org/doc/latest/guide/GORM.html#5.5.2.5%20Composite%20Primary%20Keys

我最好的办法是修你的课:

交易:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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()
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13917366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档