【问题标题】:Grails: Getting the Data Source in a normal groovy classGrails:在普通的 groovy 类中获取数据源
【发布时间】:2014-02-24 19:08:05
【问题描述】:

如何从普通的 groovy 类中访问数据源?注入不像服务那样​​起作用。

原因是我需要从 groovy 类中执行一些手动数据库调用(即:使用 groovy.sql.Sql 类的 SQL 语句),因为我正在使用旧数据库。

【问题讨论】:

    标签: sql grails groovy datasource code-injection


    【解决方案1】:

    dataSource 是一个 bean,使用时会自动注入 services。默认情况下,所有 bean 都自动连接到 grails 工件(控制器、服务等)中。在您的情况下,您使用的是 POGO,我想它会在 src/groovy 内。

    您可以将dataSource bean 显式地注入到 POGO 类中,方法是使其本身成为一个 bean

    //resources.groovy
    beans = {
        myPogo(MyPogo){
            dataSource = ref('dataSource')
        }
    }
    
    //MyPogo.groovy
    MyPogo {
        def dataSource
        ....
    }
    

    这是一项昂贵的操作。如果您已经在 POGO 中访问 applicationContextgrailsApplication,那么您不需要像上面提到的那样创建 bean。

    dataSource bean 可以直接从上下文中获取为:

    //ctx being ApplicationContext
    def dataSource = ctx.getBean('dataSource')
    
    //or if grailsApplication is available
    def dataSource = grailsApplication.mainContext.getBean('dataSource')
    

    如果您从 grails 工件调用 POGO 类方法,则使用以下方法而不是上述所有方法。例如:

    //service class
    class MyService {
       def dataSource //autowired
    
       def serviceMethod(){
           MyPogo pogo = new MyPogo()
           pogo.dataSource = dataSource //set dataSource in POGO
       }
    }
    

    【讨论】:

      【解决方案2】:

      进行手动数据库调用的简单解决方案:

      def grailsApplication
      
      def getSeqVal () {
      
          SessionFactory sessionFactory = grailsApplication.mainContext.sessionFactory
      
      
          def sql = "--INSERT QUERY HERE--"
          def query = sessionFactory.currentSession.createSQLQuery(sql);
          def result = query.list()
          return result[0]
      
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 2015-09-03
        • 2022-07-09
        相关资源
        最近更新 更多