【问题标题】:Using GORM in Micronaut in Grails manner以 Grails 方式在 Micronaut 中使用 GORM
【发布时间】:2019-07-22 13:02:09
【问题描述】:

没有Services 是否可以在 Micronaut 中使用 GORM?

我希望能够写一些非常直截了当的东西:

@Controller( '/my' )
class MyController {

  @Get( uri='/bundle' )
  @Transactional( readOnly = true )
  Map bundle() {
    [ domainAList:DomainA.list(), domainBList:DomainB.list() ]
  }

}

在调用动作时抛出

无法延迟初始化角色集合:com.domain.DomainA.links,无法初始化代理 - 无会话

其中linksDomainA 类中的hasMany

如果我将@Transactional 替换为DomainA.withTransaction{...},也会出现同样的异常,因为参考解析发生在操作之外并且未被任何OSIV TX 过滤器覆盖。

有什么提示吗?

【问题讨论】:

    标签: grails groovy transactions grails-orm micronaut


    【解决方案1】:

    是否可以在没有服务的情况下在 Micronaut 中使用 GORM?

    是的。 GORM 不需要服务。

    编辑

    问题与服务无关,因为 Hibernate 需要启动会话。服务可以为您管理,但不是必需的。

    https://github.com/jeffbrown/gormnoservice 上查看该项目。下面的代码不是一个好主意,但可以解决所提出的问题。

    https://github.com/jeffbrown/gormnoservice/blob/master/src/main/groovy/gormnoservice/Person.groovy

    package gormnoservice
    
    import grails.gorm.annotation.Entity
    
    @Entity
    class Person {
        String name
    }
    

    https://github.com/jeffbrown/gormnoservice/blob/4ee6d7786677f769c3a6b70eb939750271922cb5/src/main/groovy/gormnoservice/MyController.groovy

    package gormnoservice
    
    import io.micronaut.http.annotation.Controller
    import io.micronaut.http.annotation.Get
    import io.micronaut.http.annotation.Post
    import io.micronaut.http.HttpStatus
    
    
    @Controller("/my")
    class MyController {
    
        @Post('/{name}')
        Person create(String name) {
            Person p
            Person.withNewSession {
               p = new Person(name:name).save()
            }
            p
        }
    
        @Get('/')
        Map list() {
            List people
            Person.withNewSession {
                people = Person.list()
            }
            [people: people]
        }
    }
    

    有效:

    $ curl -X POST http://localhost:8080/my/Jake
    {"name":"Jake","id":1}
    $ 
    $ 
    $ curl -X POST http://localhost:8080/my/Zack
    {"name":"Zack","id":2}
    $ 
    $ 
    $ curl http://localhost:8080/my
    {"people":[{"name":"Jake","id":1},{"name":"Zack","id":2}]}
    

    【讨论】:

    • 有点离题,但是我如何根据stackoverflow.com/questions/41143475/… 使用来自外部 GORM 独立项目的域类运行 micronaut?现在我正在使用这个技巧stackoverflow.com/questions/53621770/… 来实现这一点。我可以自动将数据源与域类绑定吗?
    • 从外部独立项目中使用域类并没有什么特别之处。只要该 gorm 实体项目使用正确的依赖项进行编译,另一个项目就可以简单地表达对该 gorm 实体项目的依赖关系,然后该实体在该项目中可用。
    • 是的,行得通。我的问题是关于 Micronaut 应用程序中那些外部域类的自动初始化。现在我正在使用类似new HibernateDatastore( config, DomainA, DomainB, ... ) 的smth 明确
    • 为什么要显式创建HibernateDatestore
    • 您没有提供足够的信息来了解问题所在,如果您可以提供一对简单的项目来证明您遇到的问题,那将会很有帮助。我的第一个猜测是,您的实体不在您的 Application 类所在的任何包的子包中,如果是这种情况,您将必须配置包以通过 ApplicationContextBuilder 进行扫描。
    【解决方案2】:

    我认为要解决您的问题,应该避免延迟初始化。建议在将 db 对象输出到 JSON 之前将其映射到 DTO。

    GORM 可以在 Micronaut 中使用。

    我已经写了一篇关于它的文章。

    https://medium.com/@S1lv3rd3m0n/micronaut-groovy-with-gorm-3a2d0b12e86b

    【讨论】:

    • 延迟初始化并不是真正的问题。在没有打开会话的情况下使用 Hibernate 是个问题。即使与另一个实体没有关系并且所有内容都被急切地获取,同样的问题仍然存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多