映射旧表和多个hasMany关联

时间:2012-03-08 15:23:59

标签: grails grails-2.0

我正在尝试将一些旧的(现有)表映射到我的域对象。 到目前为止,通过单个1:n映射,它运行得相当好。我有一个ITEM或YFS_ITEM表,它映射到Item_Alias(YFS_ITEM_ALIAS)表(OmsItemAlias)。我的对象外观如下所示。

当我在OmsItem上创建或执行查找时,我确实找回了OmsItemAlias对象。当我因为某种原因查找inventoryItems时,问题就出现了,因为我知道数据库中存在项目,所以它总是为0。

package com.fheg.orderrouter

class OmsItem {

String id
String item
String description
Double unitCost
String defaultProductClass
String organizationCode

static hasMany = [ aliases : OmsItemAlias,inventoryItems : InventoryItem]


static constraints = {
  id(blank: false, nullable: false)
  item(nullable: false)
  description(nullable: false)
  unitCost(nullable: false)
  defaultProductClass(nullable: false)
  organizationCode(nullable: false)
}


static mapping = {
  table 'YFS_ITEM'
  version false

  id  column:'ITEM_KEY', generator:'assigned', sqlType: 'char(24)'
  item column: 'ITEM_ID', sqlType: 'char(40)'
  description(column: 'DESCRIPTION', sqlType: 'varchar2(500)')
  unitCost column: 'UNIT_COST', sqlType: 'NUMBER(19,6)'
  defaultProductClass column: 'DEFAULT_PRODUCT_CLASS',sqlType: 'char(10)'
  organizationCode column: 'ORGANIZATION_CODE', sqlType: 'char(24)'
  aliases(sort:'aliasName', fetch: 'eager')
  inventoryItems( fetch: 'eager')
 }
}

以下是InventoryItem的代码。

package com.fheg.orderrouter

class InventoryItem {

String id
String organizationCode
String uom
String productClass

static belongsTo = [ invItem : OmsItem ]
static hasMany = [ inventorySupply : InventorySupply]



static constraints = {
    id(blank: false, nullable: false)
    organizationCode(nullable: false)
//        invItem(nullable: false)
    uom(nullable: false)
    productClass(nullable: false)
}



static mapping = {
    table 'YFS_INVENTORY_ITEM'
    version false

    id  column:'INVENTORY_ITEM_KEY', generator:'assigned'
    invItem column: 'ITEM_ID'
    organizationCode column: 'ORGANIZATION_CODE'
    uom column: 'UOM'
    productClass column:'PRODUCT_CLASS'


   }

}

对于belongsTo / hasMany,我很确定我做错了什么。它适用于别名,但对inventoryItems没有任何作用。任何建议都表示赞赏!

1 个答案:

答案 0 :(得分:0)

我能看到的一些事情。

我认为fetch: 'eager'不是有效的获取类型:see Fetch

您可能需要的是:lazy: falsesee Fetching

现在我也认为你可能想要加入而不是选择,所以也许(我不能保证完全正确,但我希望你能走上正轨):

inventoryItems column: 'ITEM_ID', ignoreNotFound: true, fetch: 'join'

并在InventoryItem映射中:

invItem column: 'ITEM_ID'

现在可以打开Hibernate日志以查看SQL级别的内容

在Config.groovy中找到log4j设置并添加:

trace 'org.hibernate.SQL'

另见FAQ

最重要的是,您可以在per datasource设置上启用SQL日志记录

...或者甚至在必要时尝试P6 plugin,这样可以为您提供更多关于生成SQL的提示

对不起参考过度杀伤