【问题标题】:spring web MVC and hibernate setup - how to get a hold of your hibernate bean?spring web MVC 和休眠设置 - 如何获取您的休眠 bean?
【发布时间】:2011-05-01 02:11:48
【问题描述】:

我是 Spring 和 bean 概念的新手,如果问得很清楚,很抱歉。 我已经建立了一个 Java 项目并使用 Hibernate 框架来连接数据库(在 eclipse 上使用 hibernate 工具,真的推荐顺便说一句)。 我的基本设置如下:

  1. 一些休眠 pojo(由休眠工具生成),
  2. 休眠映射文件(hbm.xml 文件)。
  3. 配置是在 hibernate.cfg.xml 文件中设置的,该文件位于我的包根目录下。
  4. 我最初设置了一个从我的 sessionFactory 获取会话的 HibernateUtils 类。
  5. 一些充当 Dao 的类 - 使用 pojos 和 hibernateUtils 创建查询以获取会话。

这与 hibernate 强大的框架配合得很好。然后我迁移到项目到 Spring MVC。从我阅读的各种教程中,我了解到需要进行一些更改才能使事情再次正常运行。主要变化是 Spring FW 现在自己加载 bean,因此如下:

  1. pojo 没有改变,hbm.xml 文件也没有改变
  2. 不再在 hibernate.cfg.xml 中设置配置 - 一旦我在 XML 文件中声明它,Spring MVC FW 就会加载它自己的 LocalSessionFactoryBean(Spring 搜索 xmls 作为初始化过程的一部分)。因此,我创建了一个名为 spring-hibernate.xml 的单独 xml 文件,其中包含 DB 定义、会话工厂 bean 和一个休眠模板。为了完成它,xml文件还声明了Dao和hbm文件的位置。
  3. 在 xml 中配置了 hibernate 模板,存在 bean 注入,因此我更改了 Dao 文件以将 getter/setter 添加到 hibernate 模板属性中。然后使用这个 - Dao 类可以创建数据库查询。

所有这些配置工作正常,我可以让 Spring FW 初始化 Dao 类(我放了一个 sysout 只是为了确认 Dao 类在 MVC 启动期间注入了休眠模板)。现在我的问题是 - 如何访问创建的 Dao bean 实例?

在我的逻辑部分,我得到了 bean,如下所示:

ClassPathXmlApplicationContext appContex = new ClassPathXmlApplicationContext(new String[] {"spring-hibernate.xml"});

UserUIDDao userUIDDao= (UserUIDDao)appContext.getBean("UserUIDDao");

问题是 - 这是对新创建的 bean 的新引用,而不是在 spring MVC 启动期间创建的那个。

所以我的问题是:如何获取由 Spring init 进程创建的原始 bean?并且 - 我的设置是否正确?

【问题讨论】:

    标签: java hibernate spring-mvc


    【解决方案1】:

    pojo 没有改变,hbm.xml 文件也没有改变

    没错。

    配置不再设置在 hibernate.cfg.xml - 一旦我在 XML 文件中声明它,Spring MVC FW 加载它自己的 LocalSessionFactoryBean(Spring 搜索 xmls 作为初始化过程的一部分)。

    您可以选择使用 Spring 来配置 Hibernate(但您可以保留您的 hibernate.cfg.xml)。

    所以我创建了一个名为 spring-hibernate.xml 的单独 xml 文件,其中包含 DB 定义、会话工厂 bean 和一个休眠模板。为了完成它,xml 文件还声明了 Dao 和 hbm 文件的位置。在 xml 中配置了休眠模板,有一个 bean 注入,因此我更改了 Dao 文件以将 getter/setter 添加到休眠模板属性。然后使用这个 - Dao 类可以创建数据库查询。

    使用 Spring 的 HibernateTemplate 是一种选择,但您也可以不使用模板,只需注入 Hibernate 的 SessionFactory 并使用 sessionFactory.getCurrentSession()

    这实际上是新项目官方推荐的方法,查看So should you still use Spring's HibernateTemplate and/or JpaTemplate??HibernateTemplate的javadoc。

    现在我的问题是 - 如何访问创建的 Dao bean 实例?

    您将它注入到需要的地方(通常是在您的服务中)。

    在我的逻辑部分,我按如下方式获得了 bean (...)

    不,不要这样做。这种“服务定位器方法”实际上打败了像 Spring 这样的 DI 容器的要点。配置 Spring 在需要的地方注入你的 DAO。

    【讨论】:

    • 感谢您的回答,也感谢您的文章 - 很好。我正在尝试遵循它,但在我的 xml 文件中添加这一行时遇到了一个问题: 我缺少正确的 JAR - 它是哪一个(我正在使用 Spring 3.0.5)
    • 顺便说一句 - 我发现 jar spring-tx.jar 解决了问题,但这是来自旧发行版 (2.5.6).. 是要添加的正确版本吗??
    • @jazzcool 好吧,您应该在 string-tx 3.0 中找到它(如果您使用的是 spring 3.0,请使用同一版本的依赖项)。
    • 是的 -it org.springframework.transaction-3.0.5.RELEASE.jar(第 3 版中不再有 spring-tx)。
    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2015-02-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多