- 论坛徽章:
- 0
|
近日公司来了一新同事,娘西,,来了一个月左右,叫他学习框架知识.最后写了一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 |
|