我正在努力使用 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/