调用findBy时的TransientObjectException ...来自Grails中的弹性搜索的结果

时间:2016-02-19 12:39:47

标签: grails elasticsearch gorm elasticsearch-plugin

我已成功设置弹性搜索插件,我的grails项目运行grails 2.5.0。我可以搜索并获得结果。但是某些操作在结果上是不可能的,比如在一个域上调用一个通过GORM的findBy与另一个域交互的方法......

鉴于Foo类

class Foo {
   static searchable = true

   def getBars() {
      return Bar.findAllByFoo(this)
   }
}

Bar class

class Bar {
   Foo foo
   static searchable = true
}

下面的第三行将导致TransientObjectException

def result = Foo.search("Some parameter")
def foo = result.searchResults.first()
def bars = foo.bars //Fails

例外

object references an unsaved transient instance - save the transient instance before flushing: org.example.Foo. Stacktrace follows:
Message: object references an unsaved transient instance - save the transient instance before flushing: org.example.Foo
Line | Method
->>  105 | methodMissing    in org.grails.datastore.gorm.GormStaticApi

在网上搜索此问题会产生大量与GORM保存操作相关的点击,这不是我想的问题。如果对象不是从弹性搜索结果中获取的话,这非常好,为什么我认为这个问题与插件有关。

def foo = Foo.get(1)
def bars = foo.bars //Works

1 个答案:

答案 0 :(得分:0)

检查official documentation

  

要映射父/子关系,子元素必须要么   包含父元素作为组件或引用它作为组件   参考文件。必须将此组件映射为父组件   儿童元素。

     

示例:

class ParentElement {
…
}

class EmbeddingChild {
    ParentElement parentElement

    static searchable = {
        parentElement parent: true, component: true
    }
}

class ReferencingChild {
    ParentElement parentElement

    static searchable = {
        parentElement parent: true, reference: true
    }
}

还有good example at the end