前言
新手在学到Hibernate和Spring整合的时候,如果没有良好的教程例子,很容易不知所措,这时候就会本能地去网络上寻找相关的例子。但是,网络上的案例层次不一,有的非常老旧,有的框架又整合了很多,少有切合自身发展阶段的例子,让人看得头大。这里我,简单地介绍下LocalSessionFactoryBean及Hibernate Dao层开发的一些内容。希望能给予需要的人一些帮助。
正文
网上的一些案例在Spring配置文件中用到了LocalSessionFactoryBean。也有人可能没注意到,只看到了这个bean的id是sessionFactory,以为它就是SessionFatory。当初,我也以为,它可能是某个SessionFactory的具体实现类,并没有在意。后来仔细看的时候才发现不是的。我们先来看下这张图
所属文件:spring-dao.xml
这是我做课程设计的spring配置文件的一部分,从上面的图中,第一眼,可以看到引用类的路径是org.springframework.orm...可以看出,这里我们需要引入spring-orm这个包,这个包可以通过maven引入。另外可以看出我注入了配置好的dataSource (数据源),实际上就是就是数据库连接池,用来管理连接的,目前比较流行的是Druid。configLocation 指定了配置文件的地址,其会加载配置文件里的内容生成真正的SessionFactory。如图:
所属文件:hibernate.cfg.xml
另外,还配置了扫描包的路径。我们知道,每次生成SessionFactory的时候,Hibernate会对数据库表做一定的更新。那这个更新必须是根据POJO来的。我自己在写SSH项目的时候都是编写POJO通过Hibernate映射来建表的(据说也有从已有数据库反过来建POJO的,不过还没用到过),一般没有经过完备的设计就动手做了,所以,POJO可能在早期会经常改动,数据库表也要对应地做更改。话说回来,既然要映射,就必须让Hibernate知道,哪些是要映射到数据库表的POJO。所以要指定扫描哪个包,Spring 的package-scan会识别标有注释@Component、@Service、@Repository、@Entity...的类,配置成bean注入Ioc容器,等到要用的时候,@Autowired。不过这里Hibernate只会识别@Entity的类。映射到数据库表。
我们再回到LocalSessionFactoryBean,现在我们可以知道,它并不是sessionFactory,而是注入了sessionFactory。但是,为什么它的id是sessionFactory,我们@Autowired的时候引入的是它,而得到的也确确实实是sessionFactory。如图:
所属文件:BaseDaoImpl.java
其实是这样的,因为LocalSessionFactoryBean 实现了FactoryBean的接口,实现了这个接口的类有个特点,就是引用这个类的时候,spring返回的不是这个类本身,而是会去调用FactoryBean接口的getObject()这个方法来获取Bean,而LocalSessionFactoryBean的getObject()方法返回的正是它的SessionFactory。
原文地址:https://www.cnblogs.com/longfurcat/p/8278181.html