springhibernate源码
❶ hibernate和spring优缺点以及如何改进
Spring3.1去掉了HibernateDaoSupport类。hibernate4需要通过getCurrentSession()获取session。并且设置org.springframework.orm.hibernate4.SpringSessionContext(在hibernate3的时候是thread和jta)。缓存设置改为net.sf.ehcache.hibernate.EhCacheProviderorg.hibernate.cache.ehcache.EhCacheRegionFactorySpring对hibernate的事务管理,不论是注解方式还是配置文件方式统一改为:getCurrentSession()事务会自动关闭,所以在有所jsp页面查询数据都会关闭session。要想在jsp查询数据库需要加入:org.springframework.orm.hibernate4.support.OpenSessionInViewFilter过滤器。Hibernate分页出现需要设置hibernate结果集滚动false【引自9336703】
角求第三边;已知三边求角。) 用反三角
❷ spring+hibernate 事务配置需要依赖什么jar包
//struts2核心包
2. struts2-core-2.0.11.2.jar
3. //struts2必须 (strust2 webwork的升级,webwork核心包)
4. xwork-2.0.5.jar
5. //struts2必须
6. freemarker-2.3.8.jar
7. //struts2必须
8. ognl-2.6.11.jar
9. //struts2整合Spring插件
10. struts2-spring-plugin-2.0.11.2.jar
11. //Spring整体包
12. spring.jar
13. //Hibernate必须使用,注意此包是包含全部的。
14. hibernate3.jar
15. //如果使用C3P0数据源实现数据库连接
16. c3p0-0.9.0.4.jar
17. //MysqlJDBC驱动
18. mysql-connector.jar
19. //如果不用,启动时不会出错,但使用Dwr时,会抛出异常:java.lang.NoClassDefFoundError: antlr/ANTLRException
20. antlr-2.7.2.jar
21. //如果不用此包,在启动时会抛出: nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
22. asm.jar
23. //如果不用此包,在启动时抛出:nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
24. cglib-2.1.3.jar
25. //如果不用此包,在启动时抛出:nested exception is java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap
26. commons-collections-3.1.jar
27. //这个似乎可以不用的 (用于上传下载)
28. commons-fileupload-1.2.1.jar
29. //这个就不用说啦,几乎所有框架都要使用的
30. commons-logging-1.0.4.jar
31. //如果不用此包会抛出:java.lang.NoClassDefFoundError:org/dom4j/DocumentException
32. dom4j-1.6.1.jar
33. //dwr必须
34. dwr.jar
35. //不用此包,在启动时抛出:java.lang.NoClassDefFoundError:javax/transaction/TransactionManager
36. jta.jar
37. //如果想用junit测试,必须。
38. junit-4.4.jar
❸ spring和hibernate整合是,不联网就报错,一链接网络,就可以,求高手解答
呵呵,我比较确定的猜跟你的中文路径有关。
log中前面是D:\学习工具,后面hibernate解析就变成乱码。file:/D:/%e5%ad%a6%e4%b9%a0%e5%b7%a5%e5%85%b7/Eclipse/eclipse/JAVA-HOME/spring_hibernate_1/bin/hibernate.cfg.xml
明显hibernate没有识别转义的中文。可能在联网环境中 ,这个file:/D:/%e5%ad%a6%e4%b9%a0%e5%b7%a5%e5%85%b7能被转义解析,才能被识别。
经验总结,无论如何不要使用中文或有空格的路径环境。
❹ spring+struts+hibernate做的项目在控制台不输出SQL语句
<!-- SessionFactory -->
<bean id="SessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dbSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/lovo/epet/po/PetInfoPO.hbm.xml</value>
</list>
</property>
</bean>
检查下你配置的位置是否正确吧
❺ 关于spring整合hibernate的时候自动创建表的问题
<prop key="hibernate.hbm2ddl.auto">update</prop>
漏了"hibernate",若没写全会被框架认为没配置,所以不会导出schema;
关于update和create:
(1)update 但schema发生改变时进行更新,比如添加字段,保留原有数据;
(2)create 每次运行重新创建schema,如果表存在,先删除再创建,原有数据丢失;
update也会创建表,以下是配置>update<执行的代码(hibernate的源码):
if ( table.isPhysicalTable() ) {
TableMetadata tableInfo = databaseMetadata.getTableMetadata(
table.getName(),
( table.getSchema() == null ) ? defaultSchema : table.getSchema(),
( table.getCatalog() == null ) ? defaultCatalog : table.getCatalog(), table.isQuoted()
);
if ( tableInfo == null ) {
script.add(
table.sqlCreateString(
dialect,
mapping,
defaultCatalog, defaultSchema
)
);
}
else {
Iterator<String> subiter = table.sqlAlterStrings(
dialect,
mapping,
tableInfo,
defaultCatalog,
defaultSchema
);
while ( subiter.hasNext() ) {
script.add( subiter.next() );
}
}
Iterator<String> comments = table.sqlCommentStrings( dialect, defaultCatalog, defaultSchema );
while ( comments.hasNext() ) {
script.add( comments.next() );
}
}
}
表若不存在,也会被创建.
❻ spring整合hibernate的事务一直错误
SaUserDAO user=(SaUserDAO)context.getBean("userDAOProxy");
context.getBean("userDAOProxy"); 是说从spring环境context中拿出id=userDAOProxy对象.再把这个对象强制转换成SaUserDAO.
你改成
SaUserDAO user=(SaUserDAO)context.getBean("SaUserDAO");
你把userDAOProxy对象强转成SaUserDAO,这样行不?
关键是要明白spring做了什么
你的配置文件sessionFactory有没有进行配置
SPRING就是一个IOC容器,简单来讲我们平常一般是NEW一个对象.
有了SPRING后,将对象配置在SPRING后,我们就可以从SPRING的容器里面拿出那些对象了直接用.也就是所谓的注入.
比如说:你在A类中,要调用B类的方法时,通常是new一个B的实例.
用SPRING的话,只用在A中加一个属性 B b;然后在配置文件中将A的属性b进行配置就可以了.
<bean id="b" class="B">
<bean id="a" class="wgh.db.A">
<property name="b">
<ref bean="b" />这里的b就是上面的id=b的那个值
</property>
</bean>
关于SPRING的代理
AOP代理
Spring缺省使用J2SE 动态代理(dynamic proxies)来作为AOP的代理。 这样任何接口(或者接口集)都可以被代理。
Spring也可以使用CGLIB代理. 对于需要代理类而不是代理接口的时候CGLIB代理是很有必要的。如果一个业务对象并没有实现一个接口,默认就会使用CGLIB。
简单来讲,你的类没有实现接口就得强制使用CGLIB来代理.类实现了接口默认采用JDK的动态代理机制实现AOP.
强制使用CGLIB生成代理.
1在spring配置文件中加入
<aop:aspectj-autoproxy proxy-target-class="true"/>
2 加入CGLIB库
spring/lib/cglib/*.jar
spring对事务的管理也就是AOP了
推荐你一个不错的视频
http://www.verycd.com/topics/93279/
我复制一个我学习时用到的配置文件
Spring与hibernate的集成
要控制事务,就得要拿到hibernate的session. hibernate的session获得方式:sessionfactory.sessionfactory的创建configuration,configuration的获得就由配置文件了.Spring整合Hibernate主要是对hibernate的Session进行管理,包含Session的创建、提交、关闭的整个生命周期。此处的session可以看作是一个connection.
声明式事务的配置
1配置sessionfactory
2配置事务管理器
3配置事务的传播特性
4配置哪些哪些方法使用事务
<!--配置sessionfactory -->
配置sessionFactory,让spring来创建Session。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name=" configLocation ">
<value>classpath:hibernate.cfg.xml</value>hibernate的配置文件
</property>
</bean>
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"//只适合xml方式
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean//兼容注解
<!-- 配置事务管理器 -->
把sessionFactory拿过来放到事务管理器里. 创建了一个id为transactionManager的事务管理器,它匹配一个session工厂,<ref bean="sessionFactory"/>这个sessionFactory是指session工厂的ID。
<bean
id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="beanFactory" ref=” sessionFactory”/>
</bean>
<!-- 配置事务的传播特性 -->
这里创建了一个advice(通知),对事务管理器进行事务设置,这里意思是指,对于以save、del、update开头的方法应用事务。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置哪些哪些方法使用事务 -->
配置的作用是把我们上面创建的advice应用到具体的类中。以下代码的意思指,给包com.spring下的所有类的所有方法应用allManagerMethod()方法.
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.spring.*.*(..))"/>com.spring包下所有的类所有的方法
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>advisor可以理解为一个aspect,一个aspect一般有pointcut,advice.
</aop:config>
你学习这个最好弄懂SPRING的原理
IOC,AOP这些概念原理什么的
❼ 如何学习hibernate源码
我来分享一下查看源码的方法:
查看源码的首要任务是要有一款上手的工具,这里用的是 IDEA。IDEA 的功能比较强大,包括 查看类结构图,debug。这两个是查看源码的关键功能。
查看源码可以静态查看和动态查看,静态查看的方法是查看类图,还有 ALT + f7 查看方法在哪里被调用或者类在哪里被调用。在看 spring 源码的时候就是用这种方法,不过这种方法对阅读者的要求比较高,包括要了解这个方法的执行,设计模式的理解,以及框架是如何配置这个类的。第二种方法是 debug。debug 方法是后来才发现的一个重要的 查看源码的方法,要点是掌握执行栈,就能掌握整个执行流程。比如这个是在debug hibernate 源码的时候的截图,可以看到这个执行栈非常深,从 spring-data-jpa 到 hibernate 中间经过好几层的代理,主要完成一些适配,事务,拦截器等等操作,然后再到 hibernate 核心代码,最后就是 jdbc 的 statement。方法栈中的每一个方法都是可以查看的,里面的变量有时候是代理了好几层,所以要 F7 进去才能看到真正的执行类。
上面是简单的简述 mybatis 的 cache 机制的源码,真正想让读者明白的是,debug 如何查看源码,查看源码需要抓住一个主题,不然在阅读庞大的框架的时候会找不着北。
所以,阅读源码需要掌握工具使用,debug, 查看类图,查看方法在哪里调用,软知识是要掌握设计模式,对框架的概念有了解。
❽ struts2+spring2.5+hibernate3.0整合问题
高水平、高质量的软件出来。怎样是高水平、高质量的软件?它应当是易于维护、易于适应变更、可重用性好的一个系统。如何做到这一点呢?答案当然是“低耦合、高内聚”了。低耦合就是软件在构造的时候,各个模块、各个功能、各个类都不会过度依赖于它周围的环境。只有这样,才能使我们的模块(功能、类)在周围发生变更时不受影响,做到易于维护和易于适应变更。正因为如此,也使它更易于重用到其它功能类似的环境中,提高了重用性。高内聚则使软件中的各个模块(功能、类)能够各尽其能而又充分合作,也就是对于软件问题空间中需求的各个功能,系统可以合理地把它分配给各个模块(功能、类)来共同完成,而不是一个或几个八面玲珑、包打天下的超级类一个人完成。而对于该系统中的某一个模块(功能、类),具有自己高度相关的职责,即该职责中的几个任务是高度相关的。每一个模块(功能、类)都决不去完成与自己无关职责的任务。
那么怎样能构造一个低耦合、高内聚的系统能,时下最流行的框架结构之一的struts+spring+hibernate为我们提供了方便。使用struts我们可以应用MVC模型,使页面展现与业务逻辑分离,做到了页面展现与业务逻辑的低耦合。当我们的页面展现需要变更时,我们只需要修改我们的页面,而不影响我们的业务逻辑;同样,我们的业务逻辑需要变更的时候,我们只需要修改我们的java程序,与我们的页面无关。使用spring我们运用IoC(反向控制),降低了业务逻辑中各个类的相互依赖。假如类A因为需要功能F而调用类B,在通常的情况下类A需要引用类B,因而类A就依赖于类B了,也就是说当类B不存在的时候类A就无法使用了。使用了IoC,类A调用的仅仅是实现了功能F的接口的某个类,这个类可能是类B,也可能是另一个类C,由spring的配置文件来决定。这样,类A就不再依赖于类B了,耦合度降低,重用性提高了。使用hibernate则是使我们的业务逻辑与数据持久化分离,也就是与将数据存储到数据库的操作分离。我们在业务逻辑中只需要将数据放到值对象中,然后交给hibernate,或者从hibernate那里得到值对象。至于用Oracle、MySQL还是SQL Server,如何执行的操作,与我无关。
然而我要说的是,即使我们使用了struts+spring+hibernate框架构建我们的软件,就可以做到“低耦合、高内聚”了吗?我认为这是远远不够的!我认为我们在使用struts+spring+hibernate框架的时候常常会有以下几个问题值得改进。
分析与决策1. 编写DAO的时候不要直接去使用hibernate或spring对hibernate的支持。
现在我们在编写DAO的时候普遍都是直接继承spring对hibernate的封装类HibernateDaoSupport,然后使用该类提供的诸如saveOrUpdate(), saveOrUpdateCopy(), find()等等。另外,在使用excute()方法实现一些更复杂的hibernate功能的时候还会使用hibernate的类,诸如Query, Session, Type等。这样直接使用spring和hibernate的类存在的问题在于,你的代码将不得不依赖与spring和hibernate的某个版本。比如说,现在hibernate3出来了,改动挺大,实际上最要命的是包结构,hibernate2的包结构是net.sf.hibernate.*,然而hibernate3是org.hibernate.*。同样,spring为了支持hibernate3,包名也改为org.springframework.orm.hibernate3.*。假如,你现在新开发一个项目,这没什么关系,如果是升级一个项目问题就来了。如果你希望将你的一个项目从hibernate2升级为hibernate3,你不得不修改DAO中所有对hibernate和spring-hibernate的引用。如果你的代码中出现hibernate2与hibernate3不兼容的方法和类,比如saveOrUpdateCopy()(在hibernate3中已经没有了),你还将不得不改写。那么你可能会说,我不会这样升级。如果你的软件生命周期有好多年,hibernate升级到4,升级到5,你还是依然使用hibernate2?如果你以这种方式开发一个平台,你能要求所有使用你平台的软件项目都只能使用hibernate2?更进一步说,我现在开发一个产品,今后的客户将是成千上万。经过1、2年我需要升级了,这时我的升级包有几十M,几乎把所有的DAO都换了个遍,这样的升级无异于重装。也许,有人会提出另一个方案,在HibernateDaoSupport与DAO中间增加了一个基础类,这样将基础类中的org.springframework.orm.hibernate.support.HibernateDaoSupport,改为了org.springframework.orm.hibernate3.support.HibernateDaoSupport,这样其下面继承的DAO就不用改动了。然而在源码上是小小的改动,但对于类来说,两个不同版本的HibernateDaoSupport其相关的属性和方法还是有不少变化,那么在基础类重新编译的同时,你的继承类重新编译否。既然已经重新编译了,因此你的所有DAO在升级的时候依然要打入升级包,问题依然存在。以上问题,究其原因,是我们项目中的DAO依赖于hibernate和spring,因为我们对它们的使用是继承,是一种很强的关联,就是一种依赖。我们只需要稍微进行一些调整,就可以解决这个问题,那就是不使用直接继承,而使用接口进行分离。可以使用Façade模式,先建立一个叫BasicDao的基础类,从名称我们可以看出,它是所有DAO的基础类,实现DAO操作所需的所有诸如save()、delete()、load()、query()等方法,除了一些基本的方法,诸如翻页查询、getCount、解析查询条件形成HQL语句等功能也在这里实现,但是不要使用与hibernate或spring有关的任何方法和类。同时,BasicDao调用一个叫DaoSupport的接口,DaoSupport的接口则是提供持久化所需的基本方法,最原始的元素。然后,我为DaoSupport接口提供各种不同的实现,比如hibernate2的实现DaoSupportHibernateImp、hibernate3的实现DaoSupportHibernate3Imp,整个结构如下图所示。BasicDao可以使用hibernate或spring提供的方法,但是不是直接使用,而是通过调用DaoSupport的实现类来使用。然而BasicDao到底是使用的那个实现类,我们通过spring的IoC,通过配置文件来决定到底使用哪个实现。同时,BasicDao也不要使用诸如SpringContext的类来实现IoC,而是通过建立setDaoSupport()和getDaoSupport()方法,然后在spring配置文件中建立引用。
2. 编写Action的时候不要直接使用spring和spring的继承类
前面我说了应当避免DAO引用spring或hibernate及其继承类。同样的事情也发生在Action中。由于Action通常不纳入spring的管理,因此Action在通过spring调用某个BUS的时候,往往是去引用一个叫SpringContext的类(spring的类ContextLoaderServlet的继承类),然后使用它的getBean()方法。如此的使用,我们的Action将依赖与spring。我们同样可以使用一个叫BasicAction的父类,然后用一个接口来隔离spring。由于Action通常不纳入spring的管理,我们通过一个*.property的配置文件来决定接口到底调用哪个实现类。这样的结构的另一个好处是,我们还可以将所有Action都必须使用的诸如写日志、用户校验、异常处理都放在父类BasicAction中,提高系统的可维护性。
3. 当BUS需要获取别的模块的数据的时候,不要直接去使用该模块的DAO
我举一个简单的例子:我需要设计一个软件评审的管理软件,该软件分为评审组织者制订评审计划、评审者分别填写评审表后由评审组织者汇总评审表、评审组织者制作评审报告。这是一个非常简单的项目,分成了三个人来完成。但是项目进行快结束的时候却出现了问题。填写评审表需要获得评审计划中的一些数据,制作评审报告的数据来源于评审表。项目组在开始编程前先开了一次会,大家约定好了各个部分的数据格式及其规则,然后开始工作。然而数天后项目组把各个模块整合以后发现,系统根本跑不起来,为什么呢?设计评审计划的人发现,所有评审计划应当按照产品编号来进行管理而不是项目编号。由于这个变更,填写评审表模块在待评审列表中什么都无法显示;同样,设计评审表的人发现,在一个评审计划中评审表与评审者不是一对多的关系,而是一对一的关系,因而修改了这两个表的关联。因为这样,在制作评审报告时就不能正确得到评审表数据。其实一个软件项目在整个进行过程中总是不断变更。我们需要做的不是去抑制这些变更,而应当是通过软件的结构去适应这些变更,即是降低各模块间的依赖(耦合),提高内聚。拿这个实例来说,当评审表需要调用评审计划的数据的时候,不应当是自己写一个DAO去调用评审计划的数据,而应当是调用评审计划的接口,将这个任务交给评审计划类来完成。当评审报告需要调用评审表的数据的时候,同样应当去调用评审表的接口,由评审表来实现。同时,这种调用应当是去调用BUS层的接口。为什么呢?比如在评审计划中的一个业务逻辑是只有在评审计划发布以后才能制作评审表,那么怎样才是已发布的评审计划呢?这个业务逻辑应当由谁来定义?当然是评审计划。在什么地方定义?当然是BUS而不是DAO,因为DAO仅仅是实现数据的持久化,而BUS才是实现业务逻辑的地方。既然如此,如果评审表去调用评审计划的DAO,那么已发布评审计划的业务逻辑必然包含在了评审表的业务逻辑里了。我们假设有一天,已发布评审计划的业务逻辑发生变更了(实际上这样的会在你毫不经意间就发生了),编写评审计划的人会很快就修改了评审计划的业务实现并且测试通过了。他不知道评审表里也包含了这样的业务逻辑,因而修改后的程序在运行到评审表的时候就很可能会出错。不幸的是,在实际工作中,同样一个业务逻辑可能包含在无数个你可能知道,但你也可能不知道的代码中。这样的结构就是一个不易于维护的差的结构。
总结:从技术升级和需求变更两方面适应变化软件开发专家Alistair Cockburn在《敏捷软件开发》中说过,软件在整个生命周期中变更是无时无刻不发生的。我认为,软件的变更一方面是技术的更新,今天我们使用struts+spring+hibernate,明天呢,我们将使用什么呢?正因为技术变更得太快,我们的系统应当不要太依赖于某个具体的技术或框架,以便于明天的技术更新。同时,来自客户的需求变更也是我们必须面对的另一个压力。一句经典的话是这样描述客户的变更:“当我看到时我的需求就变更了。(I changed just when I saw it.)”过去我们用需求说明书来抑制用户的变更,现在发现不能这样了。敏捷软件开发提出了许多应对用户变更的办法,其中建立低耦合高内聚的软件结构也是办法之一。系统中的所有对象都有自己的明确职责,这个职责应当不多且高度相关。每个对象都应当只完成自己的职责,而把其它的任务交给别人去做。正如我前面提到的例子,评审表对象只完成与评审表相关的操作,而在它需要完成的任务中,需要使用评审计划数据的相关功能,交给评审计划对象去完成,评审表只管调用。这样的构造要求开发者相互协调,彼此多交流,同时,也需要有人来统一规划,站在全局的设计这个系统。通过这些,我们才可以适应变化,提高设计水平。
另外,团IDC网上有许多产品团购,便宜有口碑
❾ 如何在CentOS上搭建 Struts2+Spring+Hibernate的运行环境
Struts2+Spring+Hibernate是J2EE的最新流行框架。本篇是我搭建这个框架的经验总结,有很多人搭建这个框架总会遇到
大大小小的问题,网上也没有什么行之有效的方案或成体系的介绍,所以我就决定总结一下我的搭建过程。给一些搭
建尚存问题的朋友提供帮助。
我用这个框架,实现的是基本的CRUD功能的一个雇员管理系统,本来打算丰富一下功能,但是一直没能抽出空去搞。
目前版本暂定为1.0,除了CRUD外还配置了表单验证框架JSValidation。功能都能很顺利的实现。
现在分享部分源码,来说明一些注意事项。
以下是部分搭建过程及源码:
1.先组合实现Hibernate3.2+Spring2.5支持,删除hibernate.cfg.xml文件,修改applicationContext.xml文件的内容,增加SessionFactory和dataSource的设置。
2.通过MyEclipse的向导方式,生成POJO类和对应的映射文件。
3.修改applicationContext.xml文件中<property name="mappingResources">元素的内容。
4.编写DAO接口和实现类。
5.修改applicationContext.xml文件,增加对Dao实现类的配置。
6.组合Struts2和Spring2.5,修改web.xml文件,增加struts2的所需要的过滤器配置。
7.增加struts2相应类库,增加struts2与spring的配置jar包。
8.拷贝struts.xml文件到src根目录下,再修改struts.xml文件,进行常量配置。
9.修改web.xml文件,配置Spring监听器,和上下文变量。并增加OpenSessionInViewFilter的设置。
10.写入action类。
11.配置struts.xml文件。
12.修改applicationContext.xml
13.编写Jsp文件。
14.加载运行项目。
下面是关键文件的源码:
struts.xml源码: