温馨提示:您的每一次转载,体现了我写此文的意义!!!烦请您在转载时注明出处http://www.blogjava.net/sxyx2008/谢谢合作!!!

雪山飞鹄

温馨提示:您的每一次转载,体现了我写此文的意义!!!烦请您在转载时注明出处http://www.blogjava.net/sxyx2008/谢谢合作!!!

BlogJava 首页 新随笔 联系 聚合 管理
  215 Posts :: 1 Stories :: 674 Comments :: 0 Trackbacks

#

        众所周知,现在大学生就业超乎现象的难,好不容易找个工作,薪水底的只够勉强养活自己,马上还要娶老婆成家生儿育女,孝敬即将年迈的父母,可房价高高在上,物价节节攀升,社会保障又严重跟不上,生存竞争越来越白热化,前浪随时可能被后浪拍死在沙滩上,老婆娶不起,父母也养不了,压力却愈来愈大。而政府鼓励一群毫无经验的年轻人去创业无异于怂恿一群饥饿的羊羔去狼的地盘里吃草。相比之下,70后要比80后幸运多了80后相对于70后的唯一一个优势是更容易上大学了,除此之外,就全面处于劣势了。
  
   最近,根据《三联生活周刊》推荐,看了一本叫《异类》(Outliers)的书,很受刺激。按照此书类似的分析,10年后,80后的社会财富比例和幸福指数比不上现在70后的社会财富比例,而且和70后的差距会大。
  
   原因如下:
   1、中国的房价是在2000年上升,2003年房价飙升,2005年和2007年又都疯长了一波。70后的大学生大多在1996~2003年毕业,只要家里有点积蓄的,都能买到便宜的房子。80后买同样的房子要多付出3、4倍的价格(考虑通货膨胀因素)。毫不夸张的说,70后出让给80后一套房子,等于剥削了80后10年的工作(相当于80后要给70后打工10年),银行zf的剥削另算。
  
   2、中国是在2001年加入WTO的,中国的经济由于出口强劲增长,各类人才奇缺。2001年毕业大学生115万,2002年123万,2003年212 万(80后上场),2004年280万,到2009年超过600万(80后主力,遭遇全球金融风暴)。2003年前毕业学生更容易找到工作,工作条件会更好。对80后致命的是70后占据职场的管理和技术高级岗位,80后会缺少70后当时的机会。热销的《杜拉拉升职记》就是70后的代表,80后再怎么看也没有用的,《杜拉拉升职记》描述的是历史,不是现在和未来。
  
   3、中国IT的几只领头羊也是70后的,就像本书所说的,不早不后刚好赶上IT革命,成就了一番事业,80后没有遇到像IT革命这样重大的创业好时期。
  
   4、官场未知,未来是50后的,70后还没排上别说80后了。
  
  所以,如果一个80后有房有车,碰巧飚车撞死人(杭州)或者几拳打死保安(上海),那么大家都很熟悉这种人,富二代。提到富二代,不能不说富一代,根据胡润中国富豪榜,富翁最集中的行业是房地产,占1/4,最多占到过1/2。而且房地产80%以上是50后(碧桂园的杨惠妍的父亲是50后),为什么不是60 后或40后呢,因为房地产需要zf关系和相应能力,中国房地产火热的10年中zf主事官员主要是50后,同学或朋友更容易做事。所以80后20年内不用打房地产的主意,缺少相应的人脉。
  
   最后一击,90后的机会会比80后改善很多,更容易找工作,学习条件更好(同本书的解释),原因在于人口结构:
   1981年出生人口19122938人;1991年出生人口20082026人
   1982年出生人口23100427人;1992年出生人口18752106人
   1983年出生人口20065048人;1993年出生人口17914756人
   1984年出生人口20313426人;1994年出生人口16470140人
   1985年出生人口20429326人;1995年出生人口16933559人
   1986年出生人口23190076人;1996年出生人口15224282人
   1987年出生人口25282644人;1997年出生人口14454335人
   1988年出生人口24576191人;1998年出生人口14010711人
   1989年出生人口25137678人;1999年出生人口11495247人。
  
   题外话,看了人口结构,大家也应该会算算房价会涨到哪一年,会从哪一年开始下跌。80后大学生真的很悲惨! 现在看不到希望的一群年轻人,未来身上负担最重的一群中年人。       
        呜呼哀哉!仰天一声长叹,不怨生不逢时,只求活得更好,不在绝望中愤青,就在绝望中打盹。即兴吟诗一首,以慰我等悲戚之心。

         堆砌的记忆      
     痛一层      
     乐一层      
     缝中塞着个傻傻的笑      
   

         吹过的风儿      
     凉一丝      
     暖一丝     
    眼前飘着个忽忽的望
        
    一千年的流光和着下一秒      
    跃一跃       
    摸了一手的亮(不是电灯泡)

附:
1、本文中所指80后不包括占13亿人口极少数的官员和富人子女。他们的前途比十五的月亮都光明。
2、文中数据参考中信出版社最新出版《异类》(Outliers)一书。

posted @ 2010-01-08 09:45 雪山飞鹄 阅读(11244) | 评论 (22)编辑 收藏

哥去微软面试,第一句话就被赶出来了
考官:windows 7专业版在中国大陆的零售价是多少? 
我:5元 
考官:出去,下一位

我投啊投啊,
终于得到了google面试的机会
但是,去google面试,才回答一个问题就又被赶出来了... 
考官:你从哪得到google面试的消息 
我:百度的 
考官:出去,下一位

托朋友找到了麦当劳的工作。。
但是对方很变态,让我唱麦当劳的歌曲,
当时哥就笑了,麦当劳的歌曲我从小就会。
于是我张口就来:有了肯德基,生活好滋味!
考官:出去~~~~~~~~~ 

麦当劳面试失败了。
我妈妈拖人找了一个移动客服的工作,
妈妈说这个不要技术,你先试试,我想都没想就答应了。
面试很顺利,对方也很欣赏我,最后考官对我说:
你很不错,请留下你的电话,我们好通知你上班。
我:“130......."
考官:出去。。。。
哥心都碎了。。。失业这么久,吃家里的,喝家里的。
家人看我的眼光都带着一点无奈。

一次次的失败,并没有打击我的信心,
于是我静下心来,苦苦学习,终于以优异的成绩考上了我们地方的公务员。
不过,TMD还是要面试。
面试过程中我对答入流,看见考官的脸,我觉得这次工作没有问题了。
正在高兴的时候。
考官问我:小伙子,你最喜欢那个历史人物啊。
我想都没想就回答:和珅!
考官:出去。 

这一次的失败,我对人生有了很重要的考虑,回顾以前的种种,
我终于发现,最最关键的就是,我有一些问题答的不对。
不过这一次的面试,我可是做好了最充分的准备。
NOKIA的产品部门通知了我,我花了一周的时间做好了全部的工作。
甚至口号都没有喊错:科技以人为本。
考官很满意说:如果不出意外的话,你明天就可以来上班。
这个时候,电话响了,出现了一个不和谐的声音:"hallo moto" 
考官:出去。

posted @ 2010-01-05 11:06 雪山飞鹄 阅读(3087) | 评论 (9)编辑 收藏


声明:此文转载至“熔 岩” 博客http://lavasoft.blog.51cto.com/

考虑到网页形式不方便阅读,本人特整理成pdf版文档,欢迎下载   点我下载pdf版文档
文档列表如下:
Java线程:概念与原理
Java线程:创建与启动
Java线程:线程栈模型与线程的变量
Java线程:线程状态的转换
Java线程:线程的同步与锁
Java线程:线程的交互
Java线程:线程的调度-休眠
Java线程:线程的调度-优先级
Java线程:线程的调度-让步
Java线程:线程的调度-合并
Java线程:线程的调度-守护线程
Java线程:线程的同步-同步方法
Java线程:线程的同步-同步块
Java线程:并发协作-生产者消费者模型
Java线程:并发协作-死锁
Java线程:volatile关键字
Java线程:新特征-线程池
Java线程:新特征-有返回值的线程
Java线程:新特征-锁(上)
Java线程:新特征-锁(下)
Java线程:新特征-信号量
Java线程:新特征-阻塞队列
Java线程:新特征-阻塞栈
Java线程:新特征-条件变量
Java线程:新特征-原子量
Java线程:新特征-障碍器
Java线程:大总结



本文出自 “熔 岩” 博客http://lavasoft.blog.51cto.com/

posted @ 2009-12-31 09:57 雪山飞鹄 阅读(1983) | 评论 (3)编辑 收藏

<<无间道>>

程序员版

不,我不愿意敲完,我还没有敲完
无止境的调试,看着我没敲完的代码
已经忘了错在何处
谁能改变程序的错误
谁知道正确有多么遥远
谁了解调试往往比命运还残酷
只是没有人愿意调完
我们都在不断调试
忘记了出错
在失望中追求正确的代码
我们都在代码中解脱
程序的苦
流浪在编译器处
找不到错误 回到原点
相守那有错误的代码


谁能改变程序员的命运
谁知道调试有多么恐怖
谁了解调试往往比命运还残酷
只是没有人愿意敲下去
我们都在不断调试
忘记了错误
在失望中追求正确的代码
我们都在代码解脱
程序的苦
流浪在编译器处
找不到错误 回到原点
相守那有错误的代码
一路上敲来难得错误
一路上调试难得正确
在这条程序员的路
让我想起代码,怎么会不麻木
我麻木不在乎

posted @ 2009-12-30 10:54 雪山飞鹄 阅读(1871) | 评论 (6)编辑 收藏

    有研究xwiki的吗?小弟最近在看xwiki,看的一头雾水,搜遍google及baidu未见任何有价值的东西.除了官方的破垃圾文档,写的乱七八糟外,没任何有参考意义的书籍.有用过的大哥能否给小弟指点一二,小弟十分感谢!!!
Mail:sxyx2008@gmail.com
QQ:184675420

posted @ 2009-12-28 10:24 雪山飞鹄 阅读(1402) | 评论 (1)编辑 收藏

异常摘要:
JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/D:/tomcat-6.0.18/webapps/xwiki/WEB-INF/lib/jaxb-impl-2.1.10.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.1 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)


运行环境:
Jdk1.6+tomcat6.0.18+windows xp sp3+xwiki


详细的异常信息:
javax.servlet.ServletException: Servlet execution threw an exception
 com.xpn.xwiki.wysiwyg.server.filter.XWikiContextInitializationFilter.doFilter(XWikiContextInitializationFilter.java:87)
 com.xpn.xwiki.web.ActionFilter.doFilter(ActionFilter.java:117)
 com.xpn.xwiki.plugin.webdav.XWikiDavFilter.doFilter(XWikiDavFilter.java:68)
 com.xpn.xwiki.web.SavedRequestRestorerFilter.doFilter(SavedRequestRestorerFilter.java:295)
 com.xpn.xwiki.web.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:112)

root cause
java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/D:/tomcat-6.0.18/webapps/xwiki/WEB-INF/lib/jaxb-impl-2.1.10.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.1 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)
 com.sun.xml.bind.v2.model.impl.ModelBuilder.<clinit>(ModelBuilder.java:173)
 com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:431)
 com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:288)
 com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1111)
 com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
 com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 java.lang.reflect.Method.invoke(Method.java:597)
 javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:210)
 javax.xml.bind.ContextFinder.find(ContextFinder.java:368)
 javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
 javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
 org.restlet.ext.jaxrs.internal.provider.AbstractJaxbProvider.getJaxbContext(AbstractJaxbProvider.java:63)
 org.restlet.ext.jaxrs.internal.provider.AbstractJaxbProvider.marshal(AbstractJaxbProvider.java:84)
 org.restlet.ext.jaxrs.internal.provider.JaxbProvider.writeTo(JaxbProvider.java:106)
 org.restlet.ext.jaxrs.internal.wrappers.provider.SingletonProvider.writeTo(SingletonProvider.java:335)
 org.restlet.ext.jaxrs.internal.util.JaxRsOutputRepresentation.write(JaxRsOutputRepresentation.java:105)
 com.noelios.restlet.http.HttpServerCall.writeResponseBody(HttpServerCall.java:492)
 com.noelios.restlet.http.HttpServerCall.sendResponse(HttpServerCall.java:428)
 com.noelios.restlet.ext.servlet.ServletCall.sendResponse(ServletCall.java:407)
 com.noelios.restlet.http.HttpServerConverter.commit(HttpServerConverter.java:391)
 com.noelios.restlet.http.HttpServerHelper.handle(HttpServerHelper.java:148)
 com.noelios.restlet.ext.servlet.ServerServlet.service(ServerServlet.java:881)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 com.xpn.xwiki.wysiwyg.server.filter.XWikiContextInitializationFilter.doFilter(XWikiContextInitializationFilter.java:87)
 com.xpn.xwiki.web.ActionFilter.doFilter(ActionFilter.java:117)
 com.xpn.xwiki.plugin.webdav.XWikiDavFilter.doFilter(XWikiDavFilter.java:68)
 com.xpn.xwiki.web.SavedRequestRestorerFilter.doFilter(SavedRequestRestorerFilter.java:295)
 com.xpn.xwiki.web.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:112)


罪魁祸首:
 jaxb-impl-2.1.10.jar
 jaxb-api-2.1.jar

解决方案:
    在jdk6的环境中,若在web应用中使用以上两个jar包,你需要把jaxb-impl-2.1.10.jar放到jdk的lib目录下即可解决该异常

posted @ 2009-12-24 16:10 雪山飞鹄 阅读(2967) | 评论 (0)编辑 收藏

  jQuery表单插件 jQuery.form                                           本文电子文档下载

这是一个全面支持表单的jQuery插件,支持文件上传,包含以下一些方法:

-ajaxForm
-ajaxSubmit
- formToArray
- formSerialize
- fieldSerialize
- fieldValue
- clearForm
- clearFields
- resetForm

使用时你必须依次引入jquery.jsjquery.form.js,并且顺序不能颠倒

示例代码:

// wait for the DOM to be loaded 
$(document).ready(function() {  
   // bind 'myForm' and provide a simple callback function   
   $('#myForm').ajaxForm(function() {   
       alert("Thank you for your comment!");  
    }); 
}); 


项目主页: http://malsup.com/jquery/form/
下载地址: http://malsup.com/jquery/form/jquery.form.js


表单插件API

英文原文:http://www.malsup.com/jquery/form/#api

表单插件API提供了几个方法,让你轻松管理表单数据和进行表单提交。

ajaxForm()

增加所有需要的事件监听器,为AJAX提交表单做好准备。ajaxForm不能提交表单。在documentready函数中,使用ajaxForm来为AJAX提交表单进行准备。ajaxForm接受0个或1个参数。这个单个的参数既可以是一个回调函数,也可以是一个Options对象。
可链接(Chainable):可以。

实例:

$('#myFormId').ajaxForm();

ajaxSubmit()

马上由AJAX来提交表单。大多数情况下,都是调用ajaxSubmit来对用户提交表单进行响应。ajaxSubmit接受0个或1个参数。这个单个的参数既可以是一个回调函数,也可以是一个Options对象。
可链接(Chainable):可以。

实例:

// 绑定表单提交事件处理器
$('#myFormId').submit(function() {
    // 提交表单
    $(this).ajaxSubmit();
    // 为了防止普通浏览器进行表单提交和产生页面导航(防止页面刷新?)返回false
    return false;
   });

formSerialize()

将表单串行化(或序列化)成一个查询字符串。这个方法将返回以下格式的字符串:name1=value1&name2=value2
可链接(Chainable):不能, 这个方法返回一个字符串。

实例:

var queryString = $('#myFormId').formSerialize();

// 现在可以使用$.get$.post$.ajax等来提交数据
$.post('myscript.php', queryString);

fieldSerialize()

将表单的字段元素串行化(或序列化)成一个查询字符串。当只有部分表单字段需要进行串行化(或序列化)时,这个就方便了。这个方法将返回以下格式的字符串:name1=value1&name2=value2
可链接(Chainable):不能,这个方法返回一个字符串。

实例:

var queryString = $('#myFormId .specialFields').fieldSerialize();


fieldValue()

返回匹配插入数组中的表单元素值。从0.91版起,该方法将总是以数组的形式返回数据。如果元素值被判定可能无效,则数组为空,否则它将包含一个或多于一个的元素值。
可链接(Chainable):不能,该方法返回数组。

实例:

// 取得密码输入值
var value = $('#myFormId :password').fieldValue(); 
alert('The password is: ' + value[0]); 


resetForm()

通过调用表单元素原有的DOM方法,将表单恢复到初始状态。
可链接(Chainable):可以。

实例:

$('#myFormId').resetForm();


clearForm()

清除表单元素。该方法将所有的文本(text)输入字段、密码(password)输入字段和文本区域(textarea)字段置空,清除任何select元素中的选定,以及将所有的单选(radio)按钮和多选(checkbox)按钮重置为非选定状态。
可链接(Chainable):可以。

$('#myFormId').clearForm();


clearFields()

清除字段元素。只有部分表单元素需要清除时才方便使用。
可链接(Chainable):可以。

$('#myFormId .specialFields').clearFields();

Options对象

ajaxFormajaxSubmit都支持众多的选项参数,这些选项参数可以使用一个Options对象来提供。Options只是一个JavaScript对象,它包含了如下一些属性与值的集合:

target

指明页面中由服务器响应进行更新的元素。元素的值可能被指定为一个jQuery选择器字符串,一个jQuery对象,或者一个DOM元素。
默认值:null

url

指定提交表单数据的URL
默认值:表单的action属性值

type

指定提交表单数据的方法(method):“GET”“POST”
默认值:表单的method属性值(如果没有找到默认为“GET”)。

beforeSubmit

表单提交前被调用的回调函数。“beforeSubmit”回调函数作为一个钩子(hook),被提供来运行预提交逻辑或者校验表单数据。如果“beforeSubmit”回调函数返回false,那么表单将不被提交。“beforeSubmit”回调函数带三个调用参数:数组形式的表单数据,jQuery表单对象,以及传入ajaxForm/ajaxSubmit中的Options对象。表单数组接受以下方式的数据:

[ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]

默认值:null

success

表单成功提交后调用的回调函数。如果提供“success”回调函数,当从服务器返回响应后它被调用。然后由dataType选项值决定传回responseText还是responseXML的值。
默认值:null

dataType

期望返回的数据类型。null“xml”“script”或者“json”其中之一。dataType提供一种方法,它规定了怎样处理服务器的响应。这个被直接地反映到jQuery.httpData方法中去。下面的值被支持:

'xml':如果dataType == 'xml',将把服务器响应作为XML来对待。同时,如果“success”回调方法被指定, 将传回responseXML值。

'json':如果dataType == 'json' 服务器响应将被求值,并传递到“success”回调方法,如果它被指定的话。

'script':如果dataType == 'script' 服务器响应将求值成纯文本。

默认值:null(服务器返回responseText值)

semantic

Boolean flag indicating whether data must be submitted in strict semantic order (slower). Note that the normal form serialization is done in semantic order with the exception of input elements of type="image". You should only set the semantic option to true if your server has strict semantic requirements and your form contains an input element of type="image".
布尔标志,表示数据是否必须严格按照语义顺序(slower?)来进行提交。注意:一般来说,表单已经按照语义顺序来进行了串行化(或序列化),除了type="image"input元素。如果你的服务器有严格的语义要求,以及表单中包含有一个type="image"input元素,就应该将semantic设置为true。(译注:这一段由于无法理解,翻译出来可能语不达意,但请达人指正。)
默认值:false

resetForm

布尔标志,表示如果表单提交成功是否进行重置。
Default value: null

clearForm

布尔标志,表示如果表单提交成功是否清除表单数据。
默认值:null

实例:

// 准备好Options对象
var options = {
    target:     '#divToUpdate',
    url:        'comment.php',
    success: function() {
      alert('Thanks for your comment!');
    } };

   // options传给ajaxForm
$('#myForm').ajaxForm(options);


注意:Options对象还可以用来将值传递给jQuery$.ajax方法。如果你熟悉$.ajax所支持的options,你可以利用它们来将Options对象传递给ajaxFormajaxSubmit

ajaxForm()适用于以表单提交方式处理ajax技术(需要提供表单的actionidmethod,最好在表单中提供submit按钮)它大大简化了使用ajax技术提交表单时的数据传递问题,使用ajaxForm()你不需要逐个的以JavaScript的方式获取每个表单属性的值,并且也不需要在请求路径后面通过url重写的方式传递数据。ajaxForm()会自动收集当前表单中每个属性的值,然后将其以表单提交的方式提交到目标url。这种方式提交数据较安全,并且使用起来更简单,不必写过多冗余的JavaScript代码

$(document).ready(function(){

         registerForm'表单id

data回调数据

        $('#registerForm').ajaxForm(function(data){

            alert(data);//弹出ajax请求后的回调结果

        });

});

ajaxSubmit()适用于以事件的机制以ajax提交form表单(超链接、图片的click事件),该方法作用与ajaxForm()类似,但它更为灵活,因为他依赖于事件机制,只要有事件存在就能使用该方法。你只需指定该formaction属性即可,不需要提供submit按钮。

$(document).ready(function(){

    $('#btn').click(function(){

            $('#registerForm').ajaxSubmit(function(data){

                alert(data);

            });

            return false;

    });

    });

该段代码作用是在表单中idbtn的按钮click事件触发时通过ajaxSubmit()方法以ajax技术提交表单到表单的action所指路径

formSerialize()是将一个form所有的表单元素name作为keyvalue作为值进行序列化操作,这就需要你必须为每一个表单元素设置表单元素name属性及填充表单元素value的值,最好也设置id方便jquery定位表单元素。若要使用此方法你必须设置表单元素name属性及填充表单元素value的值,我在初次使用时就忘了设置name属性,最后在同事的帮助下找了好久才发现此错误。

var str=$('#registerForm').formSerialize(); // registerFormform id

alert(str);

fieldSerialize()是将form表单元素进行序列化以name作为keyvalue作为值进行序列化操作,这就需要你必须为每一个表单元素设置表单元素name属性及填充表单元素value的值。

var str=$('#username). fieldSerialize();

alert(str);

其他方法不做总结了,用的话大家在googlebaidu一下相信会有很多令你满意的答案的。
   本文电子文档下载

posted @ 2009-11-27 11:51 雪山飞鹄 阅读(5949) | 评论 (2)编辑 收藏

     摘要:   jsvalidation客户端JavaScript验证框架使用手册 jsvalidation.pdf  jsvalidationdemo.zip 1.       JSValidation是什么?        官方地址:http:/...  阅读全文
posted @ 2009-11-26 14:31 雪山飞鹄 阅读(4120) | 评论 (6)编辑 收藏

 

Hibernate org.hibernate.PropertyAccessException: exception setting property value with CGLIB异常分析及处理

异常信息:

Exception in thread "main" org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of com.dl.bean.Employee.setDepartment

    at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:215)

    at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:185)

    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3232)

    at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129)

    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)

    at org.hibernate.loader.Loader.doQuery(Loader.java:717)

    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)

    at org.hibernate.loader.Loader.doList(Loader.java:2145)

    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)

    at org.hibernate.loader.Loader.list(Loader.java:2024)

    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)

    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)

    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)

    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)

    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)

    at com.dl.test.EmployeeTest.main(EmployeeTest.java:26)

Caused by: net.sf.cglib.beans.BulkBeanException: com.dl.bean.Employee cannot be cast to com.dl.bean.Department

    at com.dl.bean.Employee$$BulkBeanByCGLIB$$a415f505.setPropertyValues(<generated>)

    at org.hibernate.tuple.PojoEntityTuplizer.setPropertyValuesWithOptimizer(PojoEntityTuplizer.java:212)

    ... 15 more

Caused by: java.lang.ClassCastException: com.dl.bean.Employee cannot be cast to com.dl.bean.Department

    ... 17 more

遇此异常很老火,当然第一件事就是在googlebaidu一把看能解决吧!

googlebaidu结果如下:

查询结果中包含null的值,对于一些数字或boolean包含null,定义该项时必须使用wrapper类型,而不能是primitive类型,例如使用Integer而不能是int,Boolean而不能是boolean否则会抛出exception

结论是:对于属性在set/get,属性值为null而出现该异常

我对此种说法不敢苟同,既然google上有这种说法相比就有它存在的道理。

从上述语句中我们得出结论:在写pojo类时最好选用包装类而不使用java中的基本数据类型,以免产生一些莫名其妙的错误(建议使用5.0以上的jdk版本)大家一直认为java是面向对象的语言,这句话在jdk1.4以前是有分歧的,大家都知道java8个基本数据类型不是对象,所以这么说还不够严谨,直到jdk5.0的诞生,这句话才勉强成立。我想这也是sun公为什么极力推荐使用包装类的缘故。

看来还得自己分析这个异常,那么首先从映射文件及pojo类来下手

Java代码:

publicclass Employee {

    private Integer id;

    private String empname;

    private Integer empage;

    private String context;

    private Integer deptid;

    private Department department=new Department();

     //省略set()get()方法

}

