Jul 23
通过回顾和回味自己的大学和研究生时代生活,通过和不同学校毕业的各种大学生包括研究生同事的共事,通过校园招聘的亲身经历,通过对所服务的客户里面的大学生新员工的接触和交流,发现中国的大学和研究生教育在如下素质和技能培训中值得好好补补课:

1、沟通技巧(Communcation Skill)。也许大家都会说话,都知道沟通很重要,但是能够很好沟通的人却是少之又少。这在相当程度上和我们的教育很有关系,从小到大,我们都必须言听计从于我们的老师,我们也从来没有经历过任何沟通理论和实践方面课程的训练。实际上,当你毕业走上岗位时,专业并不是最重要的,沟通能力才是最重要的。任何工作的开展,任何项目的完成,任何事情的推进,都是需要人和人来完成的,因此沟通无时不在无处不在。沟通能力好的人事半功倍,沟通能力差的人难于上青天。

2、聆听技巧(Listening Skill)。
大多数人都喜欢说话,都善于说话,但很少有人会“听”,很少有人能听得懂他人所讲之话。实际上,造物主在涉及人类的时候早就做好了这方面的安排。君不见,正常人基本都是一张嘴巴、两只耳朵。从数量上比较,耳朵的数量多于嘴巴,在相当程度上就意味着我们应该多听少讲,只有听清楚了,才能说明白。此外,从繁体字角度看更是一目了然,请看聽”字,左上方是“耳”,下面有个“王”,简单套用就是“听为王”,右上方是“十四”,右下方是“一心一意”,联结起来就是“用十四个心去听”,但现实生活中又有多少人能一心一意去听别人讲,“我有半杯水”和“我还有半杯水的空间”的差距就在于此。

3、归纳概括能力(Summing Up Skill)。
也许我们现在太过于强调英语的作用,所以我们的大学生们的中文能力是在飞速的下降,有些孩子可能连基本的通顺的句子都难于写出来,更不用说正确的规范的标点符号的运用了。即使有些人能够写出东西,但是能够一针见血点出要点、点出症结的却少之又少。实际上出现这一问题的主要原因是因为我们从小到大缺乏思维的训练。依据本人这几年的实践经验,建议大家看论文或者文章时可以尝试着在看完之后做个小结,把它的主旨或者要点用几个点列示出来,当然能做成PPT是最好了。只要你坚持下去,不出三个月定会有很好的疗效

4、演示技巧(Presentation Skill)。
实际上,无论你进入企业还是政府机构还是大学教书,演示文件或者方案总是家常便饭。但现实中,更多的人宣讲PPT时更多的时候是在“读PPT”,而不是“讲 PPT”。读是照本宣科,是逐字逐句的念,可想而知这样的效果会多差!演示技巧高超的人士则相反,高低结合,主次分明,有选择性地宣讲重点。比如某页 PPT讲述了某种方案的6种优势,那么一般着重讲前三种足以,其他点到为止即可。

5、团队协作(Teamworking Skill)。
一个中国人是龙,三个中国人是虫,这句话在相当程度上是正确的,现实生活中我们确实在这方面比较欠缺,我们的教育中同样欠缺相应的元素来弥补。实际上我们的哪项工作不需要多人、多个部门来配合共同完成。因此,对症下药时,既要更新“宁当鸡头不做凤尾”的传统观念,更要通过拓展训练等多种行动学习(action learning)以活生生的例子和工具来改造我们的学弟和学妹们

6、Office能力。
一提Office,可能大多数人都自认为自己有几把刷子,但是千万不要小瞧了微软公司,那些技术天才设计出来的这套宝贝真的很有用很有价值呀。如果你能熟练使用word、Excel和ppt等,实际上对于你日后的工作会带来很大的便利和帮助。因此,建议各位学弟学妹,不要好高骛远一味追求什么编程语言的学习(针对非计算机专业而言),相反应脚踏实地学好上述三种程序的基本操作技巧,须知它们可都是商业语言的体现方式之一亚,特别是PPT!建议大家既可以参照我上段所提的方法,也可以看看诸如“用图表说话”等书。

纵观现今之中国大学,无论是本科教育还是研究生教育,甚至放眼MBA教育,在上述六个领域基本都是空白。这也是为什么这么多学生就业无门,中国教育落后于商业发展的原因和现状的真实写照之一。
相信过不了多久,上述六门课程会逐渐成为高等教育的必修课或者选修课,也相信会有相当的咨询公司或者咨询人士会投身到这一大事之中

如果时机合适,本人也愿意用自己的切身经验和大家作一分享!
Jul 23
世界上最经典的智力题

1、有两根不均匀分布的香,香烧完的时间是一个小时,你能用什么方法来确定一段15分钟的时间?

2、一个经理有三个女儿,三个女儿的年龄加起来等于13,三个女儿的年龄乘起来等于经理自己的年龄,有一个下属已知道经理的年龄,但仍不能确定经理三个女儿的年龄,这时经理说只有一个女儿的头发是黑的,然后这个下属就知道了经理三个女儿的年龄。请问三个女儿的年龄分别是多少?为什么?

3、有三个人去住旅馆,住三间房,每一间房$10元,于是他们一共付给老板$30,第二天,老板觉得三间房只需要$25元就够了于是叫小弟退回$5给三位客人,谁知小弟贪心,只退回每人$1,自己偷偷拿了$2,这样一来便等于那三位客人每人各花了九元,于是三个人一共花了$27,再加上小弟独吞了不$2,总共是$29。可是当初他们三个人一共付出$30那么还有$1呢?

4、有两位盲人,他们都各自买了两对黑袜和两对白袜,八对袜了的布质、大小完全相同, 而每对袜了都有一张商标纸连着。两位盲人不小心将八对袜了混在一起。他们每人怎样才能取回黑袜和白袜各两对呢?

5、有一辆火车以每小时15公里的速度离开洛杉矶直奔纽约,另一辆火车以每小时20公里的速度从纽约开往洛杉矶。如果有一只鸟,以30公里每小时的速度和两辆火车同时启动,从洛杉矶出发,碰到另一辆车后返回,依次在两辆火车来回飞行,直到两辆火车相遇,请问,这只小鸟飞行了多长距离?

6、你有两个罐子,50个红色弹球,50个蓝色弹球,随机选出一个罐子,随机选取出一个弹球放入罐子,怎么给红色弹球最大的选中机会?在你的计划中,得到红球的准确几率是多少?

7、你有四个装药丸的罐子,每个药丸都有一定的重量,被污染的药丸是没被污染的重量+1.只称量一次,如何判断哪个罐子的药被污染了?
8、你有一桶果冻,其中有黄色,绿色,红色三种,闭上眼睛,抓取两个同种颜色的果冻。抓取多少个就可以确定你肯定有两个同一颜色的果冻?

9、对一批编号为1~100,全部开关朝上(开)的灯进行以下*作:凡是1的倍数反方向拨一次开关;2的倍数反方向又拨一次开关;3的倍数反方向又拨一次开关……问:最后为关熄状态的灯的编号。

10、想象你在镜子前,请问,为什么镜子中的影像可以颠倒左右,却不能颠倒上下?

11、一群人开舞会,每人头上都戴着一顶帽子。帽子只有黑白两种,黑的至少有一顶。每个人都能看到其它人帽子的颜色,却看不到自己的。主持人先让大家看看别人头上戴的是什幺帽子,然后关灯,如果有人认为自己戴的是黑帽子,就打自己一个耳光。第一次关灯,没有声音。于是再开灯,大家再看一遍,关灯时仍然鸦雀无声。一直到第三次关灯,才有劈劈啪啪打耳光的声音响起。问有多少人戴着黑帽子?

12、两个圆环,半径分别是1和2,小圆在大圆内部绕大圆圆周一周,问小圆自身转了几周?如果在大圆的外部,小圆自身转几周呢?

13、1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有20元钱,最多可以喝到几瓶汽水?

14。 假设有一辆车,它的油箱恰好和一个油桶一样大,而且车上恰好可以
  运载一个桶。假设一桶油可以让车开一百公里。现在在起点,车装满
  了油,另外起点还有100桶油。问,这车最远能离开起点多远?

15。有三个囚徒,将要被执行死刑,现在给他们一次赦免的机会。
  10分钟后,他们将被带往三个互相隔离的房间,由狱警丢硬币决定给他们戴上红色或蓝色的帽子。囚徒互相之间不能通信息,但可以看到其他囚徒头上帽子的颜色。
  
  现在囚徒要猜自己头上帽子的颜色,只能猜一次,每个囚徒都必须在10秒钟之内说“红”、“蓝”或“过”。
  
  (1)如果任何一个囚徒违反规则,三个囚徒都将被砍头;
  (2)如果三个囚徒都说“过”,也是全体砍头;
  (3)如果任何一个囚徒说错了自己头上帽子的颜色,也是全体砍头;
  (4)不然的话,就全体释放。
  
  现在这三个囚徒有10分钟的时间可以商量,要采取什么措施,使得获释的机会最大。
  
  提示:如果三个囚徒都胡乱猜测的话,则成功的机会为1/8;如果两个囚徒都说“过”,而第三个囚徒胡乱猜测的话,成功的机会为1/2。
  
  还有更好的方案吗?

16。四只乌龟在边长为3米的正方形四个角上,以每秒1厘米的速度同时匀速爬行,每只乌龟爬行的方向都是追击(注意:是追击)其右邻角上的乌龟,问经过多少时间他们才能在正方形的中心碰头?


17。有2000方格排成一排,两个玩家轮流在方格里写S或O,谁先在连续的三个方格里写出SOS,谁就获胜;

如果都写不出来就算平局。

请证明:后写的人有胜算。

18。这是简单明快的一道题,主要证明了三角形两边之和=第三边。你能找出其中的错误吗?

19。卢姆教授说:“有一次我目击了两只山羊的一场殊死决斗,结果引出了一个有趣的数学问题。我的一位邻居有一只山羊,重54磅,它已有好几个季度在附近山区称王称霸。后来某个好事之徒引进了一只新的山羊,比它还要重出3磅。 开始时,它们相安无事,彼此和谐相处。可是有一天,较轻的那只山羊站在陡峭的山路顶上,向它的竞争对手猛扑过去,那对手站在土丘上迎接挑战,而挑战者显然拥有居高临下的优势。不幸的是,由于猛烈碰撞,两只山羊都一命呜呼了。
  现在要讲一讲本题的奇妙之处。对饲养山羊颇有研究,还写过书的乔治·阿伯克龙比说道:“通过反复实验,我发现,动量相当于一个自20英尺高处坠落下来的30磅重物的一次撞击,正好可以打碎山羊的脑壳,致它死命。”如果他说得不错,那么这两只山羊至少要有多大的逼近速度,才能相互撞破脑壳?你能算出来吗?
Jul 23

1.    Cache简介:

缓存(Cache )是计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝,应用程序在运行时直接读写缓存中的数据,只在某些特定时刻按照缓存中的数据来同步更新数据存储源。

缓存的物理介质通常是内存,而永久性数据存储源的物理介质通常是硬盘或磁盘,应用程序读写内在的速度显然比读写硬盘的速度快,如果缓存中存放的数据量非常大,也会用硬盘作为缓存的物理介质。

缓存的实现不仅需要作为物理介质的硬件,同时还需要用于管理缓存的并发访问和过期等策略的软件。因此,缓存是通过软件和硬件共同实现的。

1.1.    持久化层的缓存的范围

缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围分为三类。

1) 事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的对象形式。

2) 进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据,但是对象分解为松散的算法比对象序列化的算法要求更快。

3) 集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式。

对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,因为访问的速度不一定会比直接访问数据库数据的速度快多少。

持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到进程范围或集群范围的缓存内查询,如果还是没有查到,那么只有到数据库中查询。事务范围的缓存是持久化层的第一级缓存,通常它是必需的;进程范围或集群范围的缓存是持久化层的第二级缓存,通常是可选的。

1.2.    持久化层的缓存的并发访问策略

当多个并发的事务同时访问持久化层的缓存的相同数据时,会引起并发问题,必须采用必要的事务隔离措施。

在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题。因此可以设定以下四种类型的并发访问策略,每一种策略对应一种事务隔离级别。

1) 事务型(Transactional)策略:仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读和不可重复读这类的并发问题。

2) 读写型(read-write)策略:提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题。

3) 非严格读写型(nonstrict-read-write)策略:不保证缓存与数据库中数据的一致性。如果存在两个事务同时访问缓存中相同数据的可能,必须为该数据配置一个很短的数据过期时间,从而尽量避免脏读。对于极少被修改,并且允许偶尔脏读的数据,可以采用这种并发访问策略。

4) 只读型策略(read-only):对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略。

事务型并发访问策略是事务隔离级别最高,只读型的隔离级别最低。事务隔离级别越高,并发性能就越低。

2.    Hibernate中的缓存:

Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。

Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。

2.1.    一级缓存和二级缓存的比较:

  第一级缓存 第二级缓存

存放数据的形式 相互关联的持久化对象 对象的散装数据

缓存的范围 事务范围,每个事务都有单独的第一级缓存 进程范围或集群范围,缓存被同一个进程或集群范围内的所有事务共享

并发访问策略 由于每个事务都拥有单独的第一级缓存,不会出现并发问题,无需提供并发访问策略 由于多个事务会同时访问第二级缓存中相同数据,因此必须提供适当的并发访问策略,来保证特定的事务隔离级别

数据过期策略 没有提供数据过期策略。处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象 必须提供数据过期策略,如基于内存的缓存中的对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间

物理存储介质 内存 内存和硬盘。对象的散装数据首先存放在基于内在的缓存中,当内存中对象的数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。

缓存的软件实现 在Hibernate的Session的实现中包含了缓存的实现 由第三方提供,Hibernate仅提供了缓存适配器(CacheProvider)。用于把特定的缓存插件集成到Hibernate中。

启用缓存的方式 只要应用程序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作,Hibernate就会启用第一级缓存,把数据库中的数据以对象的形式拷贝到缓存中,对于批量更新和批量删除操作,如果不希望启用第一级缓存,可以绕过Hibernate API,直接通过JDBC API来执行指操作。 用户可以在单个类或类的单个集合的粒度上配置第二级缓存。如果类的实例被经常读但很少被修改,就可以考虑使用第二级缓存。只有为某个类或集合配置了第二级缓存,Hibernate在运行时才会把它的实例加入到第二级缓存中。

用户管理缓存的方式 第一级缓存的物理介质为内存,由于内存容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目。Session的evit()方法可以显式清空缓存中特定对象,但这种方法不值得推荐。 第二级缓存的物理介质可以是内存和硬盘,因此第二级缓存可以存放大量的数据,数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二级缓存主要包括两个方面:选择需要使用第二级缓存的持久类,设置合适的并发访问策略:选择缓存适配器,设置合适的数据过期策略。

2.2.    一级缓存的管理:

当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。

Session为应用程序提供了两个管理缓存的方法:

evict(Object obj):从缓存中清除参数指定的持久化对象。

clear():清空缓存中所有持久化对象。

2.3.    二级缓存的管理:

2.3.1.      Hibernate的二级缓存策略的一般过程如下:

1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。

2) 把获得的所有数据对象根据ID放入到第二级缓存中。

3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。

4) 删除、更新、增加数据的时候,同时更新缓存。

  Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。

2.3.2.      什么样的数据适合存放到第二级缓存中?

1 很少被修改的数据

2 不是很重要的数据,允许出现偶尔并发的数据

3 不会被并发访问的数据

4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

2.3.3.      不适合存放到第二级缓存的数据?

1 经常被修改的数据

2 财务数据,绝对不允许出现并发

3 与其他应用共享的数据。

2.3.4.      常用的缓存插件

Hibernater 的二级缓存是一个插件,下面是几种常用的缓存插件:

l EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。

l OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。

l SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。

l JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。

2.3.5.      配置二级缓存的主要步骤:

1)      选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。

2)      选择合适的缓存插件,然后编辑该插件的配置文件。

2.4.    使用EhCache配置二级缓存:

2.4.1.      配置准备:

1)      把ehcache-1.2.3.jar加入到当前应用的classpath中。

2)      在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。

< !--配置缓存插件 -->

< property name="hibernate.cache.provider_class">

    org.hibernate.cache.EhCacheProvider

< /property>

3)      挎贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc下。

Jul 23

第一章 java简介

1. 了解Java 语言


l Sun Microsystems(微系统) 1995年推出。
l Java平台无关性(Write Once,Run Anywhere 编写一次,随处运行):主要原因是sun为计算机系统提供了一个叫做java虚拟机(Java Virtual Machine, JVM)的环境。

2. 了解Java 程序的类型

Java可用来生成两类程序:
l 应用程序(applications)和Java Applet(小应用程序)。

3. 掌握Java 程序运行环境的配置

3.1 安装软件:
l JDK(java Development kit,开发工具包)jdk-1_5_0_05-windows-i586-p.exe

例如安装目录为:C:\Program Files\Java\jdk1.5.0_05 关于里面的目录用途详见书67页。

3.2 配置环境:
l 鼠标右击桌面上【我的电脑】-> 选择【属性】选项。
l 在弹出的对话框上单击【高级】选项卡->点击【环境变量】按钮。
l 在弹出的选项卡上对"系统变量""用户变量"选项组中设置。
3.2.1 命令环境:

Ø 编辑"Path"变量:(由于里面有值,对于你要添加的值要用分号隔开";")在后面追加:C:\Program Files\Java\jdk1.5.0_05\bin

3.2.2 运行环境:

Ø 新建环境变量:名:CLASSPATH 值:.

3.2.3 宿主目录(安装目录)

Ø 新建环境变量:名:JAVA_HOMEC:\Program Files\Java\jdk1.5.0_05

3.2.4 检查无问题后保存退出。
3.2.5 检测环境是否配置成功:

Ø 【开始】->点击【运行】->输入“cmd”回车后打开DOS命令操作对话框。在里面输入并执行“javac”与“java”命令没有错误信息即环境配置成功。

3.3 JDK中的开发命令

3.3.1 javac (编译命令)

Ø 格式:javac [选项] java文件名

Ø 常用选项:-classpath<路径>-d<目录>

3.3.2 java (解释运行命令)

Ø 格式:java [选项] 类文件名

Ø 常用选项:-classpath<路径>-version<版本>

3.3.3 javadoc (抽取API文档命令)

Ø 格式:javac [选项] java文件名

Ø 常用选项:-classpath<路径>-author<作者>

3.4 开发java程序的步骤:
3.4.1 创建java源文件

Ø java源文件的扩展名文.java ,编写源文件的工具可以是任意的文本编辑器。

3.4.2 编辑源文件即可生成class字节码(bytecode)文件。

Ø 使用【javac】命令可将你编写的某.java文件生成某某.class文件。

Ø 注意javaclass文件的名有可能不一样。

3.4.3 运行class(字节码)文件

Ø 使用【java】命令来运行class文件,但文件的后缀.class不写。此时字节码文件就交给JVM运行了。

3.5 java程序中的注释(三种):

l 单行注释: //...

l 多行注释: /* ... */ (禁止嵌套)

l 文档注释: /** ... */

4. 理解Java 虚拟机 (JVM)

当使用【java】命令来运行class文件时,JVMJava Virtual Machine)会分成下面三部分进行:

1. 代码的装载:加载.class文件。

2. 代码的效验:效验字节码文件。

3. 代码的执行:执行代码

5. 了解Java的特点:

1. 简单2. 面向对象3. 健壮性4. 安全性5. 分布性6. 多线程
Jul 22
这个问题,我把对象赋值为NULL,也是很好用的.在我的系统中,更新好用了,可是插入不好用了.没改前,是插入好用,而更新不好用.本来是系统中的问题,可是,catch只是捕捉到,从但是,没有把log打印出来,找原因实在是难找.在高度数据库时,最好把异常捕捉中的信息打印出来.org.springframework.orm.hibernate.HibernateSystemException: a different object with the same identifier value was already associated with the session: 4443398, of class: com.onewaveinc.media.cms.entity.SyncImportFolder; nested exception is net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 4443398, of class: com.onewaveinc.media.cms.entity.SyncImportFolder
net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 4443398, of class: com.onewaveinc.media.cms.entity.SyncImportFolder
at net.sf.hibernate.impl.SessionImpl.doSave(SessionImpl.java:852)
at net.sf.hibernate.impl.SessionImpl.saveWithGeneratedIdentifier(SessionImpl.java:790)
at net.sf.hibernate.impl.SessionImpl.save(SessionImpl.java:749)
at org.springframework.orm.hibernate.HibernateTemplate$9.doInHibernate(HibernateTemplate.java:555)
at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:363)
at org.springframework.orm.hibernate.HibernateTemplate.save(HibernateTemplate.java:552)
at com.onewaveinc.media.cms.dao.impl.SyncFolderHibernateDao.insertHavaIndex(SyncFolderHibernateDao.java:31)
at com.onewaveinc.media.cms.manager.SyncFolderManager.doImportSyncFolder(SyncFolderManager.java:193)
at com.onewaveinc.media.cms.manager.SyncFolderManager.insertHavaIndex(SyncFolderManager.java:107)
at com.onewaveinc.media.cms.manager.SyncFolderManager.importSyncFolderList(SyncFolderManager.java:607)
at com.onewaveinc.media.cms.web.SyncFolderImportAction.post(SyncFolderImportAction.java:41)
at com.onewaveinc.media.common.web.HttpMethodAction.execute(HttpMethodAction.java:36)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at com.onewaveinc.media.web.struts.MediaRequestProcessor.processActionPerform(MediaRequestProcessor.java:51)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.ajaxanywhere.AAFilter.doFilter(AAFilter.java:41)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.onewaveinc.appcommon.security.web.utils.SecurityFilter.doFilter(SecurityFilter.java:89)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at com.onewaveinc.media.common.web.SpringHibernateSessionFilter.doFilterInternal(SpringHibernateSessionFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.onewaveinc.media.web.struts.StrutsValidateFilter.doFilter(StrutsValidateFilter.java:38)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.onewaveinc.appcommon.utils.web.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:168)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngin.ve.invoke(StandardEngin.ve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)



a different object with the same identifier value was already associated with the session
一个经典的hibernate错误:a different object with the same identifier value was already associated with the session xxxx
hibernate3.0以上使用merge()来合并两个session中的同一对象
具体到我自己的代码就是
public Object getDomain(Object obj) {
  getHibernateTemplate().refresh(obj);
  return obj;
  }
  public void deleteDomain(Object obj) {
  obj = getHibernateTemplate().merge(obj);
  getHibernateTemplate().delete(obj);
  }


解决a different object with the same identifier value was already associated with the session错误 

这个错误我一共遇到过两次,一直没有找到很好的解决方案,这个错误产生原因相信大家都知道,因为在hibernate中同一个session里面有了两个相同标识但是是不同实体,当这时运行saveOrUpdate(object)操作的时候就会报这个错误。呵呵,也许你会说,你这么说跟没说没什么区别,我承认,呵呵,我不知道具体为什么会产生这个错误,要不然也不会很久都没有解决,现在,给出一个临时的解决方案,给向我一样,没有办法找到根源的人一个能够继续执行下去的方法(当然是对的,只是不是从产生原因入手)

其实要解决这个问题很简单,只需要进行session.clean()操作就可以解决了,但是你在clean操作后面又进行了saveOrUpdate(object)操作,有可能会报出"Found two representations of same collection",我找了很多资料,没有什么很好的解释,其中这篇文章帮助最大http://opensource.atlassian.com/projects/hibernate/browse/HHH-509

最后通过session.refresh(object)方法就可以解决了,注意,当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为refresh是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下

当然这个问题最容易解决的办法还是使用Hibernate里面自带的merge()方法。不过我始终觉得碰到问题就用这种软件自带的非常用方法(和saveOrUpdate(),save(),update()相比)感觉十分不爽。

后来我还发现这种错误经常出现在一对多映射和多对多映射,请大家在使用一对多和多对多映射的时候要小心一些


Hibernate 疑难异常及处理


1、a different object with the same identifier value was already associated with the session。

  错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。

  解决方法一:session.clean()

  PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。

  解决方法二:session.refresh(object)

  PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。

  解决方法三:session.merge(object)

  PS:Hibernate里面自带的方法,推荐使用。

2、Found two representations of same collection

  错误原因:见1。

  解决方法:session.merge(object)

以上两中异常经常出现在一对多映射和多对多映射中


a different object with the same identifier value was already associated with the session
一个经典的hibernate错误:a different object with the same identifier value was already associated with the session xxxx
hibernate3.0以上使用merge()来合并两个session中的同一对象
具体到我自己的代码就是
public Object getDomain(Object obj) {
  getHibernateTemplate().refresh(obj);
  return obj;
  }
  public void deleteDomain(Object obj) {
  obj = getHibernateTemplate().merge(obj);
  getHibernateTemplate().delete(obj);
  }
====================我是分割线===================
其实我的解决办法是把obj给重新merge一下,注意红字部分
public Serializable save(Object persistentObject) throws DaoException {
  try {
        
  Session session = this.openSession();
  beginTransaction();
  persistentObject = session.merge(persistentObject);
  Serializable id = session.save(persistentObject);
  if (autoCommit)
  commitTransaction();
  return id;
  } catch (HibernateException ex) {
  log.error("Fail to save persistentObject", ex);
  throw new DaoException("Fail to save persistentObject", ex);
  } finally {
  if (autoCloseSession)
  closeSession();
  }
  }
分页: 9/60 第一页 上页 4 5 6 7 8 9 10 11 12 13 下页 最后页 [ 显示模式: 摘要 | 列表 ]