2013-7-30。。。。难得闲
难得闲
工作已经快一个月了,老早的计划终于有时间付诸实施了,想想一天都干了什么,有什么收获。
来个段子:第7天来公司,我问服务器是什么?服务器还有windows的??天呀,没听过,也没见过,好吧经理告诉我公司的服务器在哪,我这才第一次看到服务器是什么样子,才知道这TMD的就是服务器,才知道服务器还有windows Server 。呵呵,让人笑话了。
今天搞了一天编辑器,有FCK CK等,警察叔叔不好伺候,要和word文档的格式一致,网上找,研究源代码,搞了2天,没有结果,今天一天就这样在头疼+烦躁+下一秒可能会有奇迹中过去了。(坚持下一秒没准就会出现结果—>就算不是你想要的)。
这一个月学的东西太多了。。。。。慢慢写吧
以前做项目,直接用hibernate提供的SaveOrupdate方法,什么也不用想,也不用判断,觉得很方便,到公司,竟让有save、update、saveOrupdate3中方法,让我做修改,保存已经做好,我很费解,直接saveOrupdate不行吗?老朋友告诉我saveOrupdate方法容易出错,但是为什么他也说不好,好吧,只好加判断,我是先判断,进入action方法的时候id是不是为空,如果是直接save,如果不是就从数据库里查,然后update,但是错误来了,说session中不同的对象有相同的标示符(identity),也就是说session缓存没有及时清理,以前的对象还在,
public void update(T t, LockMode lockMode) throws DataAccessException {
getHibernateTemplate().update(t, lockMode);
getSession().getTransaction().commit();
getSession().flush();
}
这个方法已经提交了事物清除了缓存,而且当提交事物时就算你不手动清理缓存,hibernate也会自动帮你清理缓存的,所以还是不太明白
好吧,只好手动加上
public void edit(User user){
//wls改
userDao.getCurrentSession().clear();
userDao.update(user);
}
只好在service层加上这个,还有就是可能和hibernate处理请求的顺序有关吧,先执行select,Update,delete具体还不太确定。(待查)
这样就能实现保存和修改了。
下面是网上搜的:
前面参考来的代码在数据处理类里面基本上都是直接使用SaveOrUpdate来保存数据,让系统自动判断是新增的还是更新的。但是用在我的代码里就有问题,保存第一条数据就会提示数据错误,记录可能被改动之类的。在网上找了半天也没看到有什么有用的线索。
今天再做的时候突然看到一条信息,NHibernate不是通过到数据库里查找这条记录在不在来判断它是更新还是插 入的,而是通过主键的值来判断,这里就要用到那个unsaved-value的值了。如果主键的值等于这个未保存前的值,那么这条记录就是要新建的,如果 不等于,那么它就是要更新的了。
通常我所看到的参考代码,这个unsaved-value都是设为null的,所以我的代码里也全部是设为null 的,但是没有想到,我的代码里所有的主键都是数字型的,生成对象的时候会给这个字段设成默认值0,所以在保存第一条数据的时候NHibernate会以为 我要更新数据,但是这个主键的值是系统自动生成的,因此这个Update语句会报错。将所有的配置文件改成unsaved-value="0",测试通 过。
这里就带来了另一个问题,在另一套系统中,分析人员认为系统中的表关联太多,如果使用自动增长字段作为关键字,容易 出现冲突问题,于是使用一个自动增长字段的表来为全局生成主键,那么所有的其它表的主键就都是assigned,而不是identity了,这时候 unsaved-value就没有意义了,因为新建的对象你也要手动给它赋这个值。这样的话系统就没有办法自动判断是更新还是插入了,只能手动分开使用 Save或者Update方法。
真是个有趣的功能。我倒是从来没有使用过自动生成字符串型主键的数据库功能,那种冲突的发生率会更高。
好了19:20 改回家了。