免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2331 | 回复: 0
打印 上一主题 下一主题

webwork+spring+hibernate框架整合错误调试大杂绘(不断更新) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-25 21:31 |只看该作者 |倒序浏览
近日公司来了一新同事,娘西,,来了一个月左右,叫他学习框架知识.最后写了一WSH的用户添/删/

改/查的工程.在过程中有很多问题,一些细的的问题.报错了,让我调啊调.我也很撮的.只是查询网上的资料看.看

帖子.在过程中我记录了一些细节的东西,也是很容易报错的地方..供大家参考,饮水思源..

webwork(webwork 2.2):

1.这里首先要讲的是 WebWork2.2新特性,使用FreeMarker的FTL做装饰页面,所以呢在页面上使用UI标

签,webwork会自动的使用FreeMarker的ftl.

在webwork.properites文件中呢有一个webwork.ui.theme = XXX属性,这一项呢就是配置自定义的ftl的.

就是配置主题啦,详细的可以看webwork的中文文档,里面很详细.

自定义主题:比如说呢

##webwork.ui.theme = gem  

##webwork2的标签默认使用的ftl模板;如果配置webwork.ui.theme =gem,表示 /template/gem目录,

在这个目录下重新覆盖ftl..

不然会报出

java.io.FileNotFoundException: Template /template/gem/form.ftl not found.
at freemarker.template.Configuration.getTemplate(Configuration.java:489)
at freemarker.template.Configuration.getTemplate(Configuration.java:452)

的信息让你摸不着头脑.






Spring 报错:

1.当服务器启动时控制台报

严重: Error listenerStart
2008-8-25 20:55:12 org.apache.catalina.core.StandardContext start
严重: Context startup failed due to previous errors

这样是没有什么实际意义的,只是说明spring 配置文件错误..

这里呢可以打开服务器(Tomcat,Weblogic,.....)的日志,日志里会有详细的报错信息

Tomcat:%Tomcat_home%/logs/localhost_log.2008-06-17.txt的日志..08-06-17当天

Weblogic:%wl_home%\user_projects\domains\mydomain\myserver\myserver.log


2.事务控制



  
   
  
  
   com.webwork.cy.biz.*Biz
  




  
  
   
    PROPAGATION_REQUIRED,readOnly
    PROPAGATION_REQUIRED,readOnly
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED
   
  


com.webwork.cy.util.springframework.autoproxy.BeanTypeAutoProxyCreator

这个是自己写的一个类,实现AbstractAutoProxyCreator,功能和BeanNameAutoProxyCreator相似,这

里就不贴出来了,如果谁有需要,可以M我.



hibernate:

1. 事务

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

session.save(customer);//之前已实例化好了的一个对象

tx.commit();

…………………………………………………………………………

示例很简单,就是向数据库中插入一条顾客信息,这是一个最简单的数据库事务。在这个简单的过程中,

Hibernate为我们做了一些什么事情呢?

为了更好的观察,我们将Hibernate的”show_sql”属性设置为true,然后运行我们的程序,控制台打印出

如下信息:

Hibernate: select max(ID) from CUSTOMER
Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

这里也许看不出什么端倪来,现在在session.save(customer)后面加一行代码,输出这个customer的

OID,System.out.println(customer.getId()),

再次运行程序,控制台输出为:

Hibernate: select max(ID) from CUSTOMER
22
Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

OID在insert语句之前输出,这可以说明两个问题:1.insert语句并不是在执行save的时候发送给数据库

的;2.insert语句是在执行commit的时候发送给数据库的。

结合前面我们所说过的:执行save的时候,Hibernate会首先把对象放入缓存,然后计划一条insert语句。

一个基本的插入流程就出来了:

1.  判断所要保存的实例是否已处于持久化状态,如果不是,则将其置入缓存;

2.  根据所要保存的实例计划一条insert sql语句,注意只是计划,并不执行;

3.  事务提交时执行之前所计划的insert语句;

后台还打印出了select max(ID) from CUSTOMER,这主要是为了给customer赋予一个OID,因为一般情

况下临时对象的OID是NULL。

接着我们做两个测试:

1.  将tx.commit();注释掉,此时控制台没有打印出insert语句;

2.  将tx.commit()换成session.flush,此时控制太打印出了insert语句,但是数据库中并没有添加新

的记录;

通过查阅Hibernate的API可以知道flush方法的主要作用就是清理缓存,强制数据库

与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这

些sql语句,但是不会向数据库提交。

而commit方法则会首先调用flush方法,然后提交事务。这就是为什么我们仅仅调用flush的时候记录并未插

入到数据库中的原因,因为只有提交了事务,

对数据库所做的更新才会被保存下来。因为commit方法隐式的调用了flush,所以一般我们都不会显示的调用

flush方法。


2.待续







本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/17667/showart_1148588.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP