我正在努力使用Hibernate只是为了在Grails中保存用户,没有别的。我找不到这个的任何示例/教程。
我不是在寻找GORM,脚手架等。我想在我的服务中使用sessionFactory
来保持UserEntity
。
def sessionFactory
def hibSession = sessionFactory.getCurrentSession()
UserEntity userEntity = new UserEntity();
userEntity.setEmail("grails")
hibSession.save(userEntity);
hibSession.flush()
但是它说sessionFactory为null。
我不清楚如何在我的服务中访问sessionfactory
。
请指导。
答案 0 :(得分:1)
编辑2 :创建集成测试以验证是否正确注入了sessionFactory。运行以下grails命令:
create-integration-test <package>.MyService
您可能必须删除测试/单元目录中的单元测试文件MyServiceSpec.groovy
(如果存在)。
实施以下测试:
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中,你可以像我上面那样使用map构造函数,也可以使用像这样的setter方法:user.email = 'grails'.
此外,在调用服务方法后,会话将自动刷新,因此您无需手动刷新它。但是,这仅适用于服务方法是事务性的 - 并且它们是默认的。
我不想阻止你使用Grails,但恕我直言,你没有利用Groovy和Grails的强大工具,而是代码Java,Spring和Hibernate。您只使用约定,例如域类,控制器,视图和服务,我不知道这是否值得。但这是你的选择,至少可以说你的方法让我感到惊讶。
其次,这是您的代码的工作方式:
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可以在启动时通过命名约定来注入它。根据您的代码判断,您应该进一步阅读弹簧和依赖注入。
您可以查看the official Spring documentation,或者首先在Tutorialspoint处逐步了解。