hibernate - 在 Grails 服务中注入(inject) Hibernate sessionfactory

标签 hibernate grails

我正在努力使用 Hibernate只是为了在 Grails 中保存用户, 没有其他的。我找不到任何示例/教程。

我不是在寻找 GORM、脚手架等。WI 正在尝试使用 sessionFactory在我的服务中坚持 UserEntity .

        def sessionFactory
        def hibSession = sessionFactory.getCurrentSession()
        UserEntity userEntity = new UserEntity();
        userEntity.setEmail("grails")
        hibSession.save(userEntity);
        hibSession.flush()

但它说 sessionFactory 为空。

我不清楚如何访问 sessionfactory在我的服务。

请指导。

最佳答案

编辑 2 :创建一个集成测试来验证 sessionFactory 是否被正确注入(inject)。运行以下 grails 命令:
create-integration-test <package>.MyService
您可能需要删除单元测试文件 MyServiceSpec.groovy如果存在,则在 test/unit 目录中。

实现以下测试:

    class MyServiceSpec extends Specification {

    def myService

    def setup() {
    }

    def cleanup() {
    }

    void "test something"() {
        when:
        def u = myService.serviceMethod()

        then:
        u != null

    }
}

您还需要更改您的服务方法以返回用户实例以使测试工作,如下所示。

运行test-app <package.MyService -integration
这个测试通过了吗?如果没有,请提供有关您的开发环境的更多信息。

编辑 :在这种情况下,这可能无关紧要,但是您的 grails 版本/开发环境是什么?最好在提问时说明这一点。

首先,你为什么不使用 GORM?如果不使用 grails 的核心功能,我看不到有很多好处。为什么要使用sessionFactory管理 ORM 而不是 GORM?如果您只调用 new UserEntity(email:'grails').save(),GORM 会在后台执行相同的操作。 .

这引出了我的下一点:您也没有使用 Groovy 的功能。在 Groovy 中,您可以像我上面那样使用映射构造函数,也可以使用这样的 setter 方法:user.email = 'grails'.
此外,调用服务方法后, session 会自动刷新,因此您无需手动刷新它。但是,这仅适用于服务方法是事务性的——并且默认情况下它们是事务性的。

我不想阻止您使用 Grails,但恕我直言,您没有利用 Groovy 和 Grails 的强大工具,而是编写 Java、Spring 和 Hibernate。您只使用约定,例如域类、 Controller 、 View 和服务,我不知道这是否值得。但这是你的选择,至少可以说你的方法让我感到惊讶。

其次,这是您的代码的工作方式:

MyService.groovy:
@Transactional
class MyService {

    def sessionFactory

    UserEntity serviceMethod() {
        def s = sessionFactory.currentSession
        def u = new UserEntity(email:'grails')
        s.save(u)
        //or: 
        //def user = new UserEntity()
        //user.email = 'grails'
        //s.save(user)
        //or do it the Java way like in your code 

        u.id ? u : null                
    }
}
sessionFactory需要在您的服务中声明为一个字段,以便spring可以在启动时通过命名约定注入(inject)它。从您的代码来看,您应该进一步阅读 spring 和依赖注入(inject)。
你可以看看the official Spring documentation或者,要先一步一步地学习它,在 Tutorialspoint .`

关于hibernate - 在 Grails 服务中注入(inject) Hibernate sessionfactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37771850/

相关文章:

java - 使用 JPQL 从实体的 ElementCollections 中删除

Grails + 如何向日期添加月份

java - JPA Creation - Hibernate 未在平台中显示

grails - GSP中的Grails访问映射变量,在值周围带有多余的括号

grails - 如何在带有grails的Acegi上指定自定义盐?

tomcat - 如何在 tomcat 8 上部署使用 grails 3 构建的 war 应用程序?

grails - 使用条件搜索关联表

java - 比较不同格式的两个日期

java - 在另一台机器上运行 Spring Boot 应用程序

java - 与应用程序打包在一起的最轻的数据库