<hibernate-mapping package="com.dl.bean">

    <class name="Employee" table="employee">

         <id name="id" >

             <generator class="native"/>

         </id>

         <property name="empname"/>

         <property name="empage"/>

         <property name="context" />

         <property name="deptid" insert="false" update="false"/>

         <many-to-one name="department" column="deptid" cascade="all" class="Employee" /> //此处为错误的根源,这个错误很隐蔽,不仔细检查很难发现

    </class>

    </hibernate-mapping>

不知道至此大家发现错误了没,经过本人仔细检查以及分析以上pojo类及映射文件,发现在<many-to-one>标签中class属性配置出错了,正确的配置应为:

<many-to-one name="department" column="deptid" cascade="all" class="Department" />,到此问题彻底解决了,没什么技术含量,只是记下来,防止更多人走冤枉路

posted @ 2009-11-25 17:56 雪山飞鹄 阅读(6396) | 评论 (4)编辑 收藏

 

Hibernate级联查询(HQL)

拿雇员(Employee)与部门(Department)来举例子说明

1.1    数据库模型

1.1.1          Employee

DROP TABLE IF EXISTS employee;

CREATE TABLE employee (

 id int(11) NOT NULL auto_increment,

 empname varchar(255) default NULL,

 empage int(11) default NULL,

 context varchar(255) default NULL,

 deptid int(11) default NULL,

 PRIMARY KEY (id),

 KEY FK4722E6AEAD9148B6 (deptid)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

1.1.2          Department

DROP TABLE IF EXISTS department;

CREATE TABLE department (

 id int(11) NOT NULL auto_increment,

 deptname varchar(255) default NULL,

 PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

1.2    Java

publicclass Employee

{

    private Integer id;

    private String empname;

    private Integer empage;

    private String context;

    private Integer deptid;

    private Department department=new Department();

      //此处省略set()get()方法

}

publicclass Department

{

    private Integer id;

    private String deptname;

    private Set<Employee> employeeSet=new HashSet<Employee>();

//此处省略set()get()方法

}

1.3    映射文件

<hibernate-mapping package="com.dl.bean">

    <class name="Employee" table="employee">

         <id name="id" >

             <generator class="native"/>

         </id>

         <property name="empname"/>

         <property name="empage"/>

         <property name="context" />

         <property name="deptid" insert="false" update="false"/>

         <many-to-one name="department" column="deptid" cascade="all" class="Department" />

    </class>

    </hibernate-mapping>

<hibernate-mapping package="com.dl.bean">

    <class name="Department" table="department">

         <id name="id" >

             <generator class="native"/>

         </id>

         <property name="deptname" />

             <set name="employeeSet">

                 <key column="deptid"></key>

                 <one-to-many class="Employee"/>

             </set>

    </class>

    </hibernate-mapping>

1.4    在写Hibernate级联查询的HQL语句时,与传统的JDBC方式有着本质的区别

1.4.1          JDBC级联写法

SELECT * FROM employee INNER JOIN department ON employee.deptid= department.id

1.4.2          HQL级联写法

select

employee.id,

employee.empname,

employee.empage,

employee.context,

employee.department.deptname

from

Employee employee

inner join employee.department (此处与前文中Employee类中的属性名一致)

order by employee.id desc

注意红色字体部分,在传统的SQL语句中inner join后面跟级联的表,但在HQLinner join后面跟能反映出级联关系的字段属性(pojo中的名字必须高度保持一致),当存在级联时,Hibernate查询结果为一对象数组,其数组的长度取决于selectfrom之间字段的个数。

1.5    注意分析下面三条语句看有什么不同

SQLQuery方式

sqlquery=session.createSQLQuery("select employee.id,employee.empname,employee.empage,employee.context,department.deptname from employee inner join department on employee.deptid=department.id");

Query方式:

session.createQuery("select employee.id,employee.empname,employee.empage,employee.context,employee.department.deptname from Employee employee inner join employee.department order by employee.id desc");

Query方式:

Query query=session.createQuery("select employee.empname, employee.department from Employee as employee order by employee.id desc");


电子文档下载
posted @ 2009-11-25 16:24 雪山飞鹄 阅读(5189) | 评论 (0)编辑 收藏

仅列出标题
共22页: First 上一页 14 15 16 17 18 19 20 21 22 下一页