今天用三个有外键关系的表建立Hibernate,出现一个错误,在网络上查了几个小时,碰壁无数次,终于解决,记录如下
问题描述:
程序不出错,不过不处理HibernateException时程序会出错,并将错误输出到浏览器页面,提示错误行为session(hibernate session)的第一次引用行。可疑代码段:
try {
Configuration cf = new Configuration().configure();
sess = cf.buildSessionFactory().openSession();
} catch (HibernateException e) {
System.out.println("session建立失败:" + e.getMessage());
e.getStackTrace();
return null;
}
碰壁历程:
检查服务器信息,有一个提示最先引起我的注意
INFO [Configuration] Configured SessionFactory: null
其实这个提示是正常的,并不影响程序正常运行
接下来,查找可疑的捕获异常部分代码
catch (HibernateException e) {
System.out.println("session建立失败:" + e.getMessage ());
e.getStackTrace();
}
这里的e.getStackTrace();不能将错误内容输出到服务器,e.getMessage()输出信息如下,其中NewsContent是一个表,有外键指向User表中的一个列:
[STDOUT] session建立失败:Association references unmapped class: pro.news2cms.hibernate.NewsContent
同时,我发现Session对象不能建立,在DEBUG中查寻到的可疑情况是:
表达式: cf.buildSessionFactory()
结果: An exception occurred: org.hibernate.MappingException
同时,服务器输出(newContent是一个表名,它拥有一个外键,指向Users中的一个列):
INFO [HbmBinder] Mapping collection: pro.news2cms.hibernate.Users.newsContents -> news_content
另外,服务器输出中有一下记录(个人认为这是问题的关键)
Association references unmapped class
目前成功的解决方法:
Configuration cf = new Configuration().configure();
cf.addClass (pro.news2cms.hibernate.LogUser.class);
总结:
提示说明hibernate的信息不足以确定全部必要的类,map信息不完整,手动添加addClass是我不希望的行为,因为一旦数据库内容有变动,这里的代码也要受到影响。虽然目前只能如此解决,但我认为应该在相应的.bhm.xml文件中存在问题,如果相应修改,应该可以有更好的解决方法。
2007年3月19日星期一
2007年3月9日星期五
编译和安装自由软件
简介
自由(free)软件和授权(proprietary)软件之间的差别在于使用软件的源文件。(由于一些版权软件也提供源文件,所以这不是绝对的。但除非成为自由软件,它的最终用户还是不可以随意改变其代码的。)那意味着自由软件以源代码文档方式公布。这对于初学者来讲是很陌生的,因为自由软件的用户在使用软件之前需要自己动手编译软件。
对于现有的大部分自由软件来讲,都有已经编译好的版本。如果用户比较着急,那么可以直接安装这些已经编译好的二进制文件。而一些自由软件并不是以这种形式公布的,也可能是因为早期版本,还没来得及被编译成二进制文件形式。另外,如果你使用的是其他操作系统,或者其他结构(建筑物?),那么许多软件的已编译版本会不适合你。另外,如果你自己编译软件,你可以只编译自己感兴趣的部分,或者通过添加额外的部分来完成其他功能,以便使这个软件真正适合你。
需求
编译软件,你需要:
编译
原理
要把一个源文件编译成二进制文件,编译版本需要首先完成 (通常是c或c++源文件,这是在自由软件交流中最广泛使用的语言(UNIX下) 。)。一些自由软件是由不需要编译的语言编写的 (例如 Per 或 shell),但是他们仍然会需要进行一些配置工作。
C编译版在逻辑上是由C语言编译器制作的,通常是gcc,这是一个由GNU Project 写出来的免费编译器。变异一个完成的软件包是一个复杂的项目,那需要通过许多不同源文件的连续的编译版制作完成(对于程序员来讲,这比把他的程序分解为不同部分所带来的各种各样麻烦要容易解决得多)。为了使这些对你来说更简单,这些重复的工作将交给一个叫做制作(make)的东东来摆平。
编译的四个步骤:
为了理解编译器是如何工作的(为了解决可能发生的问题),你需要知道相关的步骤。对象被一点一点的转化成由人们可以理解的语言写成的文本文件(即C语言),再成为一种计算机可以理解的语言(可能在某种情况下一些受过非常非常好的训练的人也能读懂)。gcc依次完成以下四个步骤:
自由(free)软件和授权(proprietary)软件之间的差别在于使用软件的源文件。(由于一些版权软件也提供源文件,所以这不是绝对的。但除非成为自由软件,它的最终用户还是不可以随意改变其代码的。)那意味着自由软件以源代码文档方式公布。这对于初学者来讲是很陌生的,因为自由软件的用户在使用软件之前需要自己动手编译软件。
对于现有的大部分自由软件来讲,都有已经编译好的版本。如果用户比较着急,那么可以直接安装这些已经编译好的二进制文件。而一些自由软件并不是以这种形式公布的,也可能是因为早期版本,还没来得及被编译成二进制文件形式。另外,如果你使用的是其他操作系统,或者其他结构(建筑物?),那么许多软件的已编译版本会不适合你。另外,如果你自己编译软件,你可以只编译自己感兴趣的部分,或者通过添加额外的部分来完成其他功能,以便使这个软件真正适合你。
需求
编译软件,你需要:
- 一台有着可以正常使用的操作系统的计算机
- 一些对于你所使用的操作系统的常识
- 一些磁盘空间
- 一个编译器(通常是c语言的编译器)和一个archiver (tar)
- 一些吃的(有时候,这会花费很长的时间)。真正的黑客吃的是皮萨,而不是曲奇烤饼。
- 一些喝的(理由同上)。真正的黑客喝的是苏打水,而不是咖啡因类饮料。
- 一个技术人员的电话号码——这个技术人员每星期都会重新编译他的系统内核。
- 非常的仔细。对于这一点的需求是非常多的。
编译
原理
要把一个源文件编译成二进制文件,编译版本需要首先完成 (通常是c或c++源文件,这是在自由软件交流中最广泛使用的语言(UNIX下) 。)。一些自由软件是由不需要编译的语言编写的 (例如 Per 或 shell),但是他们仍然会需要进行一些配置工作。
C编译版在逻辑上是由C语言编译器制作的,通常是gcc,这是一个由GNU Project 写出来的免费编译器。变异一个完成的软件包是一个复杂的项目,那需要通过许多不同源文件的连续的编译版制作完成(对于程序员来讲,这比把他的程序分解为不同部分所带来的各种各样麻烦要容易解决得多)。为了使这些对你来说更简单,这些重复的工作将交给一个叫做制作(make)的东东来摆平。
编译的四个步骤:
为了理解编译器是如何工作的(为了解决可能发生的问题),你需要知道相关的步骤。对象被一点一点的转化成由人们可以理解的语言写成的文本文件(即C语言),再成为一种计算机可以理解的语言(可能在某种情况下一些受过非常非常好的训练的人也能读懂)。gcc依次完成以下四个步骤:
- cpp:作为第一步,这时会把指令重新按照纯c结构编排一遍。标准情况下,也就是插入头文件(#include)和定义宏(#define)。在这个步骤结束时,纯C编码被编排好了。
- ccl:这一步是把C语言编码转换为汇编语言编码。产生出来的编码是以目标结构编排的。
- as:这一步从汇编语言中编排出对象编码(或者二进制编码)。在这一步结束后,会产生出一个.o文件。
- ld:链接是最后一步,这时把所有的对象文件(.o)和有关的库文件链接起来,并生成一个可执行文件。
- 一个正确的自由软件发布版的结构总是有着相似的组织形式:
- 一个INSTALL文件,用来描述安装过程。
- 一个README文件,包含关于程序的常用信息(简短描述,作者,获得网址,相关文档,有用链接,等)。如果没有安装文件,说明文档通常会包含关于安装过程的摘要
- 一个COPYING文件,包含关于这个软件的许可或者发布信息的描述。有时会被许可文件代替,但也会包含相同内容。
- 一个CONTRIB或CREDITS文件(也就是鸣谢),列出了该软件的相关人员(参与人员,相关的注释,第三方程序,等)。
- 一个CHANGES文件(有时,是一个NEWS文件),包含最新的改进和排除的错误。
- 一个Makefile文件,标明软件的可编辑部分(这对于make来说是十分必要的文件),如果最初这个文件并不存在,那么它会通过预编辑配置处理。
- 一个configure 或者Imakefile文件,允许你位特殊的系统生成一个新的Makefile文件。
- 一个包含源文件的文件夹,二进制文件通常保存在编译版本的结尾。文件夹名同常为src。
- 一个包含与程序相关文档的文件夹(通常以man或texinfo的格式保存),文件夹名同常为doc。
- 有时还会有一个包含关于软件的特殊数据的文件夹(标准配置文件,处理的数据样例,或者源文件什么的)。
2007年3月2日星期五
墨菲法则
墨菲法则产生于美国。事情发生在1949年,一位名叫墨菲的空军上尉工程师,认为他的一位同事是个倒霉蛋,不经意地说了一句话;"如果一件事情有可能被弄糟,让他去做就一定会弄糟"。这句笑话在美国迅速流传,并扩散到世界各地,最后演变成有趣的墨菲法则:假定你把一片干面包掉在地毯上,这片面包的两面 均可能着地。但假定你把一片一面涂有一层果酱的面包掉在地毯上,常常是带有果酱的一面落在地毯上(麻烦)。换一种说法:如果某件事有可能变坏的话,这种可能就会成为现实。墨菲法则的适用范围非常广泛,它揭示了一种独特的社会及自然现象。
总 则
一、别试图教牛唱歌,这样不但不会有结果,还会惹牛不高兴
二、别跟傻瓜吵架,不然旁人会搞不清楚,到底谁是傻瓜
三、不要以为自已很重要,因为没有你,太阳明天还是一样从东方升上来
开宗明义
墨菲定律:凡事只要有可能出错,那就一定会出错。
墨菲哲学:笑一笑,明天未必比今天好。
墨菲准则:东西越好,越不中用。
开始
好的开始,未必就有好结果。
坏的开始,结果往往会更糟。
借钱
你若帮助了一个急需用钱的朋友,他一定会记得你――在他下次急需用钱的时候。
智愚之间
有能力的――让他做。
没能力的――教他做。
做不来的――管理他。
爱 情
你爱上的人,总以为你爱上他是因为,他使你想起你的老情人。
你最后硬着头皮寄出的情书,寄达对方的时间有多长,你反悔的时间就有多长。
早到与晚到
你早到了,会议却取消。
你准时到,却还要等。
迟到,就是迟了。 `
东西
东西久久都派不上用场,就可以丢掉。
东西一丢掉,往往就必须要用它。
你丢掉东西时,最先去找的地方,往往也是可能找到的最后一个地方。
你往往会找到不是你正想找的东西。
精彩
你出去买爆米花的时候,银幕上偏偏就出现了精彩镜头。
排队
另一排总是动的比较快。
你换到另一排,你原来站的那一排,就开始动的比较快了。
你站的越久,越有可能是站错了排。
失事报导
失事的地点越远,伤亡的人数就得越多,否则写不成一则故事。
携伴出游
你携伴出游,越不想让人看见,越会遇见熟人。
相对论
一分钟有多长?
这要看你是蹲在厕所里面,还是等在厕所外面。
品质保证
一种产品保证60天不会故障,等于保证第61天一定就会坏掉。
总 则
一、别试图教牛唱歌,这样不但不会有结果,还会惹牛不高兴
二、别跟傻瓜吵架,不然旁人会搞不清楚,到底谁是傻瓜
三、不要以为自已很重要,因为没有你,太阳明天还是一样从东方升上来
开宗明义
墨菲定律:凡事只要有可能出错,那就一定会出错。
墨菲哲学:笑一笑,明天未必比今天好。
墨菲准则:东西越好,越不中用。
开始
好的开始,未必就有好结果。
坏的开始,结果往往会更糟。
借钱
你若帮助了一个急需用钱的朋友,他一定会记得你――在他下次急需用钱的时候。
智愚之间
有能力的――让他做。
没能力的――教他做。
做不来的――管理他。
爱 情
你爱上的人,总以为你爱上他是因为,他使你想起你的老情人。
你最后硬着头皮寄出的情书,寄达对方的时间有多长,你反悔的时间就有多长。
早到与晚到
你早到了,会议却取消。
你准时到,却还要等。
迟到,就是迟了。 `
东西
东西久久都派不上用场,就可以丢掉。
东西一丢掉,往往就必须要用它。
你丢掉东西时,最先去找的地方,往往也是可能找到的最后一个地方。
你往往会找到不是你正想找的东西。
精彩
你出去买爆米花的时候,银幕上偏偏就出现了精彩镜头。
排队
另一排总是动的比较快。
你换到另一排,你原来站的那一排,就开始动的比较快了。
你站的越久,越有可能是站错了排。
失事报导
失事的地点越远,伤亡的人数就得越多,否则写不成一则故事。
携伴出游
你携伴出游,越不想让人看见,越会遇见熟人。
相对论
一分钟有多长?
这要看你是蹲在厕所里面,还是等在厕所外面。
品质保证
一种产品保证60天不会故障,等于保证第61天一定就会坏掉。
-- 转自资本市场 手眼通天的墨菲法则
这些都是些很绝妙的玩笑话,不过只适合用来抱怨,以及提醒自己保持冷静和警觉而已
如果真的信奉了这些,那么人的心里就有了毛病――悲观和绝望――这会消磨掉信心和决心
这些理论几乎是和一切"主动态度万岁"的观点背道而驰
不是没用:事情发生之前,把灾难扩大,把希望缩小,可以帮助保持冷静,不会容易放掉即将到手的胜利,也不会因为失望而太过伤心
不能乱用:事情已经发生了,或者必须将发生的时候,无论什么样的悲观态度都不能挽救错误和弥补损失。这时候第一要务是坚持把事情完成,至少坚持到把损失减到最小
如果真的信奉了这些,那么人的心里就有了毛病――悲观和绝望――这会消磨掉信心和决心
这些理论几乎是和一切"主动态度万岁"的观点背道而驰
不是没用:事情发生之前,把灾难扩大,把希望缩小,可以帮助保持冷静,不会容易放掉即将到手的胜利,也不会因为失望而太过伤心
不能乱用:事情已经发生了,或者必须将发生的时候,无论什么样的悲观态度都不能挽救错误和弥补损失。这时候第一要务是坚持把事情完成,至少坚持到把损失减到最小
2007年3月1日星期四
FSTAB 和 MTAB 文件
这是两个很危险的文件!没有他们,计算机将找不到驱动器设备和分区。修改前一定要做好备份。
/etc/fstab
本文件描述了各种不同的文件系统。"fsck"和"mount"等命令都需要这些文件才能工作。看起来有点复杂,不过其实只要我们把这个文件拆分成下面几个部分后,一切都会变得很清晰。清往下看:
(另一种理解:/etc/fstab 文件的存在价值就是,让计算机内的程序能知道如何寻找各个分区)
例:
< 分区 >< 挂载点 >< 文件系统 > < 选项 >< dump >< fsck order >
/dev/hdb1 . . . . / . . . . . . . . . . . . ext3 . . . . . . . . . defaults . . . . . . . 1 . . . . . . . . . 1
/dev/hdb6 . . . . /home. . . . . . . ext3 . . . . . . . . . defaults . . . . . . . 1 . . . . . . . . . 2
/dev/hdb5 . . . . swap . . . . . . . . swap . . . . . . . . defaults . . . . . . . 0 . . . . . . . . . 0
/dev/hda1 . . . . /mnt/win_c vfat . . . iocharset=iso8859-1,codepage=850,umask=0 0 0
none . /mnt/cdrom . . supermount dev=/dev/hdc,fs=auto,ro,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
none . /mnt/floppy supermount dev=/dev/fd0,fs=auto,--,iocharset=iso8859-1,sync,codepage=850,umask=0 0 0
/dev/sda1 /mnt/memory_card auto user,iocharset=iso8859-1,kudzu,codepage=850,noauto,umask=0,exec 0 0
前面列比较好理解,<分区><jiazaidian><文件系统><加载选项>。比较特殊的是最后两列,重点说明一下
dump:转存列,被转存工具调用,用来决定是否备份文件系统。1表示备份,0表示不备份。本文档不会涉及转存工具的工作细节。
fsck order:fsck顺序列,表明系统启动时,fsck 检查文件系统的顺序。0表示不检查,CD和软盘之类的可以动存储设备需要指定为这个值。大于1的值告诉fsck启动时需要检查这个文件系统。数字大小决定开机时检测这个文件系统的顺序。
/etc/mtab
这个文件记录已经加载的设备,本文件在 mount 命令执行后自动更新
另外,本文件和 fstab看起来很相像,但是又不完全相同(注意 rw 和 ro 是 keduxie 和 只读 的意思),本文件中列出的,都是已经加载好的设备
例:
/dev/hdb1 / ext3 rw 0 0
none /proc proc rw 0 0
none /proc/bus/usb usbdevfs rw 0 0
none /dev devfs rw 0 0
none /dev/pts devpts rw,mode=0620 0 0
/dev/hdb6 /home ext3 rw 0 0
none /mnt/cdrom supermount ro,dev=/dev/hdc,fs=auto,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
none /mnt/cdrom2 supermount ro,dev=/dev/scd0,fs=auto,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
none /mnt/floppy supermount rw,sync,dev=/dev/fd0,fs=auto,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
/dev/hda1 /mnt/windows vfat rw,iocharset=iso8859-1,codepage=850,umask=0 0 0
/dev/hdb7 /usr ext3 rw 0 0
/dev/sda1 /mnt/memory_card vfat rw,nosuid,nodev,iocharset=iso8859-15,codepage=850,umask=0,user=julia 0 0
/etc/fstab
本文件描述了各种不同的文件系统。"fsck"和"mount"等命令都需要这些文件才能工作。看起来有点复杂,不过其实只要我们把这个文件拆分成下面几个部分后,一切都会变得很清晰。清往下看:
(另一种理解:/etc/fstab 文件的存在价值就是,让计算机内的程序能知道如何寻找各个分区)
例:
< 分区 >< 挂载点 >< 文件系统 > < 选项 >< dump >< fsck order >
/dev/hdb1 . . . . / . . . . . . . . . . . . ext3 . . . . . . . . . defaults . . . . . . . 1 . . . . . . . . . 1
/dev/hdb6 . . . . /home. . . . . . . ext3 . . . . . . . . . defaults . . . . . . . 1 . . . . . . . . . 2
/dev/hdb5 . . . . swap . . . . . . . . swap . . . . . . . . defaults . . . . . . . 0 . . . . . . . . . 0
/dev/hda1 . . . . /mnt/win_c vfat . . . iocharset=iso8859-1,codepage=850,umask=0 0 0
none . /mnt/cdrom . . supermount dev=/dev/hdc,fs=auto,ro,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
none . /mnt/floppy supermount dev=/dev/fd0,fs=auto,--,iocharset=iso8859-1,sync,codepage=850,umask=0 0 0
/dev/sda1 /mnt/memory_card auto user,iocharset=iso8859-1,kudzu,codepage=850,noauto,umask=0,exec 0 0
前面列比较好理解,<分区><jiazaidian><文件系统><加载选项>。比较特殊的是最后两列,重点说明一下
dump:转存列,被转存工具调用,用来决定是否备份文件系统。1表示备份,0表示不备份。本文档不会涉及转存工具的工作细节。
fsck order:fsck顺序列,表明系统启动时,fsck 检查文件系统的顺序。0表示不检查,CD和软盘之类的可以动存储设备需要指定为这个值。大于1的值告诉fsck启动时需要检查这个文件系统。数字大小决定开机时检测这个文件系统的顺序。
/etc/mtab
这个文件记录已经加载的设备,本文件在 mount 命令执行后自动更新
另外,本文件和 fstab看起来很相像,但是又不完全相同(注意 rw 和 ro 是 keduxie 和 只读 的意思),本文件中列出的,都是已经加载好的设备
例:
/dev/hdb1 / ext3 rw 0 0
none /proc proc rw 0 0
none /proc/bus/usb usbdevfs rw 0 0
none /dev devfs rw 0 0
none /dev/pts devpts rw,mode=0620 0 0
/dev/hdb6 /home ext3 rw 0 0
none /mnt/cdrom supermount ro,dev=/dev/hdc,fs=auto,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
none /mnt/cdrom2 supermount ro,dev=/dev/scd0,fs=auto,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
none /mnt/floppy supermount rw,sync,dev=/dev/fd0,fs=auto,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
/dev/hda1 /mnt/windows vfat rw,iocharset=iso8859-1,codepage=850,umask=0 0 0
/dev/hdb7 /usr ext3 rw 0 0
/dev/sda1 /mnt/memory_card vfat rw,nosuid,nodev,iocharset=iso8859-15,codepage=850,umask=0,user=julia 0 0
订阅:
博文 (Atom)