2008年11月15日
在進(jìn)行文件下載時(shí)liunx下出現(xiàn)中文文件名亂碼,windows下卻沒(méi)有.可能是不同操作系統(tǒng)的編碼方式不同?(含糊不清的說(shuō)法),用
Properties initProp = new Properties(System.getProperties());
System.out.println(prop.getProperty("file.encoding"));能得到編碼方式都是UTF-8
后來(lái)發(fā)現(xiàn)用
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");不管linux還是windows 下用火狐都是顯示正常的,IE下卻顯示亂碼,所以問(wèn)題出在瀏覽器,得在程序中加入判斷(分別處理firefox跟Ie):
//判斷是否是使用IE的方法
String userAgent = request.getHeader("User-Agent");
boolean isIE = false;
//userAgent.toLowerCase().indexOf("msie")
if(userAgent.indexOf("MSIE") > 0){
isIE = true;
}
if(isIE){
fileName = new String(fileName.getBytes("gb2312"), "iso-8859-1");
}else{
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
}
一個(gè)同學(xué)前幾天遇到一個(gè)問(wèn)題,今天我試著看了一下。
項(xiàng)目沒(méi)有錯(cuò)誤,在項(xiàng)目部署到tomcat后,tomcat啟動(dòng)時(shí)報(bào)錯(cuò):
java.lang.UnsupportedClassVersionError: Bad version number in .class file 。。。
這個(gè)問(wèn)題我原來(lái)遇到過(guò),原因應(yīng)該是編譯java時(shí)生成的class文件,在運(yùn)行時(shí)用到的JRE和class文件版本不一致造成的。
1 如果是一般的java程序:
可以在MyEclipse中修改JRE的路徑和版本。在Window->Preferences中,打開(kāi)如下位置,就可修改JRE:

修改完之后,最好重新編譯一下,選Project->Clean... 選項(xiàng),然后選擇是所有的項(xiàng)目都要重新編譯,還是只重新編譯指定的項(xiàng)目,然后就應(yīng)該沒(méi)問(wèn)題了。
今天一開(kāi)始我也是這么做的,但是還是報(bào)錯(cuò),在網(wǎng)上搜了一下之后,因?yàn)檫@是Web項(xiàng)目,程序當(dāng)然是在Tomcat上運(yùn)行的,所以我們這么改當(dāng)然不行。
2 如果是Web 程序
就要修改Tomcat運(yùn)行時(shí)的JDK環(huán)境了,如下圖:

把JDK的路徑和之前Installed JRE的設(shè)置成一樣的,這個(gè)問(wèn)題就解決了!(雖然這里面設(shè)置的是JDK的路徑,但是我覺(jué)得其實(shí)就是在設(shè)置JRE的路徑,因?yàn)閖ava程序運(yùn)行的時(shí)候需要的 是JRE,而不是JDK。我們裝JDK的時(shí)候,一般都裝了2個(gè)JRE,一個(gè)是JDK里面的JRE,還有一個(gè)和JDK平級(jí)的JRE,剛才我上網(wǎng)查了一下,這 兩個(gè)JRE的區(qū)別不大,大家也可以去查一下,每次都可以選擇任何一個(gè)JRE,但是之后配置的吆喝前面的一致。)
如果不清楚JDK和JRE的關(guān)系的,可以上網(wǎng)查一下。
一般情況下,我們運(yùn)行別人的程序可能會(huì)遇到這個(gè)問(wèn)題。
再做個(gè)小小的延伸。。
這個(gè)項(xiàng)目編譯并沒(méi)有報(bào)錯(cuò),如果我們導(dǎo)入別人的項(xiàng)目之后,出現(xiàn)了很多錯(cuò)誤,那就是JDK版本的問(wèn)題了,可以在這里修改:

可以選擇1.3,1.4,5.0,6.0.
轉(zhuǎn) http://apps.hi.baidu.com/share/detail/1776104
http://mayuqi827.javaeye.com/blog/804409
LINUX基本操作命令
基本操作命令
----------------------------------------------------------------------
----------------------------------------------------------------------
ls #以默認(rèn)方式顯示當(dāng)前目錄文件列表
ls –a #顯示所有文件包括隱藏文件
ls –l #顯示文件屬性,包括大小,日期,符號(hào)連接,是否可讀寫(xiě)及是否可執(zhí)行
ls --color=never *.so > obj #不顯示文字顏色,將所有so文件記錄到obj文件中
----------------------------------------------------------------------
cd dir #切換到當(dāng)前目錄下的dir目錄
cd / #切換到根目錄
cd .. #切換到到上一級(jí)目錄
cd ../.. #切換到上二級(jí)目錄
cd ~ #切換到用戶目錄,比如是root用戶,則切換到/root下
----------------------------------------------------------------------
rm file #刪除某一個(gè)文件
rm -fr dir #刪除當(dāng)前目錄下叫dir的整個(gè)目錄
----------------------------------------------------------------------
cp source target #將文件source 復(fù)制為 target
cp /root/source . #將/root下的文件source復(fù)制到當(dāng)前目錄
cp –av soure_dir target_dir #將整個(gè)目錄復(fù)制,兩目錄完全一樣
cp –fr source_dir target_dir
#將整個(gè)目錄復(fù)制,并且是以非鏈接方式復(fù)制,當(dāng)source目錄帶有符號(hào)鏈接時(shí),兩個(gè)目錄不相同
----------------------------------------------------------------------
mv source target #將文件source更名為target
----------------------------------------------------------------------
diff dir1 dir2 #比較目錄1與目錄2的文件列表是否相同,但不比較文件的實(shí)際內(nèi)容,不同則列出
diff file1 file2
#比較文件1與文件2的內(nèi)容是否相同,如果是文本格式的文件,則將不相同的內(nèi)容顯示,如果是二進(jìn)制代碼則只表示兩個(gè)文件是不同的
comm file1 file2 #比較文件,顯示兩個(gè)文件不相同的內(nèi)容
----------------------------------------------------------------------
echo message #顯示一串字符
echo "message message2" #顯示不連續(xù)的字符串
cat:
cat file #顯示文件的內(nèi)容,和DOS的type相同
cat file | more #顯示文件的內(nèi)容并傳輸?shù)絤ore程序?qū)崿F(xiàn)分頁(yè)顯示,使用命令less file可實(shí)現(xiàn)相同的功能
more #分頁(yè)命令,一般通過(guò)管道將內(nèi)容傳給它,如ls | more
----------------------------------------------------------------------
export LC_ALL=zh_CN.GB2312 #將環(huán)境變量LC_ALL的值設(shè)為zh_CN.GB2312
export DISPLAY=0:0 #通過(guò)該設(shè)置,當(dāng)前字符終端下運(yùn)行的圖形程序可直接運(yùn)行于Xserver
date #顯示當(dāng)前日期時(shí)間
date -s 20:30:30 #設(shè)置系統(tǒng)時(shí)間為20:30:30
date -s 2002-3-5 #設(shè)置系統(tǒng)時(shí)期為2003-3-5
clock –r #對(duì)系統(tǒng)Bios中讀取時(shí)間參數(shù)
clock –w #將系統(tǒng)時(shí)間(如由date設(shè)置的時(shí)間)寫(xiě)入Bios
----------------------------------------------------------------------
eject #umout掉CDROM并將光碟彈出,但cdrom不能處于busy的狀態(tài),否則無(wú)效
----------------------------------------------------------------------
du #計(jì)算當(dāng)前目錄的容量
du -sm /root #計(jì)算/root目錄的容量并以M為單位
find -name /path file #在/path目錄下查找看是否有文件file
grep -ir “chars” #在當(dāng)前目錄的所有文件查找字串chars,并忽略大小寫(xiě),-i為大小寫(xiě),-r為下一級(jí)目錄
----------------------------------------------------------------------
vi file #編輯文件file
vi 原基本使用及命令:
輸入命令的方式為先按ctrl+c, 然后輸入:x(退出),:x!(退出并保存) :w(寫(xiě)入文件),:w!(不詢問(wèn)方式寫(xiě)入文件), :r
file(讀文件file) ,:%s/oldchars/newchars/g(將所有字串oldchars換成newchars)
這一類的命令進(jìn)行操作
----------------------------------------------------------------------
man ls #讀取關(guān)于ls命令的幫助
man ls | grep color #讀取關(guān)于ls命令的幫助并通過(guò)grep程序在其中查找color字串
----------------------------------------------------------------------
startx #運(yùn)行Linux圖形有環(huán)境
Xfree86 #只運(yùn)行X圖形server
----------------------------------------------------------------------
reboot #重新啟動(dòng)計(jì)算機(jī)
halt #關(guān)閉計(jì)算機(jī)
init 0 #關(guān)閉所有應(yīng)用程序和服務(wù),進(jìn)入純凈的操作環(huán)境
init 1 #重新啟動(dòng)應(yīng)用及服務(wù)
init 6 #重新啟動(dòng)計(jì)算機(jī)
----------------------------------------------------------------------
擴(kuò)展命令
----------------------------------------------------------------------
----------------------------------------------------------------------
tar xfzv file.tgz #將文件file.tgz解壓
tar xfzv file.tgz -C target_path #將文件file.tgz解壓到target_path目錄下
tar cfzv file.tgz source_path #將文件source_path壓縮為file.tgz
tar c directory > directory.tar #將目錄directory打包成不壓縮的directory.tar
gzip directory.tar #將覆蓋原文件生成壓縮的 directory.tar.gz
gunzip directory.tar.gz #覆蓋原文件解壓生成不壓縮的 directory.tar。
tar xf directory.tar #可將不壓縮的文件解包
----------------------------------------------------------------------
dmesg #顯示kernle啟動(dòng)及驅(qū)動(dòng)裝載信息
uname #顯示操作系統(tǒng)的類型
uname -R #顯示操作系統(tǒng)內(nèi)核的version
----------------------------------------------------------------------
strings file 顯示file文件中的ASCII字符內(nèi)容
----------------------------------------------------------------------
rpm -ihv program.rpm #安裝程序program并顯示安裝進(jìn)程
rpm2targz program.rpm program.tgz #將rpm格式的文件轉(zhuǎn)換成tarball格式
----------------------------------------------------------------------
su root #切換到超級(jí)用戶
sulogin /dev/tty4 #在tty4即alt+F4終端等待用戶登陸或直接登陸開(kāi)啟一個(gè)shell
chmod a+x file #將file文件設(shè)置為可執(zhí)行,腳本類文件一定要這樣設(shè)置一個(gè),否則得用bash file才能執(zhí)行
chmod 666 file #將文件file設(shè)置為可讀寫(xiě)
chown user /dir #將/dir目錄設(shè)置為user所有
----------------------------------------------------------------------
mknod /dev/hda1 b 3 1 #創(chuàng)建塊設(shè)備hda1,主設(shè)備號(hào)為3,從設(shè)備號(hào)為1,即master硬盤(pán)的的第一個(gè)分區(qū)
mknod /dev/tty1 c 4 1 #創(chuàng)建字符設(shè)備tty1,主設(shè)備號(hào)為4,眾設(shè)備號(hào)為1,即第一個(gè)tty終端
----------------------------------------------------------------------
touch /tmp/running #在/tmp下創(chuàng)建一個(gè)臨時(shí)文件running,重新啟動(dòng)后消失
----------------------------------------------------------------------
sleep 9 #系統(tǒng)掛起9秒鐘的時(shí)間
----------------------------------------------------------------------
lpd stop 或 cups stop #停止打印服務(wù)程序
lpd start 或 cups start #啟動(dòng)打印服務(wù)程序
lpd restart 或 cups restart #重新啟動(dòng)打印服務(wù)程序
lpr file.txt #打印文件file.txt
----------------------------------------------------------------------
fdisk /dev/hda #就像執(zhí)行了dos的fdisk一樣
cfdisk /dev/hda #比f(wàn)disk界面稍為友好些
mount -t ext2 /dev/hda1 /mnt #把/dev/hda1裝載到 /mnt目錄
df #顯示文件系統(tǒng)裝載的相關(guān)信息
mount -t iso9660 /dev/cdrom /mnt/cdrom #將光驅(qū)加載到/mnt/cdrom目錄
mount-t smb //192.168.1.5/sharedir /mnt -o
username=tomlinux,password=tomlinux
#將windows的的共享目錄加載到/mnt/smb目錄,用戶名及密碼均為tomlinux
mount -t nfs 192.168.1.1:/sharedir /mnt
#將nfs服務(wù)的共享目錄sharedir加載到/mnt/nfs目錄
umount /mnt #將/mnt目錄卸載,/mnt目錄必須處于空閑狀態(tài)
umount /dev/hda1 #將/dev/hda1設(shè)備卸載,設(shè)備必須處于空親狀態(tài)
sync #將cache中的內(nèi)容與磁盤(pán)同步,在Linux中復(fù)制文件,一般要系統(tǒng)空閑才去寫(xiě)文件
e2fsck /dev/hda1 #檢查/dev/hda1是否有文件系統(tǒng)錯(cuò)誤,提示修復(fù)方式
e2fsck -p /dev/hda1#檢查/dev/hda1是否有錯(cuò)誤,如果有則自動(dòng)修復(fù)
e2fsck -y /dev/hda1#檢查錯(cuò)誤,所有提問(wèn)均于yes方式執(zhí)行
e2fsck -c /dev/hda1#檢查磁盤(pán)是否有壞區(qū)
mkfs /dev/hda1 #格式化/dev/hda1為ext2格式
mkfs.minix /dev/hda1 #格式化/dev/hda1為minix格式文件系統(tǒng)
mfks /dev/hda9 #格工化/dev/hda9為L(zhǎng)inux swap格式
swapon /dev/hda9 #將swap分區(qū)裝載當(dāng)作內(nèi)存來(lái)用
swapoff /dev/hda9 #將swap分區(qū)卸載
----------------------------------------------------------------------
lilo #運(yùn)行l(wèi)ilo程序,程序自動(dòng)查找/etc/lilo.conf并按該配置生效
lilo -C /root/lilo.conf #lilo程序按/root/lilo.conf配置生效
grub #在Linux shell狀態(tài)下運(yùn)行boot loader設(shè)置程序
grub-install
#安裝grub磁盤(pán)引導(dǎo)程序,成功后升級(jí)內(nèi)核無(wú)須像lilo一樣要重新啟動(dòng)系統(tǒng),只需修改/etc/grub.conf即可實(shí)現(xiàn)新引導(dǎo)配置
rdev bzImage #顯示kernel的根分區(qū)信息
rdev bzImage /dev/hda1
#將kernel的根分區(qū)設(shè)置為/dev/hda1,這在沒(méi)有l(wèi)ilo等引導(dǎo)程序的系統(tǒng)中非常重要.
----------------------------------------------------------------------
dd if=/dev/fd0 of=floppy.fd #將軟盤(pán)的內(nèi)容復(fù)制成一個(gè)鏡像,功能與舊石器時(shí)代常用的hd-copy相同
dd if=/dev/zero of=root.ram bs=1024,count=1024
#生成一個(gè)大小為1M的塊設(shè)備,可以把它當(dāng)作硬盤(pán)的一個(gè)分區(qū)來(lái)用
mkfs root.ram #將塊設(shè)備格式化為ext2格式
dd if=root.ram of=/dev/ram0 #將init.rd格式的root.ram的內(nèi)容導(dǎo)入內(nèi)存
mount /dev/ram0 /mnt #ramdisk /dev/ram0裝載到/mnt 目錄
----------------------------------------------------------------------
gcc hello.c #將hello.c編譯成名為a.out二進(jìn)制執(zhí)行文件
gcc hello.c -o hello #將hello.c編譯成名為hello的二進(jìn)制執(zhí)行文件
gcc -static -o hello hello.c #將hello.c編譯成名為hello的二進(jìn)制靜態(tài)執(zhí)行文件
ldd program #顯示程序所使用了哪些庫(kù)
objcopy -S program #將程序中的符號(hào)表及無(wú)用的調(diào)試信息去掉,可以小很多
----------------------------------------------------------------------
strace netscape
#跟蹤程序netscape的執(zhí)行,看調(diào)用的庫(kù),環(huán)境變量設(shè)置,配置文件,使用的設(shè)備,調(diào)用的其它應(yīng)用程序等,在strace下,程序干了什么東東一目了
然。
ps #顯示當(dāng)前系統(tǒng)進(jìn)程信息
ps –ef #顯示系統(tǒng)所有進(jìn)程信息
kill -9 500 #將進(jìn)程編號(hào)為500的程序干掉
killall -9 netscape #將所有名字為netscape的程序殺死,kill不是萬(wàn)能的,對(duì)僵死的程序則無(wú)效。
top #顯示系統(tǒng)進(jìn)程的活動(dòng)情況,按占CPU資源百分比來(lái)分
free #顯示系統(tǒng)內(nèi)存及swap使用情況
time program #在program程序結(jié)束后,將計(jì)算出program運(yùn)行所使用的時(shí)間
----------------------------------------------------------------------
chroot . #將根目錄切換至當(dāng)前目錄,調(diào)試新系統(tǒng)時(shí)使用
chroot /tomlinux #將根目錄切換至/tomlinux目錄
chroot /tomlinux sbin/init #將根目錄切換至/tomlinux并執(zhí)行sbin/init
adduser id #增加一個(gè)叫id的用戶
userdel id #增除叫id的用戶
userlist #顯示已登陸的用戶列表
passwd id #修改用戶id的密碼
passwd -d root #將root用戶的密碼刪除
chown id /work #指定/work目錄為id用戶所擁有
----------------------------------------------------------------------
ifconfig eth0 192.168.1.1 netmask 255.255.255.0
#設(shè)置網(wǎng)卡1的地址192.168.1.1,掩碼為255.255.255.0,不寫(xiě)netmask參數(shù)則默認(rèn)為255.255.255.0
ifconfig eth0:1 192.168.1.2 #捆綁網(wǎng)卡1的第二個(gè)地址為192.168.1.2
ifconfig eth0:x 192.168.1.x #捆綁網(wǎng)卡1的第二個(gè)地址為192.168.1.x
ifconfig down eth1 #關(guān)閉第二塊網(wǎng)卡,使其停止工作
hostname -F tomlinux.com #將主機(jī)名設(shè)置為tomlinux.com
route #顯示當(dāng)前路由設(shè)置情況
route add default gw 192.168.1.1 metric 1 #設(shè)置192.168.1.1為默認(rèn)的路由
route del default #將默認(rèn)的路由刪除
dhcp #啟動(dòng)dhcp服務(wù)
dhclient #啟動(dòng)dhcp終端并自動(dòng)獲取IP地址
ping 163.com #測(cè)試與163.com的連接
ping 202.96.128.68 #測(cè)試與IP 202。96.128.68的連接
----------------------------------------------------------------------
probe rtl8139 #檢查驅(qū)動(dòng)程序rtl8139.o是否正常工作
lsmod #顯示已裝載的驅(qū)動(dòng)程序
insmod rtl8139.o #裝載驅(qū)動(dòng)程序rtl8139.o
insmod sb.o io=0x280 irq=7 dma=3 dma16=7 mpu_io=330
#裝載驅(qū)動(dòng)程序并設(shè)置相關(guān)的irq,dma參數(shù)
rmmod rtl8139 #刪除名為rtl8139的驅(qū)動(dòng)模塊
gpm -k #停止字符狀態(tài)下的mouse服務(wù)
gpm -t ps2 #在字符狀態(tài)下以ps2類型啟動(dòng)mouse的服務(wù)
----------------------------------------------------------------------
telnet 192.168.1.1 #登陸IP為192.168.1.1的telnet服務(wù)器
telnet iserver.com #登陸域名為iserver.com的telnet服務(wù)器
ftp 192.168.1.1 或 ftp iserver.com #登陸到ftp服務(wù)
1tomcat 部署網(wǎng)站 去掉端口號(hào)和項(xiàng)目名稱
去除端口號(hào) conf-->server.xml中查找原始的端口號(hào)(如8080),修改為80后,即可在訪問(wèn)時(shí)不用輸入端口號(hào)。不過(guò)要注意防止其它程序占用80端口。
項(xiàng)目名稱 server.xml <Context path="/myapp" reloadable="true" docBase="D:"myapp" workDir="D:"myapp"work"/>
2 TOMCAT 如何配置多端口
1.修改端口:
在Tomcat的安裝目錄下的"conf目錄下,打開(kāi)server.xml,
找到
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
將8080改為你想要的端口8081
2.映射路徑:
還是在server.xml配置文件中,
在</host>這個(gè)結(jié)束標(biāo)簽之前加上如下的配置信息:
<Context
path="/myapp"
reloadable="true"
docBase="e:"myApp" />
3.添加端口:
在server.xml中添加以下:
<Connector port="65535" protocol="HTTP/1.1"
connectionTimeout="20000" />
Tomcat的端口號(hào)最大到65535.
4.上面的端口對(duì)于原來(lái)Tomcat中的其他Web應(yīng)用也可以使用,
下面是獨(dú)立的,只有你的e:"myApp中的Web應(yīng)用可用,
也就是在server.xml中的</Service>下另外建立一個(gè)Service:
<Service name="test">
<Connector port="65535" protocol="HTTP/1.1"
connectionTimeout="20000" />
<Engine name="myengine" defaultHost="myhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host name="myhost" appBase="e:"myApp"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
</Engine>
</Service>
另外:
1818189端口?有這么多位嗎?
我印象中端口號(hào)范圍是0~65535,怎么還有這么多位的端口?
http://ttov.blog.163.com/blog/static/3822715201072692912584/
1、安裝VMware workstation。
2、安裝guest系統(tǒng),這里我安裝的Red Hat
Linux9,安裝過(guò)程中確保網(wǎng)絡(luò)連接選擇的是NAT方式,當(dāng)然可以在安裝完后進(jìn)行修改。

3、到windows XP
中,查看所有的網(wǎng)絡(luò)連接,你應(yīng)該發(fā)現(xiàn)除了原有的網(wǎng)卡之外,又多了Vmnet1和Vmnet8。
vmnet1是hostonly的接口,而Vmnet8是就是我們要使用的NAT的網(wǎng)絡(luò)接口。
4、在win主機(jī)上用ipconfig查看VMnet8的IP地址,
一般是192.168.X.1/255.255.255.0,此時(shí)VMnet8的設(shè)置應(yīng)該是自動(dòng)獲取IP,現(xiàn)在改成靜態(tài)IP,并把此IP直接填入
VMnet8里,不設(shè)網(wǎng)關(guān)。

5、同時(shí)在VM網(wǎng)絡(luò)設(shè)置里的NAT項(xiàng)中查看VMnet8,一般是
192.168.X.2/255.255.255.0這個(gè)地址就是VMnet8,NAT的網(wǎng)關(guān)。

6、現(xiàn)在在LINUX下把網(wǎng)卡IP設(shè)置成和VMnet8一個(gè)網(wǎng)段的
IP(192.168.X.Z/255.255.255.0)
7、網(wǎng)關(guān)設(shè)置成剛才查看的那個(gè)IP192.168.X.2即可。

8、DNS和你host主機(jī)的一樣就可以。

9、設(shè)置完成后,重新啟動(dòng)linux的網(wǎng)絡(luò)服務(wù)。

Linux命令
netconfig 設(shè)置IP
ifconfig 查看
reboot 重啟
services network restart (重啟網(wǎng)絡(luò))
http://www.cnblogs.com/hakuci/archive/2008/12/07/1349547.html
一般情況下,安裝完vmware,不做其他設(shè)置,直接使用nat模式就可以與主機(jī)共享上網(wǎng)了。但如果你用的是某些精簡(jiǎn)版,或者你自己做過(guò)修改,那么就照下
面的步驟檢查一遍吧。
一、先檢查nat是否可用及相關(guān)服務(wù)是否已經(jīng)打開(kāi)。
首先打開(kāi)虛擬機(jī)的虛擬網(wǎng)絡(luò)設(shè)置功
能,虛擬機(jī)菜單欄——編輯——虛擬網(wǎng)絡(luò)設(shè)置

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_887ae060f330442.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖一
如果你發(fā)現(xiàn)上面的選項(xiàng)是灰色的,說(shuō)明你的精簡(jiǎn)版沒(méi)有這個(gè)功能,想辦法換個(gè)版本,或者找下載說(shuō)明,看看是否還
需要裝其他東西。
在后面的對(duì)話框里檢查dhcp和nat服務(wù)是否已經(jīng)打開(kāi)。

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_56d1cfb5e6d2e11.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖二

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_da98e19f2ca0e5a.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖三
如果你在上圖中按下啟動(dòng)——應(yīng)用沒(méi)有用的話,就要考慮是不是相關(guān)服務(wù)被禁用了。主機(jī)開(kāi)始菜單——運(yùn)行——
services.msc檢查相關(guān)服務(wù)的情況。正確的應(yīng)該如下:

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_b831307582cc66e.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖四
二、
檢查ics是否有打開(kāi),既打開(kāi)ics又打開(kāi)nat模式,同時(shí)作用,會(huì)造成混亂的,必須關(guān)閉。(ics就是internet connection
share,也就是internent連接共享)

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_180e7abade984b8.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖五
三、
檢查網(wǎng)絡(luò)接口模式
看看虛擬機(jī)網(wǎng)卡是不是真的用了nat模式,跟虛擬網(wǎng)絡(luò)設(shè)置里是不是用了同一個(gè)vmnet號(hào),請(qǐng)確保下圖六和圖3中用的是
同一個(gè)vmnet號(hào)。

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_88f83d8b3174401.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖六
虛擬機(jī)7.0以前的版本,nat都默認(rèn)使用了vmnet8作為nat的默認(rèn)端口號(hào),但vm7.0就不同了。

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_742811ec5a6daf6.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖七
nat模式用的是vmnet0了,這個(gè)時(shí)候,保險(xiǎn)為妙,虛擬機(jī)網(wǎng)卡請(qǐng)使用自定義vmnet0接口。
四、
開(kāi)虛擬機(jī)系統(tǒng)檢查是否獲取到了ip。檢查ip,網(wǎng)關(guān),dns,是否都正常。

=700)
window.open('http://bbs.crsky.com/1236983883/thumb/Mon_1004/6_194774_724219dda00790b.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖八
4.1關(guān)于出現(xiàn)網(wǎng)絡(luò)連接紅叉,“電纜被拔出”。在虛擬機(jī)里是不存在電纜的,所以肯定是設(shè)置問(wèn)題。
4.1.1
檢查圖六“打開(kāi)電源時(shí)連接”的鉤,或者檢查圖八里,右下角的虛擬網(wǎng)卡圖標(biāo)是否有叉。
4.1.2
上一條正常的,請(qǐng)安裝一遍vmtools,確保虛擬網(wǎng)卡驅(qū)動(dòng)正常。
4.1.3
上2條都正常的,還是有問(wèn)題的,應(yīng)該是某些系統(tǒng)的問(wèn)題了。ubuntu的話多點(diǎn)幾次連接看看,redflag的話,本地連接屬性里“連接后在通知區(qū)域顯示
圖標(biāo)”前的鉤去掉,眼不見(jiàn)心不煩反而可以連上了。
五、vm7.0還是沒(méi)有獲取到ip的,需要把虛擬網(wǎng)絡(luò)設(shè)置設(shè)置為默
認(rèn)再試一遍。
將虛擬機(jī)里的系統(tǒng)關(guān)機(jī),打開(kāi)虛擬網(wǎng)絡(luò)配置,如圖7所示,按下左下角的“resore
default”恢復(fù)默認(rèn)設(shè)置,在隨后跳出的whql驅(qū)動(dòng)認(rèn)證里全部選擇“始終安裝此驅(qū)動(dòng)軟件”。

=700)
window.open('http://bbs.crsky.com/1236983883/Mon_1004/6_194774_b329ff341c566c1.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
圖九
完
成后,請(qǐng)繼續(xù)檢查前面的檢查項(xiàng)目,再檢查一遍后再打開(kāi)虛擬機(jī)里的系統(tǒng)。
六、獲取了ip還是無(wú)法上網(wǎng)的,有以下的幾種情況。
6.1 主機(jī)是win7或是vista,vmware版本低于6.5.3的,請(qǐng)升級(jí)vmware的版本。
這個(gè)問(wèn)題的癥狀就是能ping通域名,也上不去網(wǎng)。但qq可以上去,這個(gè)應(yīng)該是個(gè)兼容問(wèn)題,請(qǐng)升級(jí)vmware版本。
6.2
使用網(wǎng)絡(luò)命令檢查網(wǎng)絡(luò)。
1.ping nat網(wǎng)關(guān),以圖8為利,ping 192.168.47.2
2.ping
物理主機(jī)公網(wǎng)ip或內(nèi)網(wǎng)真實(shí)ip,
3.可以繼續(xù)ping,公網(wǎng)的isp網(wǎng)關(guān)或是內(nèi)網(wǎng)的路由器ip,最后ping下網(wǎng)站域名。
如果都能通,而不是6.1的問(wèn)題,看是不是瀏覽器上設(shè)置了錯(cuò)誤的代理。
如果dns能解析,
但ping所有外網(wǎng)ip都是丟包的,應(yīng)該是網(wǎng)關(guān)問(wèn)題,檢查下是否是雙網(wǎng)關(guān),route print檢查下默認(rèn)網(wǎng)關(guān)。
如果可以ping通所
有ip,ping不通域名,則應(yīng)該是nat服務(wù)器的dns解析出了問(wèn)題,重新啟動(dòng)主機(jī)(和重啟路由器一樣的道理)或是在虛擬機(jī)里直接填公網(wǎng)dns,或者設(shè)
置nat,直接將dns直接填到虛擬機(jī)nat里(如圖十)。

=700)
window.open('http://bbs.crsky.com/1236983883/thumb/Mon_1004/6_194774_c10769a426e7ab1.jpg');" onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'2100')this.height='2100';" border="0">
http://www.xpxzlt.cn/simple/?t161677.html
Q:VMware DHCP Service 服務(wù)無(wú)法啟動(dòng) 1067 錯(cuò)誤
A:打開(kāi)Virtual Network Editor,選擇 Restore Default
Q:VMware Brige 橋接服務(wù)無(wú)法啟動(dòng) 發(fā)生系統(tǒng)錯(cuò)誤 2 系統(tǒng)找不到指定的文件
A:替換vmnetbridge.sys
vmnetbridge.dll(下載)
window主機(jī)與Ubuntu虛擬機(jī)共享文件夾的設(shè)置方法:
打開(kāi)虛擬機(jī),并開(kāi)啟Ubuntu。
在ubuntu的選項(xiàng)卡右擊 --> Settings --> 點(diǎn)擊 Options --> 窗口左側(cè)的 Shared
Folders --> 右側(cè)Folder Sharing的 Always enabled --> 右側(cè) Folders 下面的
Add --> Next --> Brower --> 在 瀏覽文件夾 中選擇自己想要共享的文件夾(如:
E:/linuxshare) --> 確定 --> Enable this share --> Finish 。
文件夾共享設(shè)置完成。
需要往 Ubuntu上傳什么東西,放在E:/linuxshare 下即可。 linux中的訪問(wèn)路徑是: /mnt/hgfs/linuxshare
下面附上截圖。

圖一

圖二

圖三

圖四

圖五

圖六
http://www.cnblogs.com/computer/archive/2010/07/21/1781945.html
http://chenjian977355.blog.163.com/blog/static/5544582010229150190/
WIN 7下光盤(pán)安裝Ubuntu9.10,簡(jiǎn)單配置并修改啟動(dòng)項(xiàng)~~
先下載最新的Ubuntu9.10版,前幾天剛發(fā)布的
下載地址:http://www.ubuntu.org.cn/getubuntu/download/
在下載位置處,選擇“TAIWAN”(中國(guó)好像只有臺(tái)灣這個(gè)選項(xiàng))

因?yàn)橛X(jué)得光盤(pán)安裝比較舒服,所以我選擇了光盤(pán)安裝。
用UltraISO或者其他工具把下載下來(lái)的鏡像刻進(jìn)一張空的CD盤(pán)。
由于偶的小Y從來(lái)沒(méi)碰過(guò)Ubuntu系統(tǒng),所以整個(gè)安裝過(guò)程最主要的就是對(duì)硬盤(pán)進(jìn)行分區(qū)。
申明:本人安裝時(shí)并未想到要來(lái)寫(xiě)教程,部分截圖是9.04版的,但幾乎是一樣的,不一樣處我會(huì)指出。
1.將光盤(pán)放進(jìn)光驅(qū)后重啟,按F12,選擇光驅(qū)啟動(dòng),此時(shí)光驅(qū)開(kāi)始狂轉(zhuǎn),等一會(huì)便出現(xiàn)界面,選擇你看得懂的:簡(jiǎn)體中文

2.選擇第一項(xiàng)“試用Ubuntu而不改計(jì)算機(jī)中的任何內(nèi)容”,按回車確認(rèn),也可以選擇第二項(xiàng)直接安裝ubuntu,安裝步驟與以下演示相相同。(為什么要選擇第一項(xiàng)安裝,因?yàn)閡buntu
liveCD有個(gè)特色,就是可以一臺(tái)電腦上用光盤(pán)來(lái)臨時(shí)體驗(yàn)一下ubutnu的完整系統(tǒng),進(jìn)入后進(jìn)也可安裝系統(tǒng))

3.毫無(wú)懸念的,光驅(qū)又開(kāi)始狂轉(zhuǎn),這下等的時(shí)間會(huì)稍微長(zhǎng)點(diǎn),一段時(shí)間后進(jìn)入系統(tǒng)。在這里你可以先體驗(yàn)下這個(gè)
系統(tǒng),可以聯(lián)網(wǎng);玩夠了再考慮裝還是不裝
。如果裝的話,就點(diǎn)擊桌面的“安裝”

4.出現(xiàn)以下界面,當(dāng)然用簡(jiǎn)體中文,按默認(rèn)連續(xù)三次Forward(下一步),如圖



5.然后就到了給硬盤(pán)分區(qū)了,首先進(jìn)入到如圖的界面(圖顯示的不是WIN7 ,是XP,這個(gè)不重要,只要點(diǎn)擊那個(gè)“手動(dòng)指定分區(qū)(高級(jí))”就行了)

6.注意:以下內(nèi)容重要!!!!
我的小Y一共分成了CDEFG,5個(gè)區(qū),F(xiàn)盤(pán)80G
至今沒(méi)用過(guò),所以我打算分出20G來(lái)裝Ubuntu。不一定要20G,10G也行,看自身情況。
選中要改變的分區(qū),點(diǎn)“編輯分區(qū)”(9.10版里好像是叫“新建”,都一樣,就是“刪除分區(qū)”選項(xiàng)之前的那個(gè))

7.出現(xiàn)以下提示,點(diǎn)繼續(xù)將進(jìn)行硬盤(pán)分區(qū),不用擔(dān)心,你硬盤(pán)里的東西不會(huì)丟失

8.分區(qū)完成,以下我們可以看到硬盤(pán)多個(gè)一個(gè)空閑的空間,這就是我們釋放出來(lái)安裝ubunbu的空間。選中
空閑的空間再點(diǎn)下面的新的分區(qū)。

9.下面對(duì)這個(gè)空閑的空間進(jìn)行分區(qū),首先來(lái)分個(gè)swap交換空間,這個(gè)相當(dāng)于windows下的虛擬內(nèi)存,根據(jù)你內(nèi)存的大小填入,一般填為與內(nèi)存一樣的大小,我的內(nèi)存2G,因此以下
也填入2048(也有一種說(shuō)法是:內(nèi)存小于1G的此處填2倍,大于1G的就填1G就行,自己看著辦吧),再選擇交換空間按確定。

10.依然選中空閑的空間-新的分區(qū),下面來(lái)創(chuàng)建個(gè)系統(tǒng)空間,這里我把空閑剩下的全部分配給這個(gè)分區(qū),再選
擇Ext3日志文件系
統(tǒng),掛載點(diǎn)選/,再點(diǎn)確定,到這里分區(qū)完成。



11.自定義填寫(xiě)用戶名和密碼,你也可以選擇自動(dòng)登錄還是需要密碼以登入(這就是決定是否在開(kāi)機(jī)輸入密
碼),再點(diǎn)下一步,當(dāng)你密碼設(shè)置過(guò)短時(shí),考慮到安全ubuntu會(huì)提示你是否重新設(shè)置,我們不用管它,點(diǎn)繼續(xù)即可。

12.通過(guò)下面我們看到兩個(gè)分區(qū),格式為swap和ext3,這兩個(gè)分區(qū)就是Linux要用到的分區(qū),選中ext3分區(qū)再點(diǎn)下一步就行。

13.接下來(lái)提示問(wèn)你是否導(dǎo)入本機(jī)WIN 7系統(tǒng)的文檔到ubuntu下使用,如果你需要就勾上,我一個(gè)沒(méi)勾,再點(diǎn)下一步。
14.好了,到這里準(zhǔn)備安裝,現(xiàn)在你要做的是拔掉網(wǎng)線(切記,一定要把網(wǎng)線拔掉),用無(wú)線網(wǎng)絡(luò)的直接把無(wú)線開(kāi)關(guān)掰回去先。因?yàn)閡buntu在安裝過(guò)
程上會(huì)自動(dòng)從官方下載一些更新,由于這個(gè)“源"地址設(shè)在歐洲,對(duì)于我們國(guó)內(nèi)用戶來(lái)說(shuō)下載特級(jí)慢,我們還是把更新放在系統(tǒng)安裝后進(jìn)行操作,下面點(diǎn)擊安裝即
可!

15.以下進(jìn)行系統(tǒng)安裝中,請(qǐng)不要斷來(lái)電腦電源!

17.過(guò)了十幾分鐘,系統(tǒng)安裝完成,點(diǎn)現(xiàn)在重啟,此時(shí)電腦會(huì)彈出光盤(pán),請(qǐng)取出光盤(pán)后敲一下回車。

安裝完成,秀下桌面:

==========================================================================================================
第二部分:
簡(jiǎn)單配置
重啟后首次進(jìn)入ubuntu的桌面,說(shuō)明系統(tǒng)已安裝成功,下面我們來(lái)對(duì)系統(tǒng)進(jìn)行更
新(這類似于windows下的打補(bǔ)丁),
首先要做的是換源,什么是源?源可以理解為ubuntu系統(tǒng)更新的服務(wù)器地
址,之前我們已經(jīng)說(shuō)過(guò),ubuntu默認(rèn)的源是設(shè)在歐洲,這對(duì)于我們國(guó)內(nèi)來(lái)說(shuō)更新過(guò)程十分慢,因此可見(jiàn)換源十分重要,我們把這個(gè)源換成離我們較近的地區(qū)來(lái)
提高更新速度。先點(diǎn)擊右上角的網(wǎng)絡(luò)標(biāo)識(shí),連上網(wǎng)絡(luò),很簡(jiǎn)單的,一看就會(huì)。
1.選擇桌面上方的工具條
依次進(jìn)入System —— Administration——軟件源
——wnloag
from--other,此時(shí)提示輸入密碼(密碼就是你剛才安裝時(shí)設(shè)置的密碼,以后其它操作會(huì)提示都是輸入那個(gè)密碼),然后彈出以下窗口,有世界各地區(qū)供
選擇,選擇Tai w再選tw.archive.ubuntu.com這個(gè)源(因?yàn)門(mén)ai w這個(gè)源在國(guó)內(nèi)被公認(rèn)較快),最后點(diǎn)Choose
Gerver。

此時(shí),系統(tǒng)會(huì)連上“源”更新組件之類的,

2.下載語(yǔ)言包:我們發(fā)現(xiàn)系統(tǒng)雖安裝好了,可是菜單卻
大多數(shù)是英文,此是要做的是下載并安裝簡(jiǎn)體中文語(yǔ)言包,System —— Administration ——Language
Support,此時(shí)系統(tǒng)會(huì)自動(dòng)選好漢語(yǔ),并彈出以下窗口,直接點(diǎn)Install。

3.此時(shí)系統(tǒng)正在下載并安裝簡(jiǎn)體中文語(yǔ)言包中。

語(yǔ)言安裝完畢后,我們點(diǎn)Close關(guān)閉窗口,再選擇桌面右上角的關(guān)機(jī)按鈕,選擇Restart...重新啟動(dòng)計(jì)算機(jī)
4.重啟后,你能發(fā)現(xiàn)原來(lái)英文的菜單已經(jīng)變?yōu)楹?jiǎn)體中文了,說(shuō)明簡(jiǎn)體中文語(yǔ)言包安裝成功。

5.我們發(fā)現(xiàn)桌面空空的,什么都沒(méi)有,這時(shí)要把平時(shí)在windows習(xí)慣的幾個(gè)圖標(biāo)調(diào)出來(lái),選擇桌面上方的應(yīng)用程序--
附件--終端,在終端輸入gconf-editor再按回車后將彈出配置編輯器窗口。

6.通過(guò)以下窗口,依次選擇apps—— nautilus—— desktop,從右邊選擇把需要顯示在桌面圖標(biāo),勾上即可

7.在桌面右鍵選擇更改桌面背景,進(jìn)入視覺(jué)效果選項(xiàng)卡,默認(rèn)是關(guān)閉好像,然后點(diǎn)擊正常(或拓展),視個(gè)人喜好定,不過(guò)這個(gè)費(fèi)顯卡的,反正我選擇正常很流
暢。

接著,系統(tǒng)會(huì)自動(dòng)聯(lián)網(wǎng)安裝顯卡驅(qū)動(dòng)程序,裝好后重啟,再次進(jìn)入該處才能正常開(kāi)啟視覺(jué)效果選項(xiàng)。
=========================================================================================================
第三部分:修改啟動(dòng)項(xiàng)
ubuntu安裝后每次開(kāi)機(jī)都是默認(rèn)進(jìn)入ubuntu系統(tǒng)的,對(duì)于以windows為主的朋友,每次開(kāi)機(jī)都要守在畫(huà)面切換到XP啟動(dòng),可見(jiàn)十分麻
煩,通過(guò)下面,你可以設(shè)置讓你的WIN 7系統(tǒng)為第一啟動(dòng)
我嘗試像XP一樣打開(kāi)menu.lst,結(jié)果是空白~~~~幾番詢問(wèn)后才發(fā)現(xiàn)時(shí)因?yàn)?.10升級(jí)為grub2了,于是轉(zhuǎn)而修改grub.cfg文件。
1.左上角-應(yīng)用程序-附件-終端,輸入sudo chmod +w /boot/grub/grub.cfg
將grub.cfg設(shè)為可寫(xiě)狀態(tài)

2.提示輸入密碼:輸入你設(shè)的開(kāi)機(jī)密碼,此處輸入密碼不可見(jiàn),密碼輸入后直接回車,然后輸入sudo gedit
/boot/grub/grub.cfg

3.編輯grub.cfg

4.自習(xí)查看,里面有好幾段以
###BEGIN**************###開(kāi)頭
###END****************###結(jié)尾 的代碼
5.將含有WIN 7那段代碼剪切至圖中位置

6.確認(rèn)下圖的那段代碼值=0

7.保存后退出。
8.一切順利的話,重啟的菜單項(xiàng)將是這樣的(高亮顯示的即為WIN 7)

注意:如果是XP系統(tǒng),則第一第二部分通用,要調(diào)整啟動(dòng)順序的話
打開(kāi)終端(應(yīng)用程序——>附件——>終端),輸入sudo gedit
/boot/grub/menu.lst,敲下回車,這時(shí)要求輸入password,輸入登錄系統(tǒng)的密碼,在終端里不能顯示輸入的密碼,這是正常的,輸入
后回車打開(kāi)編輯窗口。
在其中找到XP的代碼,把它剪切到最前頭就行了~~~~~
Communications link failure,The last packet successfully received from
the server was *** millisecond ago.The last packet successfully sent to
the server was *** millisecond ago。
最近做測(cè)試,發(fā)現(xiàn)Mysql 過(guò)一段時(shí)間會(huì)無(wú)法連接,導(dǎo)致數(shù)據(jù)庫(kù)數(shù)據(jù)不一至,極其郁悶。
下面是轉(zhuǎn)一哥門(mén)的
使用Connector/J連接MySQL數(shù)據(jù)庫(kù),程序運(yùn)行較長(zhǎng)時(shí)間后就會(huì)報(bào)以下錯(cuò)誤:
Communications link failure,The last packet successfully received
from the server was *** millisecond ago.The last packet successfully
sent to the server was *** millisecond ago。
其中錯(cuò)誤還會(huì)提示你修改wait_timeout或是使用Connector/J的autoReconnect屬性避免該錯(cuò)誤。
后來(lái)查了一些資料,才發(fā)現(xiàn)遇到這個(gè)問(wèn)題的人還真不少,大部分都是使用連接池方式時(shí)才會(huì)出現(xiàn)這個(gè)問(wèn)題,短連接應(yīng)該很難出現(xiàn)這個(gè)問(wèn)題。這個(gè)問(wèn)題的原因:
MySQL服務(wù)器默認(rèn)的“wait_timeout”是28800秒即8小時(shí),意味著如果一個(gè)連接的空閑時(shí)間超過(guò)8個(gè)小時(shí),MySQL將自動(dòng)斷開(kāi)該連接,而連接池卻認(rèn)為該連接還是有效的(因?yàn)椴⑽葱r?yàn)連接的有效性),當(dāng)應(yīng)用申請(qǐng)使用該連接時(shí),就會(huì)導(dǎo)致上面的報(bào)錯(cuò)。
1.按照錯(cuò)誤的提示,可以在JDBC
URL中使用autoReconnect屬性,實(shí)際測(cè)試時(shí)使用了autoReconnect=true&
failOverReadOnly=false,不過(guò)并未起作用,使用的是5.1版本,可能真像網(wǎng)上所說(shuō)的只對(duì)4之前的版本有效。
2.沒(méi)辦法,只能修改MySQL的參數(shù)了,wait_timeout最大為31536000即1年,在my.cnf中加入:
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
重啟生效,需要同時(shí)修改這兩個(gè)參數(shù)。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/cau99/archive/2009/12/11/4987760.aspx
hibernate-HQL語(yǔ)句(1)
http://java.chinaitlab.com/Hibernate/809957.html
當(dāng)月第一天 select timestamp(concat(year(curdate()),'-',month(curdate()),'-','1')) 如2010-08-01 00:00:00
當(dāng)前時(shí)間 select now()
測(cè)試對(duì)于保證軟件開(kāi)發(fā)質(zhì)量有著非常重要的作用,單元測(cè)試更是必不可少,
JUnit是一個(gè)非常強(qiáng)
大的單元測(cè)試包,可以對(duì)一個(gè)/多個(gè)類的單個(gè)/多個(gè)方法測(cè)試,還可以將不同的TestCase組合成TestSuit,使測(cè)試
任務(wù)自動(dòng)化。Eclipse同樣集成了JUnit,可以非常方便地編寫(xiě)TestCase。
我們創(chuàng)
建一個(gè)Java工程,添加一個(gè)example.Hello類,首先我們給Hello類添加一個(gè)abs()方法,作用是返
回絕對(duì)值:

(圖一)
下一
步,我們準(zhǔn)備對(duì)這個(gè)方法進(jìn)行測(cè)試,確保功能正常。選中Hello.java,右
鍵點(diǎn)擊,選擇New->JUnit
Test Case:

(圖二)
Eclipse會(huì)詢問(wèn)是否添加junit.jar包,確定后新建一個(gè)HelloTest類,用來(lái)測(cè)試Hello類。

(圖三)
選中setUp()和tearDown(),然后點(diǎn)擊“Next”:

(圖
四)
選擇要
測(cè)試的方法,我們選中abs(int)方法,完成后在HelloTest.java中輸入:

(圖五)
JUnit會(huì)以以下順序執(zhí)行測(cè)試:(大致的代碼)
try {
HelloTest test = new HelloTest(); // 建立測(cè)試類實(shí)例
test.setUp(); // 初始化測(cè)試環(huán)境
test.testAbs();
// 測(cè)試某個(gè)方法
test.tearDown(); // 清理資源
}
catch…
setUp()是建立測(cè)試環(huán)境,這里創(chuàng)建一個(gè)Hello類的實(shí)例;tearDown()用于清理資源,如釋放打開(kāi)的文件等等。以test開(kāi)頭的方法被認(rèn)為是測(cè)試方法,JUnit會(huì)依次執(zhí)行testXxx()方法。在testAbs()方法中,我們對(duì)abs()的測(cè)試分別選擇
正數(shù),負(fù)數(shù)和0,如果方法返回值與期待結(jié)果相同,則assertEquals不會(huì)產(chǎn)生異常。
如果有
多個(gè)testXxx方法,JUnit會(huì)創(chuàng)建多個(gè)XxxTest實(shí)例,每次
運(yùn)行一個(gè)testXxx方法,setUp()和tearDown()會(huì)在testXxx前后被調(diào)用,因此,不要在一個(gè)testA()中依賴testB()。
直接運(yùn)
行Run->Run
As->JUnit Test,就可
以看到JUnit測(cè)試結(jié)果:

(圖六)
綠色表
示測(cè)試通過(guò),只要有1個(gè)測(cè)試未通過(guò),就會(huì)顯示紅色并列出未通過(guò)測(cè)試的方法。可以試圖改變abs()的代碼,故意返回錯(cuò)誤的結(jié)果(比如return n+1;),然后再運(yùn)行JUnit就會(huì)報(bào)告錯(cuò)誤。
如果沒(méi)
有JUnit面板,選擇Window->Show View->Other,打開(kāi)JUnit的View:

(圖七)
JUnit通過(guò)單元測(cè)試,能在開(kāi)發(fā)階段就找出許多Bug,并且,多個(gè)Test Case可以組合成Test Suite,讓
整個(gè)測(cè)試自動(dòng)完成,尤其適合于XP方法。每增加一個(gè)小的新功能或者對(duì)代碼進(jìn)行了小的修改,就立刻運(yùn)行一
遍Test Suite,確保新增和修改的代碼不會(huì)破壞原有的功能,大大增強(qiáng)軟件的可維護(hù)
性,避免代碼逐漸“腐爛”。
初次學(xué)會(huì)使用Junit的使用是通過(guò)這篇文章的(上文),自己嘗試跟著做了一遍,結(jié)果發(fā)現(xiàn)它上面提供的代碼例子是錯(cuò)誤
的,不過(guò)流程、圖片都很清楚。所以你可以先看看它上面是怎么說(shuō)的,至于測(cè)試的代碼我稍做了改動(dòng),為的是只要說(shuō)明問(wèn)題就行——其實(shí)不難。
被測(cè)試的類代碼:
public class HelloJunit {
public static int abs(int n){
return n>=0?n:(-n);
}
}
Junit的測(cè)試代碼:
import junit.framework.TestCase;
public class HelloJunitTest extends TestCase {
public void testAbs() {
assertEquals(HelloJunit.abs(10),10);
assertEquals(HelloJunit.abs(-10),10);
}
}
主要代碼
行為assertEquals(HelloJunit.abs(10),10);
其中參數(shù)
的意義為:
HelloJunit.abs(10)執(zhí)行類HelloJunit的abs方法(參數(shù)為10,表示求10的絕對(duì)值)。
逗號(hào)后面
的10表示為預(yù)期的結(jié)果(期望值)。
該行表示
將期望值(10)與實(shí)際值(類HelloJunit的abs方法執(zhí)行結(jié)果)進(jìn)行比較,如果不相
等則拋出異常。
這里只是
一個(gè)簡(jiǎn)簡(jiǎn)單單的例子,Junit被大家稱為優(yōu)秀的白盒自動(dòng)化測(cè)試框架,當(dāng)然只有自己用過(guò)了才會(huì)了解。網(wǎng)上有許多的資料介紹這個(gè)框架,筆
者也是從自身情況出發(fā)來(lái)學(xué)習(xí)它的。當(dāng)然學(xué)習(xí)使用它是需要有一定基礎(chǔ)的,筆者擁有C和C++的基礎(chǔ),對(duì)Java的學(xué)習(xí)也開(kāi)始不久,所以在這里將力
所能及的知識(shí)共享出來(lái)與大家分享,希望能夠共同提高。另外筆者是專職的測(cè)試人員,所以在描述一些問(wèn)題時(shí)大多都會(huì)以測(cè)試的角度來(lái)闡述。學(xué)習(xí)此框架的目的在于
能夠在工作中進(jìn)行白盒測(cè)試,在以后的介紹中還會(huì)介紹白盒測(cè)試相關(guān)的理論和工具,希望大家能夠一起提高進(jìn)步。
由于MySQL目前字段的默認(rèn)值不支持函數(shù)的形式設(shè)置默認(rèn)值是不可能的。
代替的方案是使用TIMESTAMP類型代替DATETIME類型。
CURRENT_TIMESTAMP
:當(dāng)我更新這條記錄的時(shí)候,這條記錄的這個(gè)字段不會(huì)改變。
CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
:當(dāng)我更新這條記錄的時(shí)候,這條記錄的這個(gè)字段將會(huì)改變。即時(shí)間變?yōu)榱烁聲r(shí)候的時(shí)間。(注意一個(gè)UPDATE設(shè)置一個(gè)列為它已經(jīng)有的值,這將不引起
TIMESTAMP列被更新,因?yàn)槿绻阍O(shè)置一個(gè)列為它當(dāng)前的值,MySQL為了效率而忽略更改。)如果有多個(gè)TIMESTAMP列,只有第一個(gè)自動(dòng)更
新。
TIMESTAMP列類型自動(dòng)地用當(dāng)前的日期和時(shí)間標(biāo)記INSERT或UPDATE的操作。
如果有多個(gè)
TIMESTAMP列,只有第一個(gè)自動(dòng)更新。
自動(dòng)更新第一個(gè)TIMESTAMP列在下列任何條件下發(fā)生:
列
值沒(méi)有明確地在一個(gè)INSERT或LOAD DATA INFILE語(yǔ)句中指定。
列值沒(méi)有明確地在一個(gè)UPDATE語(yǔ)句中指定且另
外一些的列改變值。(注意一個(gè)UPDATE設(shè)置一個(gè)列為它已經(jīng)有的值,這將不引起TIMESTAMP列被更新,因?yàn)槿绻阍O(shè)置一個(gè)列為它當(dāng)前的
值,MySQL為了效率而忽略更改。)
你明確地設(shè)定TIMESTAMP列為NULL.
除第一個(gè)以外的
TIMESTAMP列也可以設(shè)置到當(dāng)前的日期和時(shí)間,只要將列設(shè)為NULL,或NOW()。
另外在5.0以上版本中也可以使用
trigger來(lái)實(shí)現(xiàn)此功能。
create table test_time (
id int(11),
create_time
datetime
);
delimiter |
create
trigger default_datetime before insert on test_time
for each
row
if new.create_time is null then
set
new.create_time = now();
end if;|
delimiter ;
生成 注釋
應(yīng)該是選取要注釋內(nèi)容后, ctrl+shift+c 按一下注釋,按兩下取消注釋
ctrl+shift+"反注釋!能講ctrl+shift+/ 多行注釋掉的內(nèi)容反注釋掉
CTRL+T 查看接口的實(shí)現(xiàn)
MyEclipse調(diào)試
1.首先在一個(gè)java文件中設(shè)斷點(diǎn),然后運(yùn)行debug,當(dāng)程序走到斷點(diǎn)處就會(huì)停下。
2.F5鍵與F6鍵均為單步調(diào)試,
F5是step into,也就是進(jìn)入本行代碼中執(zhí)行(進(jìn)入函數(shù)執(zhí)行),
F6是step over,也就是執(zhí)行本行代碼,跳到下一行執(zhí)行(不進(jìn)入函數(shù)),
3.F7是跳出函數(shù) step return
4.F8是執(zhí)行到最后。
=====================================
1.Step Into (F5) 跳入
2.Step Over (F6) 跳過(guò)
3.Step Return (F7) 執(zhí)行完當(dāng)前method,然后return跳出此method
4.step Filter 逐步過(guò)濾
一直執(zhí)行直到遇到未經(jīng)過(guò)濾的位置或斷點(diǎn)(設(shè)置Filter:window-preferences-java-Debug-step
Filtering)
5.resume 重新開(kāi)始執(zhí)行debug,一直運(yùn)行直到遇到breakpoint
6.hit count 設(shè)置執(zhí)行次數(shù) 適合程序中的for循環(huán)(設(shè)置 breakpoint view-右鍵hit
count)
7.inspect 檢查 運(yùn)算。執(zhí)行一個(gè)表達(dá)式顯示執(zhí)行值
8.watch 實(shí)時(shí)地監(jiān)視變量的變化
9.我們常說(shuō)的斷點(diǎn)(breakpoints)是指line breakpoints,除了line
breakpoints,還有其他的斷點(diǎn)類型:field(watchpoint)breakpoint,method
breakpoint,exception breakpoint.
10.field breakpoint 也叫watchpoint(監(jiān)視點(diǎn)) 當(dāng)成員變量被讀取或修改時(shí)暫掛
11.添加method breakpoint 進(jìn)入/離開(kāi)此方法時(shí)暫掛(Run-method breakpoint)
12.添加Exception breakpoint 捕抓到Execption時(shí)暫掛(待續(xù)...)
斷點(diǎn)屬性:
1.hit count 執(zhí)行多少次數(shù)后暫掛 用于循環(huán)
2.enable condition 遇到符合你輸入條件(為ture\改變時(shí))就暫掛
3.suspend thread 多線程時(shí)暫掛此線程
4.suspend VM 暫掛虛擬機(jī)
13.variables 視圖里的變量可以改變變量值,在variables 視圖選擇變量點(diǎn)擊右鍵--change
value.一次來(lái)進(jìn)行快速調(diào)試。
14.debug
過(guò)程中修改了某些code后--〉save&build-->resume-->重新暫掛于斷點(diǎn)
===========================
例如你有如下程序:
public class debugtest {
來(lái)源:(http://blog.sina.com.cn/s/blog_624aa0960100fkrr.html)
- MyEclipse調(diào)試_匆匆過(guò)客_新浪博客
public String addDays() {
System.out.println("1");//
=============》(3)
String result = "";
//=============》(4)
System.out.println("2");//
=============》(5)
return result;
}
public static void main(String args[]) {
debugtest aa = new
debugtest();
int ii=9;
aa.addDays();//
=============》(1)
System.out.println("eeeeeeeeeeeeeee");//=============》(2)
}
}
你在(1)處加斷點(diǎn),運(yùn)行到此處時(shí)如果Step Into (F5)為跳入(進(jìn)入函數(shù)),則接著執(zhí)行到(3)。
再執(zhí)行Step Over (F6)執(zhí)行本行,則執(zhí)行到(4)。
最后執(zhí)行Step Return (also F7),則跳出addDays方法,跳到(2)
轉(zhuǎn)http://blog.sina.com.cn/s/blog_624aa0960100fkrr.html
MyEclipse 中顯示行號(hào) 要想顯示行號(hào),按住 Ctrl + F10 選擇 show Line Numbers
eclipse/myeclipse注釋模板的修改 alt+shitf+j
Window --> Java --> Code Style --> Code Templates --> Comments --> types --> Edit
/**
*
* 項(xiàng)目名稱:${project_name}
* 類名稱:${type_name}
* 類描述:
* 創(chuàng)建人:${user}
* 創(chuàng)建時(shí)間:${date} ${time}
* 修改人:${user}
* 修改時(shí)間:${date} ${time}
* 修改備注:
* @version
*
*/
http://www.javaeye.com/topic/585168
myeclipse中如何配置自定義的代碼排版格式 ctrl+shift+f
http://www.aygfsteel.com/bolo/
http://www.aygfsteel.com/bolo/archive/2010/04/11/318004.html
com.test.action.user包下:
SaveUserAction.java
SaveUserAction-validation.xml
SaveUserAction.java文件的內(nèi)容:
package com.test.action.user;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.User;
import com.test.service.UserService;
public class SaveUserAction extends ActionSupport
{
private User user;
private UserService service;
public User getUser()
{
return user;
}
public void setUser(User user)
{
this.user = user;
}
public UserService getService()
{
return service;
}
public void setService(UserService service)
{
this.service = service;
}
@Override
public String execute() throws Exception
{
this.service.save(this.user);
return SUCCESS;
}
@Override
@SuppressWarnings("unchecked")
public void validate()
{
Map map = this.getFieldErrors();
Set set = map.keySet();
for (Iterator iter = set.iterator(); iter.hasNext();)
{
System.out.println(map.get(iter.next()));
}
}
}
SaveUserAction-validation.xml的文件內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "
<validators>
<field name="user">
<field-validator type="visitor">
<param name="context">user</param>
<param name="appendPrefix">true</param>
<message>user's </message>
</field-validator>
</field>
</validators>
com.test.bean包下的文件:
User.java;
User-user-validation.xml
User-user-validation.xml文件的內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "
<validators>
<field name="firstname">
<field-validator type="requiredstring">
<message>required first name</message>
</field-validator>
</field>
<field name="lastname">
<field-validator type="requiredstring">
<message>required last name</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<message>required age</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>age should be between ${min} and
${max}</message>
</field-validator>
</field>
</validators>
還有一個(gè)問(wèn)題,就是校驗(yàn)信息會(huì)重復(fù),在錯(cuò)誤的情況下。由以下代碼可以測(cè)試:
@Override
@SuppressWarnings("unchecked")
public void validate()
{
Map map = this.getFieldErrors();
Set set = map.keySet();
for (Iterator iter = set.iterator(); iter.hasNext();)
{
System.out.println(map.get(iter.next()));
}
}
}
解決方法:
applicationContext.xml 文件中的配置action中加入:Struts 2.0 的action 是有狀態(tài)的
在spring 配置的action 中加上 scope="prototype";
配置如下:<bean id="saveUserAction"
class="com.test.action.user.SaveUserAction" scope="prototype">
<property name="service" ref="userService"></property>
</bean>
關(guān)鍵字: struts2,spring2,hibernate3,整合
今天在寢室窩了一天,由于前天老師給了個(gè)ss2+toplink的項(xiàng)目源碼,要我去消化。直接看那
三個(gè)整合具吃力,于是先從ssh2入手吧!
所使用的工具和環(huán)境。
jdk6+myeclipse6.5+tomcat6+mysql5+spring2.0+hibernate3+struts2
好了,開(kāi)始我們的第一個(gè)ssh2之旅吧。
首先先分析一下我們的第一個(gè)ssh2項(xiàng)目的需求,簡(jiǎn)單的說(shuō)就是有一張表單,
讓你填寫(xiě)用戶名和密碼,提交后存入數(shù)據(jù)庫(kù)。就這么簡(jiǎn)單,呵呵。
第一步:。我
們首先新建一張mysql數(shù)據(jù)表
sql如下
CREATE TABLE mytest.users (
id INT
NOT NULL,
username VARCHAR(50),
password VARCHAR(50),
PRIMARY KEY (id)
數(shù)據(jù)表創(chuàng)建好后結(jié)構(gòu)如下:
當(dāng)然我已經(jīng)有幾天數(shù)據(jù)添加進(jìn)去了
第二步
打開(kāi)myeclipse,新建一個(gè)web項(xiàng)目,
命名為ssh2-2, java ee規(guī)范我們選擇5,如圖
第三步 務(wù)必小心的一步
導(dǎo)
入ssh2的各個(gè)jar,步驟如下:
選中當(dāng)前的項(xiàng)目后,點(diǎn)擊菜單爛的myeclipse---project
capablities----add hibernate項(xiàng),跳出如圖
務(wù)必按照?qǐng)D示選擇,尤其是copy checkde……一項(xiàng),然后點(diǎn)擊next,默認(rèn)next,去掉specify
database……復(fù)選框,next,去掉create session……復(fù)選框,finish。
再次選中選中當(dāng)前的項(xiàng)目后,點(diǎn)擊
菜單爛的myeclipse---project capablities----add spring項(xiàng),跳出如圖
依然務(wù)必按照如是選擇,jar文件選擇如下5個(gè):
點(diǎn)擊next,
之后按下選擇,務(wù)必,
next后finsh即可。
然后導(dǎo)入struts2的jar
如下5個(gè)放到lib下
然后放入我們的數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar mysql-connector-java-5.0.8-bin.jar 沒(méi)得話附件中有
至
此,包都導(dǎo)入完畢
http://77857.blog.51cto.com/67857/149631
去網(wǎng)上找了一些相關(guān)錯(cuò)誤的信息看了下說(shuō)Hibernate core下面的xerces.jar包的問(wèn)題。刪除后正確了。
如果刪除后還是錯(cuò)誤,看一下項(xiàng)目的lib文件夾下面的是否還有xerces相關(guān)jar包,也刪掉。
記住把tomcat 里面xerces.jar也要?jiǎng)h掉
1:login.JSP
<form action="
login.action" method="post">
username:<input type="text" name="username"> <br/>
password:<input type="text" name="password"> <br/>
<input type="submit" name="submit"/>
</form>
<s:form action="login">
<s:textfield name="username" label="username"></s:textfield>
<s:password name="password" label="password"> </s:password>
<s:submit name="submit"></s:submit>
</s:form>
2:action
package com.test.action;
public class LoginAction {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
return "success";
}
}
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() throws Exception {
if("smallfa".equals(this.getUsername().trim())&&"smallfa".equals(this.getPassword().trim()))
{
return "success";
}
else
{
this.addFieldError(username, "username or password errors");
return "failer";
}
}
@Override
public void validate() {
if(null==this.getUsername()||"".equals(this.getUsername().trim()))
{
this.addFieldError(username, "username required");
}
if(null==this.getPassword()||"".equals(this.getPassword().trim()))
{
this.addFieldError(username, "username required");
}
}
}
3:struts-xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2" namespace="/" extends="struts-default">
<action name="login" class="com.test.action.LoginAction">
<result name="success">/result.jsp</result>
</action>
</package>
</struts>
4:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<!-- 定義核心Filter的名字 -->
<filter-name>struts2</filter-name>
<!-- 定義核心Filter的實(shí)現(xiàn)類 -->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
5:result.jsp
username:${requestScope.username}<br/>
password:${requestScope.password}<br/>
6:參考視頻
視頻:
Struts2入門(mén)與配置 浪曦 J2EE Struts 2應(yīng)用開(kāi)發(fā)詳解系列視頻
http://v.youku.com/v_show/id_XNTY4MDUwMzY=.html
離上次打球隔有一段時(shí)間了,終于有一個(gè)晚上等到好朋友早點(diǎn)下班,到了場(chǎng)地因天氣冷,既是場(chǎng)地有照明燈,過(guò)來(lái)的人比昔日還顯得稀少,直到打到后面基本也就我們兩隊(duì)在玩,今天打的還是挺過(guò)隱的,外投好多個(gè)球,其中最自感有一個(gè)是假動(dòng)作,突跨步一接三步路擦板進(jìn),確實(shí)好久沒(méi)進(jìn)這樣的球,只不過(guò)有點(diǎn)遺憾的我們隊(duì)竟有一個(gè)超極品的兄臺(tái),傳球失誤、防過(guò)老漏人、亂面、無(wú)語(yǔ)。讓我想了前個(gè)晚上比賽那位仁兄。
關(guān)于數(shù)據(jù)庫(kù)的學(xué)習(xí),個(gè)人意見(jiàn),僅供參考,本人也在學(xué)習(xí)中。
首先需要了解下 數(shù)據(jù)模型 關(guān)系數(shù)據(jù)庫(kù) DBMS 范式 自然運(yùn)算 等等概念性的東西,可以去書(shū)店或者圖書(shū)館查閱相關(guān)書(shū)籍,可以了解下,沒(méi)必要完全掌握,當(dāng)然你要能掌握的話,那么對(duì)你的以后是非常有幫助的。
其實(shí)然后就是SQL標(biāo)準(zhǔn) 對(duì)象關(guān)系SQL 基本的SQL查詢,以及最基本的SELECT/UPDATE/INSERT/DELETE語(yǔ)法,各種不同的數(shù)據(jù)庫(kù)大同小異的。
然后就是不同的數(shù)據(jù)庫(kù),不同的用法,你也可以專學(xué)一門(mén),比如ORACLE
或者M(jìn)SSQL MYSQL INFORMIX DB2主要這幾種~
這些入門(mén)了就可以學(xué)習(xí)嵌入數(shù)據(jù)庫(kù)了,訪問(wèn)數(shù)據(jù)庫(kù)的程序
以及數(shù)據(jù)庫(kù)的性能優(yōu)化,完整性,視圖,安全 目錄 備份 還原等等
當(dāng)然主要學(xué)習(xí)ORACLE的話你也可以先直接挑本ORACLE入門(mén)看,類似ORACLE10G入門(mén),ORACLE基礎(chǔ)的書(shū),不求完全懂,能看一點(diǎn)是一點(diǎn),學(xué)習(xí)ORACLE是一個(gè)長(zhǎng)期的過(guò)程,你在懂了一些后,再去看別的書(shū),你會(huì)找到很多相同點(diǎn),那時(shí)候就會(huì)有恍然大悟的感覺(jué),一點(diǎn)點(diǎn)看就OK了~
到了一定的程度,你就知道自己怎么去學(xué)習(xí),需要掌握些什么,像什么方向發(fā)展了。
另外在學(xué)習(xí)的過(guò)程中推薦有疑問(wèn)的就自己做實(shí)驗(yàn)操作,或者去各大論壇像CSDN,CNOUG,ITPUB,CNBLOGS查找答案或者提問(wèn),也可以下載里面的基礎(chǔ)區(qū)的教程了,不過(guò)大多是達(dá)人們整理出來(lái)的文檔,也很不錯(cuò)的,尤其前面兩個(gè)論壇你能學(xué)到很多東西的,不過(guò)還是推薦你先完整的看一本入門(mén)的后再說(shuō),不管理解了幾成,有什么問(wèn)題記下來(lái),以后慢慢一點(diǎn)點(diǎn)解決。
ORACLE視頻教程的話有個(gè)中科院的什么絕版培訓(xùn)教程oracle 10g的04年的視頻,非常不錯(cuò),迅雷上搜索中科院oracle 10g培訓(xùn)教程就能搜索到。
數(shù)據(jù)庫(kù)開(kāi)發(fā)工具的話 有TOAD(客戶端連接工具),POWERDESIGN(數(shù)據(jù)庫(kù)設(shè)計(jì)建模工具,), PL/SQL DESIGNER(PL/SQL開(kāi)發(fā)工具),一般這3個(gè)就夠用了,可以自己去迅雷搜索下載最新版本,另外的話還有一個(gè)叫DBATRIN,E/R 什么的工具,很多的,其實(shí)裝了ORACLE客戶端工具后,自帶的JAVA控制臺(tái)也很好用的。
當(dāng)然你想一蹴而就的話,可以直接去網(wǎng)上找相關(guān)的ORACLE入門(mén)資料,那些都是些整理出來(lái)的條條,不過(guò)不推薦,最好多看書(shū),多做實(shí)驗(yàn)。
Hibernate的對(duì)象有3種狀態(tài),分別為:瞬時(shí)態(tài)(Transient)、 持久態(tài)(Persistent)、脫管態(tài)(Detached)。處于持久態(tài)的對(duì)象也稱為PO(Persistence Object),瞬時(shí)對(duì)象和脫管對(duì)象也稱為VO(Value Object)。
由new命令開(kāi)辟內(nèi)存空間的java對(duì)象,
eg. Person person = new Person("amigo", "女");
如果沒(méi)有變量對(duì)該對(duì)象進(jìn)行引用,它將被java虛擬機(jī)回收。
瞬時(shí)對(duì)象在內(nèi)存孤立存在,它是攜帶信息的載體,不和數(shù)據(jù)庫(kù)的數(shù)據(jù)有任何關(guān)聯(lián)關(guān)系,在Hibernate中,可通過(guò)session的save()或saveOrUpdate()方法將瞬時(shí)對(duì)象與數(shù)據(jù)庫(kù)相關(guān)聯(lián),并將數(shù)據(jù)對(duì)應(yīng)的插入數(shù)據(jù)庫(kù)中,此時(shí)該瞬時(shí)對(duì)象轉(zhuǎn)變成持久化對(duì)象。
處于該狀態(tài)的對(duì)象在數(shù)據(jù)庫(kù)中具有對(duì)應(yīng)的記錄,并擁有一個(gè)持久化標(biāo)識(shí)。如果是用hibernate的delete()方法,對(duì)應(yīng)的持久對(duì)象就變成瞬時(shí)對(duì)象,因數(shù)據(jù)庫(kù)中的對(duì)應(yīng)數(shù)據(jù)已被刪除,該對(duì)象不再與數(shù)據(jù)庫(kù)的記錄關(guān)聯(lián)。
當(dāng)一個(gè)session執(zhí)行close()或clear()、evict()之后,持久對(duì)象變成脫管對(duì)象,此時(shí)持久對(duì)象會(huì)變成脫管對(duì)象,此時(shí)該對(duì)象雖然具有數(shù)據(jù)庫(kù)識(shí)別值,但它已不在HIbernate持久層的管理之下。
持久對(duì)象具有如下特點(diǎn):
1. 和session實(shí)例關(guān)聯(lián);
2. 在數(shù)據(jù)庫(kù)中有與之關(guān)聯(lián)的記錄。
當(dāng)與某持久對(duì)象關(guān)聯(lián)的session被關(guān)閉后,該持久對(duì)象轉(zhuǎn)變?yōu)槊摴軐?duì)象。當(dāng)脫管對(duì)象被重新關(guān)聯(lián)到session上時(shí),并再次轉(zhuǎn)變成持久對(duì)象。
脫管對(duì)象擁有數(shù)據(jù)庫(kù)的識(shí)別值,可通過(guò)update()、saveOrUpdate()等方法,轉(zhuǎn)變成持久對(duì)象。
脫管對(duì)象具有如下特點(diǎn):
1. 本質(zhì)上與瞬時(shí)對(duì)象相同,在沒(méi)有任何變量引用它時(shí),JVM會(huì)在適當(dāng)?shù)臅r(shí)候?qū)⑺厥眨?/p>
2. 比瞬時(shí)對(duì)象多了一個(gè)數(shù)據(jù)庫(kù)記錄標(biāo)識(shí)值。
本文摘自孫衛(wèi)琴的《精通Hibernate:Java對(duì)象持久化技術(shù)詳情》
Hibernate有如下5個(gè)核心接口:
- Configuration接口:該對(duì)象用于配置并且根啟動(dòng)Hibernate。Hibernate應(yīng)用通過(guò)Configuration實(shí)例來(lái)指定對(duì)象-關(guān)系映射文件的位置或動(dòng)態(tài)配置Hibernate的屬性,然后創(chuàng)建SessionFactory實(shí)例。
- SessionFactory接口:一個(gè)SessionFactory實(shí)例對(duì)應(yīng)一個(gè)數(shù)據(jù)存儲(chǔ)源,應(yīng)用從SessionFactory中獲得Session實(shí)例。它具有如下特點(diǎn):
1)它是線程安全的,這意味著它的同一個(gè)實(shí)例可以被應(yīng)用的各個(gè)線程共享。
2)它是重量級(jí)的,這意味著不能隨意創(chuàng)建或銷毀它的實(shí)例。如果應(yīng)用只訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),只需創(chuàng)建一個(gè)SessionFactory實(shí)例,在應(yīng)用初始化的時(shí)候創(chuàng)建該實(shí)例。如果應(yīng)用同時(shí)訪問(wèn)多個(gè)數(shù)據(jù)庫(kù),則需要為每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)單獨(dú)的SessionFactory實(shí)例。
之所以說(shuō)SessionFactory是重量級(jí)的,是因?yàn)樗枰粋€(gè)很大的緩存,用來(lái)存放預(yù)定義的SQL語(yǔ)句以及映射元數(shù)據(jù)等。用戶還可以為SessionFactory配置一個(gè)緩存插件,這個(gè)緩存插件被稱為Hibernate的第二級(jí)緩存,該緩存用來(lái)存放被工作單元讀過(guò)的數(shù)據(jù),將來(lái)其它工作單元可能會(huì)重用這些數(shù)據(jù),因此這個(gè)緩存中的數(shù)據(jù)能夠被所有工作單元共享,一個(gè)工作單元通常對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)事務(wù)。
- Session接口:該接口是Hibernate應(yīng)用使用最廣泛的接口。Session也被稱為持久化管理器,提供了和持久化相關(guān)的操作,如添加、更新、刪除、加載和查詢對(duì)象。Session具有一下特點(diǎn):
1)不是線程安全的,因此在設(shè)計(jì)軟件架構(gòu)時(shí),應(yīng)該避免多個(gè)線程共享同一個(gè)Session實(shí)例;
2)Session實(shí)例是輕量級(jí)的,所謂輕量級(jí),是指它的創(chuàng)建和銷毀不需要消耗太多的資源。這意味著在程序中可以經(jīng)常創(chuàng)建和銷毀Session對(duì)象,例如為每個(gè)客戶請(qǐng)求分配單獨(dú)的Session實(shí)例,或者為每個(gè)工作單元分配單獨(dú)的Session實(shí)例。
Session有一個(gè)緩存,被稱為Hibernate的第一級(jí)緩存,它存放被當(dāng)前工作單元加載的對(duì)象。每個(gè)Session實(shí)例都有自己的緩存,這個(gè)Session實(shí)例的緩存,這個(gè)Session實(shí)例的緩存只能被當(dāng)前工作單元訪問(wèn)。
- Transaction:該接口是Hibernate的數(shù)據(jù)庫(kù)事務(wù)接口,它對(duì)底層的事務(wù)接口做了封裝,底層事務(wù)接口包括:JDBC API、JTA(Java Transaction API)、CORBA(Common Object Requet Broker Architecture) API.
Hibernate應(yīng)用可通過(guò)一致的Transaction接口來(lái)聲明事務(wù)邊界,這有助于應(yīng)用在不同環(huán)境或容器中移植。
- Query和Criteria接口:它們是Hibernate的查詢接口,用于向數(shù)據(jù)庫(kù)查詢對(duì)象,以及控制執(zhí)行查詢的過(guò)程。Query實(shí)例封裝了一個(gè)HQL(Hibernate Query Language)查詢語(yǔ)句,HQL是面向?qū)ο蟮模妙惷邦惖膶傩悦皇潜砻氨淼淖侄蚊riteria接口完全封裝了基于字符串形式的查詢語(yǔ)句,比Query接口更加面向?qū)ο螅珻riteria接口更擅長(zhǎng)于執(zhí)行動(dòng)態(tài)查詢。
<set
name="propertyName" (1)
table="table_name" (2)
schema="schema_name" (3)
lazy="true|false" (4)
inverse="true|false" (5)
cascade="all|none|save-update|delete|all-delete-orphan" (6)
sort="unsorted|natural|comparatorClass" (7)
order-by="column_name asc|desc" (8)
where="arbitrary sql where condition" (9)
outer-join="true|false|auto" (10)
batch-size="N" (11)
access="field|property|ClassName" (12)
>
<key .... />
<index .... />
<element .... />
</set>
(1) name 集合屬性的名稱
(2) table (可選——默認(rèn)為屬性的名稱)這個(gè)集合表的名稱(不能在一對(duì)多的關(guān)聯(lián)關(guān)系中使用)
(3) schema (可選) 表的schema的名稱, 他將覆蓋在根元素中定義的schema
(4) lazy (可選——默認(rèn)為false) lazy(可選--默認(rèn)為false) 允許延遲加載(lazy initialization )(不能在數(shù)組中使用)
(5) inverse (可選——默認(rèn)為false) 標(biāo)記這個(gè)集合作為雙向關(guān)聯(lián)關(guān)系中的方向一端。
(6) cascade (可選——默認(rèn)為none) 讓操作級(jí)聯(lián)到子實(shí)體
(7) sort(可選)指定集合的排序順序, 其可以為自然的(natural)或者給定一個(gè)用來(lái)比較的類。
(8) order-by (可選, 僅用于jdk1.4) 指定表的字段(一個(gè)或幾個(gè))再加上asc或者desc(可選), 定義Map,Set和Bag的迭代順序
(9) where (可選) 指定任意的SQL where條件, 該條件將在重新載入或者刪除這個(gè)集合時(shí)使用(當(dāng)集合中的數(shù)據(jù)僅僅是所有可用數(shù)據(jù)的一個(gè)子集時(shí)這個(gè)條件非常有用)
(10) outer-join(可選)指定這個(gè)集合,只要可能,應(yīng)該通過(guò)外連接(outer join)取得。在每一個(gè)SQL語(yǔ)句中, 只能有一個(gè)集合可以被通過(guò)外連接抓取(譯者注: 這里提到的SQL語(yǔ)句是取得集合所屬類的數(shù)據(jù)的Select語(yǔ)句)
(11) batch-size (可選, 默認(rèn)為1) 指定通過(guò)延遲加載取得集合實(shí)例的批處理塊大小("batch size")。
(12) access(可選-默認(rèn)為屬性property):Hibernate取得屬性值時(shí)使用的策略
摘要: 原文出處:http://tech.it168.com/j/d/2007-05-14/200705141007843.shtml
說(shuō)明:該文不得轉(zhuǎn)載
摘要:本文以詳盡的實(shí)例展示了hibernate3.x中調(diào)用存儲(chǔ)過(guò)程各步驟,從建立測(cè)試表、存儲(chǔ)過(guò)程的建立、工程的建立以及類的編寫(xiě)和測(cè)試一步一步引導(dǎo)用戶學(xué)習(xí)hibernate3.x中調(diào)用存儲(chǔ)過(guò)程的方法.
如果底層數(shù)據(jù)庫(kù)(eg. Oracle、mysq...
閱讀全文
Hibernate的描述文件可以是一個(gè)properties屬性文件,也可以是一個(gè)xml文件。下面講一下Hibernate.cfg.xml的配置。配置格式如下:
1. 配置數(shù)據(jù)源
在Hibernate.cfg.xml中既可以配置JDBC,也可以配置JNDI。在本小節(jié)中講述數(shù)據(jù)源如何配置。
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 各屬性的配置-->
<!—為true表示將Hibernate發(fā)送給數(shù)據(jù)庫(kù)的sql顯示出來(lái) -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設(shè)定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- 一次讀的數(shù)據(jù)庫(kù)記錄數(shù) -->
<property name="jdbc.fetch_size">50</property>
<!-- 設(shè)定對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量刪除 -->
<property name="jdbc.batch_size">30</property>
<!—下面為JNDI的配置 -->
<!-- 數(shù)據(jù)源的名稱 -->
<property name="connection.datasource">java:comp/env/jdbc/datasourcename</property>
<!-- Hibernate的連接加載類 -->
<property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property>
<property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
<!—映射文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2. c3p0連接池
c3p0連接池是Hibernate推薦使用的連接池,若需要使用該連接池時(shí),需要將c3p0的jar包加入到classpath中。c3p0連接池的配置示例如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實(shí)際操作數(shù)據(jù)庫(kù)時(shí)的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設(shè)定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!--驅(qū)動(dòng)程序,在后續(xù)的章節(jié)中將講述mysql、sqlserver和Oracle數(shù)據(jù)庫(kù)的配置 -->
<property name="connection.driver_class">……</property>
<!-- JDBC URL -->
<property name="connection.url">……</property>
<!-- 數(shù)據(jù)庫(kù)用戶名 -->
<property name="connection.username">user</property>
<!-- 數(shù)據(jù)庫(kù)密碼 -->
<property name="connection.password">pass</property>
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">50</property>
<!-- 對(duì)象與數(shù)據(jù)庫(kù)表格映像文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在上述配置中,Hibernate根據(jù)配置文件生成連接,再交給c3p0管理。
3. proxool連接池
proxool跟c3p0以及dbcp不一樣,它是自己生成連接的,因此連接信息放在proxool配置文件中。使用它時(shí),需要將proxool-0.8.3.jar加入到classespath中。配置舉例如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實(shí)際操作數(shù)據(jù)庫(kù)時(shí)的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設(shè)定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!—proxool的配置 -->
<property name="proxool.pool_alias">pool1</property>
<property name="proxool.xml">ProxoolConf.xml</property>
<property name="connection.provider_class">net.sf.hibernate.connection.ProxoolConnectionProvider</property>
<!-- 對(duì)象與數(shù)據(jù)庫(kù)表格映像文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在hibernate.cfg.xml的同目錄下編寫(xiě)proxool的配置文件:ProxoolConf.xml,該文件的配置實(shí)例如下:
ProxoolConf.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
<alias>pool1</alias>
<!--proxool只能管理由自己產(chǎn)生的連接-->
<!-- 驅(qū)動(dòng)的url-->
<!-- jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=GBK-->
<driver-url>… </driver-url>
<!-- 驅(qū)動(dòng)類,eg. com.mysql.jdbc.Driver-->
<driver-class>… </driver-class>
<driver-properties>
<!-- 數(shù)據(jù)庫(kù)用戶名,eg. value為root-->
<property name="user" value="…"/>
<!-- 數(shù)據(jù)庫(kù)密碼,eg. value為root-->
<property name="password" value="…."/>
</driver-properties>
<!-- proxool自動(dòng)偵察各個(gè)連接狀態(tài)的時(shí)間間隔(毫秒),偵察到空閑的連接就馬上回收,超時(shí)的銷毀-->
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<!-- 指因未有空閑連接可以分配而在隊(duì)列中等候的最大請(qǐng)求數(shù),超過(guò)這個(gè)請(qǐng)求數(shù)的用戶連接就不會(huì)被接受-->
<maximum-new-connections>20</maximum-new-connections>
<!-- 最少保持的空閑連接數(shù)-->
<prototype-count>5</prototype-count>
<!-- 允許最大連接數(shù),超過(guò)了這個(gè)連接,再有請(qǐng)求時(shí),就排在隊(duì)列中等候,最大的等待請(qǐng)求數(shù)由maximum-new-connections決定-->
<maximum-connection-count>100</maximum-connection-count>
<!-- 最小連接數(shù)-->
<minimum-connection-count>10</minimum-connection-count>
</proxool>
</something-else-entirely>
4. dbcp連接池
在hibernate3.0中,已經(jīng)不再支持dbcp了,hibernate的作者在hibernate.org中,明確指出在實(shí)踐中發(fā)現(xiàn)dbcp有 BUG,在某些種情會(huì)產(chǎn)生很多空連接不能釋放,所以拋棄了對(duì)dbcp的支持。若需要使用dbcp,開(kāi)發(fā)人員還需要將commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar兩個(gè)jar包加入到classpath中。dbcp與c3p0一樣,都是由hibernate建立連接的。
在hibernate2.0中的配置建立如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 顯示實(shí)際操作數(shù)據(jù)庫(kù)時(shí)的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設(shè)定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!--驅(qū)動(dòng)程序,在后續(xù)的章節(jié)中將講述mysql、sqlserver和Oracle數(shù)據(jù)庫(kù)的配置 -->
<property name="connection.driver_class">……</property>
<!-- JDBC URL -->
<property name="connection.url">……</property>
<!-- 數(shù)據(jù)庫(kù)用戶名,eg. root -->
<property name="connection.username">…</property>
<!-- 數(shù)據(jù)庫(kù)密碼, eg. root-->
<property name="connection.password">…</property>
<property name="dbcp.maxActive">100</property>
<property name="dbcp.whenExhaustedAction">1</property>
<property name="dbcp.maxWait">60000</property>
<property name="dbcp.maxIdle">10</property>
<property name="dbcp.ps.maxActive">100</property>
<property name="dbcp.ps.whenExhaustedAction">1</property>
<property name="dbcp.ps.maxWait">60000</property>
<property name="dbcp.ps.maxIdle">10</property>
<!-- 對(duì)象與數(shù)據(jù)庫(kù)表格映像文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5. MySql連接配置
在hibernate中,可以配置很多種數(shù)據(jù)庫(kù),例如MySql、Sql Server和Oracle,MySql的配置舉例如下:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 各屬性的配置-->
<!—為true表示將Hibernate發(fā)送給數(shù)據(jù)庫(kù)的sql顯示出來(lái) -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設(shè)定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- 一次讀的數(shù)據(jù)庫(kù)記錄數(shù) -->
<property name="jdbc.fetch_size">50</property>
<!-- 設(shè)定對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量刪除 -->
<property name="jdbc.batch_size">30</property>
<!--驅(qū)動(dòng)程序-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/dbname?characterEncoding=gb2312</property>
<!-- 數(shù)據(jù)庫(kù)用戶名-->
<property name="connection.username">root</property>
<!-- 數(shù)據(jù)庫(kù)密碼-->
<property name="connection.password">root</property>
<!—映射文件 -->
<mapping resource="com/amigo/pojo/User.hbm.xml"/>
<mapping resource="com/amigo/pojo/Org.hbm.xml"/>
</session-factory>
</hibernate-configuration>
上面使用的驅(qū)動(dòng)類是com.mysql.jdbc.Driver。需要將MySql的連接器jar包(eg. mysql-connector-java-5.0.4-bin.jar)加入到classpath中。
6. Sql Server連接配置
本小節(jié)講述一下Sql Server數(shù)據(jù)庫(kù)的hibernate連接設(shè)置,在此只給出連接部分的內(nèi)容,其余部分與2.2.1.5一樣,在此不再贅述。內(nèi)容如下:
<!--驅(qū)動(dòng)程序-->
<property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:jtds:sqlserver://localhost:1433;DatabaseName=dbname</property>
<!-- 數(shù)據(jù)庫(kù)用戶名-->
<property name="connection.username">sa</property>
<!-- 數(shù)據(jù)庫(kù)密碼-->
<property name="connection.password"></property>
上例的驅(qū)動(dòng)類使用的是jtds的驅(qū)動(dòng)類,因此讀者需要將jtds的jar包(eg. jtds-1.2.jar)加入到classpath中。
7. Oracle連接配置
本小節(jié)講述一下Sql Server數(shù)據(jù)庫(kù)的hibernate連接設(shè)置,在此只給出連接部分的內(nèi)容,其余部分與2.2.1.5一樣,在此不再贅述。內(nèi)容如下:
<!--驅(qū)動(dòng)程序-->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:dbname</property>
<!-- 數(shù)據(jù)庫(kù)用戶名-->
<property name="connection.username">test</property>
<!-- 數(shù)據(jù)庫(kù)密碼-->
<property name="connection.password">test</property>
上例使用的驅(qū)動(dòng)類為:oracle.jdbc.driver.OracleDriver,開(kāi)發(fā)人員需要將相關(guān)的jar包(ojdbc14.jar)加入到classpath中。
http://www.aygfsteel.com/amigoxie/archive/2007/12/29/171395.html
本節(jié)講述如何使用Hibernate實(shí)現(xiàn)記錄的增、刪、改和查功能。
1 查詢
在Hibernate中使用查詢時(shí),一般使用Hql查詢語(yǔ)句。
HQL(Hibernate Query Language),即Hibernate的查詢語(yǔ)言跟SQL非常相像。不過(guò)HQL與SQL的最根本的區(qū)別,就是它是面向?qū)ο蟮摹?/span>
使用HQL時(shí)需要注意以下幾點(diǎn):
l 大小寫(xiě)敏感
因?yàn)?/span>HQL是面向?qū)ο蟮模鴮?duì)象類的名稱和屬性都是大小寫(xiě)敏感的,所以HQL是大小寫(xiě)敏感的。
Eg.
HQL語(yǔ)句:from Cat as cat where cat.id > 1;與from Cat as cat where cat.ID > 1;是不一樣的,這點(diǎn)與SQL不同。
l from子句
Eg. from Cat,該句返回Cat對(duì)象實(shí)例,開(kāi)發(fā)人員也可以給其加上別名,eg. from Cat as cat,對(duì)于多表查詢的情況,可參考如下:
from Cat as cat, Dog as dog
其它方面都與SQL類似,在此不再贅述。
接下來(lái)講一個(gè)在Hibernate中查詢的例子。
1.1簡(jiǎn)單查詢
List list = session.createQuery("from User as user order by user.loginName").list();
1.2帶單個(gè)參數(shù)的查詢
List list = session.find("from User as user where user.loginName=?",
loginName,
Hibernate.STRING);
1.3多個(gè)參數(shù)的查詢
Eg1. 此例采用“?”占位符的方式
String hql = "from User as user where user.loginName=? and user.orgId=? ";
Query query = session.createQuery(hql);
query.setParameter(1, 'amigo');
query.setParameter(2, new Long(1)) ;
List list = query .list();
Eg2. 此例采用“:paramName”的方式
String hql = "from User as user where user.loginName=:loginName and user.orgId=:orgId ";
Query query = session.createQuery(hql);
query.setParameter('loginName', 'amigo');
query.setParameter('orgId', new Long(1)) ;
List list = query .list();
1.4查詢數(shù)量
int count = (Integer) session.createQuery("select count(*) from User").uniqueResult().intValue();
1.5限制查詢起始值和數(shù)量的查詢
這種一般是在記錄需要分頁(yè)的時(shí)候需要用到,例如,在如下的代碼中,限制查詢的開(kāi)始記錄的位置為50,最大查詢條數(shù)為50。
String hql = "from User as user order by user.loginName";
int firstResult= 50;
int maxResults = 50;
Query query = session.createQuery(hql);
query = query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
1.6子查詢
在某些情況下,也需要用到子查詢,例如在下面的例子中,User為用戶對(duì)象,UserRole為用戶與角色關(guān)聯(lián)對(duì)象。如下HQL語(yǔ)句將沒(méi)有分配角色的用戶對(duì)象查找出來(lái)。
String hql = "from User user where user.loginName"
+ " not in(select ur.user.loginName from UserRole ur) ";
List list = (session.createQuery(hql)).list();
1.7原生SQL查詢
對(duì)于某些復(fù)雜的查詢語(yǔ)句,需要調(diào)用某種特定的數(shù)據(jù)庫(kù)的特定函數(shù)才能解決,Hibernate雖然不推薦使用原生SQL語(yǔ)句來(lái)查詢,因?yàn)檫@將破壞數(shù)據(jù)庫(kù)的易移植性,但是Hibernate中也提供了使用原生SQL進(jìn)行查詢的方法,只需要獲得連接即可。
Eg. 在下面的例子中,用到了Sql Server數(shù)據(jù)庫(kù)中的原生sql語(yǔ)句,如下所示:
String timeUnit = "13";
String sql = "select count(*) count, CONVERT(VARCHAR(" + timeUnit +"), log.gen_datetime,121) timeUnit " + "from Log log";
SQLQuery query = session.createSQLQuery(sql)
.addScalar("count", Hibernate.INTEGER)
.addScalar("timeUnit", Hibernate.STRING);
List list = query.list();
2 新增
在數(shù)據(jù)庫(kù)中新增記錄在Hibernate中不需要使用insert命令,只需要構(gòu)造新增的對(duì)象后,調(diào)用Session對(duì)象的save(…)方法即可。
2.1新增單個(gè)對(duì)象
新增單個(gè)對(duì)象的實(shí)例如下,該實(shí)例將在用戶表中新增一條記錄。
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
User user = new User();
user.setLoginName("amigo");
user.setFullName("阿蜜果");
……
session.save(user) ;
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
2.2批量新增對(duì)象
對(duì)于批量新增對(duì)象的情況,需要在新增一部分對(duì)象后flush和clear一次,例如,沒(méi)批量新增20個(gè)對(duì)象時(shí)手動(dòng)的flush一次,假設(shè)在list為一個(gè)用戶列表,里面包含很多User對(duì)象,那么要將實(shí)現(xiàn)這些對(duì)象的批量新增,可采用如下方法:
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
for (int i = 0; i < list.size(); i++) {
User user = (User) list.get(i);
session.save(user) ;
if (i % 20 == 0) {
session.flush();
session.clear();
}
}
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
3 更新
在hibernate中,更新對(duì)象前不需要使用查詢語(yǔ)句:update…,一般需要在取得需要更新的持久化對(duì)象后,執(zhí)行Session對(duì)象的update(…)方法。例如:
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
//取得持久化對(duì)象
User user = session.get(User.class, "amigo");
//對(duì)需要修改的屬性進(jìn)行修改
user.setFullName("阿蜜果");
……
session.update(user) ;
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
4 刪除
4.1刪除單個(gè)對(duì)象
一般在取得某對(duì)象后,開(kāi)發(fā)人員可以調(diào)用Session對(duì)象的delete(…)方法刪除該對(duì)象。
Eg. 下面的實(shí)例中取得loginName(主鍵)為“amigo”的User對(duì)象后,將它刪除。
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
//取得持久化對(duì)象
User user = session.get(User.class, "amigo");
session.delete(user) ;
ts.commit();
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
4.2批量刪除對(duì)象
對(duì)于批量刪除對(duì)象的情況,開(kāi)發(fā)人員可以在取得待刪除的對(duì)象列表后,一個(gè)一個(gè)的將對(duì)象刪除,對(duì)于每個(gè)對(duì)象的刪除方法,見(jiàn)3.4.1小節(jié)。開(kāi)發(fā)人員還可以hql語(yǔ)句來(lái)做批量刪除。
Eg. 該實(shí)例通過(guò)delete語(yǔ)句來(lái)刪除記錄,除了loginName為“amigo”的對(duì)象為,其余都刪除,代碼如下所示:
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
try {
ts = session.beginTransaction();
String hql = "delete User as user where user.loginName != 'amigo'";
Query query = session.createQuery(hql);
int count = query.executeUpdate();
ts.commit();
System.out.println("delete count : " + count); //刪除條數(shù)
} catch (Exception e) {
if (ts != null) {
ts.rollback();
}
} finally {
HibernateSessionFactory.closeSession();
}
http://www.aygfsteel.com/amigoxie/archive/2008/01/01/171972.html
本文總結(jié)Hibernate中常見(jiàn)的異常。
1. net.sf.hibernate.MappingException
當(dāng)出現(xiàn)net.sf.hibernate.MappingException: Error reading resource:…異常時(shí)一般是因?yàn)橛成湮募霈F(xiàn)錯(cuò)誤。
當(dāng)出現(xiàn)net.sf.hibernate.MappingException: Resource: … not found是因?yàn)?/span>XML配置文件沒(méi)找到所致,有可能是放置目錄不正確,或者沒(méi)將其加入hibernate.cfg.xml中。
2. net.sf.hibernate.PropertyNotFoundException
當(dāng)出現(xiàn)net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class …時(shí),原因一般是因?yàn)?/span>XML映射文件中的屬性與對(duì)應(yīng)的Java類中的屬性的getter或setter方法不一致。
3. org.hibernate.id.IdentifierGenerationException
當(dāng)出現(xiàn)org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():異常時(shí),一般是因?yàn)?/span><id>元素配置不正確,<id>元素缺少其子元素<generator></generator>的配置引起。
解決方案:<id>元素映射了相應(yīng)數(shù)據(jù)庫(kù)表的主鍵字段,對(duì)其子元素<generator class="">,其中class的取值可以為increment、identity、sequence、hilo、native……等,更多的可參考hibernate參考文檔,一般取其值為native 。具體可參考2.2.2.1小節(jié)。
4. a different object with the same identifier value was already associated with the session
當(dāng)出現(xiàn)a different object with the same identifier value was already associated with the session時(shí),一般是因?yàn)樵?/span>hibernate中同一個(gè)session里面有了兩個(gè)相同標(biāo)識(shí)但是是不同實(shí)體。
有如下幾種解決方案:
(1)使用session.clean(),如果在clean操作后面又進(jìn)行了saveOrUpdate(object)等改變數(shù)據(jù)狀態(tài)的操作,有可能會(huì)報(bào)出"Found two representations of same collection"異常。
(2)使用session.refresh(object),當(dāng)object不是數(shù)據(jù)庫(kù)中已有數(shù)據(jù)的對(duì)象的時(shí)候,不能使用session.refresh(object)因?yàn)樵摲椒ㄊ菑?/span>hibernate的session中去重新取object,如果session中沒(méi)有這個(gè)對(duì)象,則會(huì)報(bào)錯(cuò)所以當(dāng)你使用saveOrUpdate(object)之前還需要判斷一下。
(3)session.merge(object),Hibernate里面自帶的方法,推薦使用。
5. SQL Grammer Exception,Could not execute JDBC batch update
當(dāng)出現(xiàn)SQL Grammer Exception,Could not execute JDBC batch update異常時(shí),一般是由如下問(wèn)題引起:
(1)SQL語(yǔ)句中存在語(yǔ)法錯(cuò)誤或是傳入的數(shù)據(jù)有誤;
(2)數(shù)據(jù)庫(kù)的配置不合法,或者說(shuō)是配置有誤。較容易出現(xiàn)的有數(shù)據(jù)表的映射文件(,hbm.xml文件)配置有誤;Hibernate.cfg.xml文件配置有誤;
(3) 當(dāng)前的數(shù)據(jù)庫(kù)用戶權(quán)限不足,不能操作數(shù)據(jù)庫(kù)。以是以Oracle 數(shù)據(jù)庫(kù)為例,這種情況下在錯(cuò)誤提示中會(huì)顯示java.sql.BatchUpdateException: ORA-01031: insufficient privileges這樣的信息。
針對(duì)上面的各種原因,開(kāi)發(fā)人員可以找出對(duì)應(yīng)的解決方案。
http://www.aygfsteel.com/amigoxie/category/19976.html
在Hibernate
中,各表的映射文件….hbm.xml
可以通過(guò)工具生成,例如在使用MyEclipse
開(kāi)發(fā)時(shí),它提供了自動(dòng)生成映射文件的工具。本節(jié)簡(jiǎn)單的講述一下這些配置文件的配置。
配置文件的基本結(jié)構(gòu)如下:
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="包名">
<class name="類名" table="表名">
<id name="主鍵在java類中的字段名" column="對(duì)應(yīng)表中字段" type="類型 ">
<generator class="主鍵生成策略"/>
</id>
……
</class>
</hibernate-mapping>
1. 主鍵(id)
Hibernate的主鍵生成策略有如下幾種:
1) assigned
主鍵由外部程序負(fù)責(zé)生成,在 save() 之前指定。
2) hilo
通過(guò)hi/lo 算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要額外的數(shù)據(jù)庫(kù)表或字段提供高位值來(lái)源。
3) seqhilo
與hilo 類似,通過(guò)hi/lo 算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要數(shù)據(jù)庫(kù)中的 Sequence,適用于支持 Sequence 的數(shù)據(jù)庫(kù),如Oracle。
4) increment
主鍵按數(shù)值順序遞增。此方式的實(shí)現(xiàn)機(jī)制為在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存著當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?/span>1作為主鍵。這種方式可能產(chǎn)生的問(wèn)題是:不能在集群下使用。
5) identity
采用數(shù)據(jù)庫(kù)提供的主鍵生成機(jī)制。如DB2、SQL Server、MySQL 中的主鍵生成機(jī)制。
6) sequence
采用數(shù)據(jù)庫(kù)提供的 sequence 機(jī)制生成主鍵。如 Oralce 中的Sequence。
7) native
由 Hibernate 根據(jù)使用的數(shù)據(jù)庫(kù)自行判斷采用 identity、hilo、sequence 其中一種作為主鍵生成方式。
8) uuid.hex
由 Hibernate 基于128 位 UUID 算法 生成16 進(jìn)制數(shù)值(編碼后以長(zhǎng)度32 的字符串表示)作為主鍵。
9) uuid.string
與uuid.hex 類似,只是生成的主鍵未進(jìn)行編碼(長(zhǎng)度16),不能應(yīng)用在 PostgreSQL 數(shù)據(jù)庫(kù)中。
10) foreign
使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符作為主鍵。
主鍵配置舉例如下:
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
另外還可以擴(kuò)展Hibernate的類來(lái)做自己的主鍵生成策略,具體例子見(jiàn):http://www.javaeye.com/topic/93391。
2. 普通屬性(property)
開(kāi)發(fā)人員可以打開(kāi)網(wǎng)址:http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
來(lái)查看hibernate3.0的dtd信息,可看到property的定義如下:
<!ELEMENT property (meta*,(column|formula)*,type?)>
<!ATTLIST property name CDATA #REQUIRED>
<!ATTLIST property node CDATA #IMPLIED>
<!ATTLIST property access CDATA #IMPLIED>
<!ATTLIST property type CDATA #IMPLIED>
<!ATTLIST property column CDATA #IMPLIED>
<!ATTLIST property length CDATA #IMPLIED>
<!ATTLIST property precision CDATA #IMPLIED>
<!ATTLIST property scale CDATA #IMPLIED>
<!ATTLIST property not-null (true|false) #IMPLIED>
<!ATTLIST property unique (true|false) "false">
<!ATTLIST property unique-key CDATA #IMPLIED>
<!ATTLIST property index CDATA #IMPLIED> <!-- include the columns spanned by this property in an index -->
<!ATTLIST property update (true|false) #IMPLIED>
<!ATTLIST property insert (true|false) #IMPLIED>
<!ATTLIST property optimistic-lock (true|false) "true"> <!-- only supported for properties of a class (not component) -->
<!ATTLIST property formula CDATA #IMPLIED>
<!ATTLIST property lazy (true|false) "false">
<!ATTLIST property generated (never|insert|always) "never">
它的各屬性中比較常用的有:name(對(duì)應(yīng)的java類的屬性名稱)、column(對(duì)應(yīng)的表中的字段)、tyope(屬性的類型,eg.java.lang.String)、not-null(設(shè)置該屬性是否為空,為true時(shí)表示非空,默認(rèn)為false)和length(字段的長(zhǎng)度限制)。
Eg1. <property name="accessname" column="accessName" type="java.lang.String" not-null="true" />
Eg2. <property name="state" column="state" type="java.lang.Byte" not-null="true" />
Eg3. <property name="description" column="description" type="java.lang.String" />
3. 一對(duì)多關(guān)系(<many-to-one…/>和<set…></set>)
一對(duì)多關(guān)系一般是用在一個(gè)表與另一個(gè)表存在外鍵關(guān)聯(lián)的時(shí)候,例如用戶表的組織id與組織表存在外鍵關(guān)聯(lián),則“一”方為組織表,“多”方為用戶表,因?yàn)橐粋€(gè)組織可以包含多個(gè)用戶,而一個(gè)用戶只能隸屬于一個(gè)組織。
對(duì)于存在一對(duì)多關(guān)系和多對(duì)一關(guān)系的雙方,需要在…hbm.xml中進(jìn)行相應(yīng)配置,這時(shí)在“一”方(例如:組織)需要在映射文件中添加<set…></set>元素,因?yàn)樗鄠€(gè)“多”方的對(duì)象,一般的格式如下:
<set name="java映射類中對(duì)應(yīng)的屬性" inverse="true" lazy="true">
<key column="表中對(duì)應(yīng)字段"/>
<one-to-many class="多方的類"/>
</set>
Eg.
<set name="userSet" inverse="true" lazy="true">
<key column="orgId"/>
<one-to-many class="User"/>
</set>
“多”方(例如:用戶)隸屬于一個(gè)“一”方對(duì)象,一般的格式如下:
<many-to-one name="java映射類中對(duì)應(yīng)的屬性" column="表中對(duì)應(yīng)字段" class="類名" not-null="true" />
Eg.
<many-to-one name="org" column="orgId" class="Organization" not-null="true" />
4. 一對(duì)一關(guān)系(<one-to-one…/>)
一對(duì)一關(guān)系相對(duì)一對(duì)多關(guān)系來(lái)說(shuō)比較少見(jiàn),但也在某些情況下要用到,例如有一個(gè)用戶的基本信息表(USER)和一個(gè)用戶的密碼表(PASSWD)就存在一對(duì)一的關(guān)系。下面來(lái)看一下一對(duì)一關(guān)系在Hibernate的配置。
其中主表(eg. 用戶的基本信息表)的配置如下:
<one-to-one name="主表對(duì)象中子表對(duì)象的屬性名" class="子表對(duì)象的類名" cascade="save-update"/>
Eg. <one-to-one name="password" class="com.amigo.dao.pojo.Passwd" cascade="save-update"/>
子表(eg. 用戶的密碼表)的配置如下:
<one-to-one name="子表對(duì)象中主表對(duì)象的屬性名" class="主表對(duì)象的類名" constrained="true" />
Eg. <one-to-one name="user" class="com.amigo.dao.pojo.User " constrained="true" />
5. 多對(duì)多關(guān)系(<many-to-many…/>)
在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),一般將多對(duì)多關(guān)系轉(zhuǎn)換為兩個(gè)一對(duì)多(或多對(duì)一)關(guān)系,例如在基于角色的權(quán)限系統(tǒng)中,用戶和角色存在的關(guān)系就是典型的多對(duì)多關(guān)系,即一個(gè)用戶可以具有多個(gè)角色,而一個(gè)角色又可以為多個(gè)用戶所有,一般在設(shè)計(jì)時(shí),都會(huì)加一個(gè)用戶與角色的關(guān)聯(lián)表,該表與用戶表以及角色表都存在外鍵關(guān)聯(lián)。
在本小節(jié)中講述的是沒(méi)有分解的多對(duì)多關(guān)系在Hibernate中如何配置。設(shè)置格式如下:
<set name="java對(duì)象的屬性名" table="表名" cascade="all" outer-join="false">
<key column="表的對(duì)應(yīng)字段"/>
<many-to-many class="另一個(gè)表的對(duì)象類" column="另一個(gè)表的字段"/>
</set>
Eg. 上述的多對(duì)多關(guān)系可以表示為:
t_user方:
<set name="roleSet" table="t_user" cascade="all" outer-join="false">
<key column="roleId"/>
<many-to-many class="com.amigo.dao.pojo.Role" column="roleId"/>
</set>
t_role方:
<set name="userSet" table="t_role" cascade="all" outer-join="false">
<key column="roleId"/>
<many-to-many class="com.amigo.dao.pojo.User" column="roleId"/>
</set>
6. 完整實(shí)例
在本小節(jié)中舉一些.hbm.xml映射文件的例子,讓開(kāi)發(fā)人員對(duì)其有一個(gè)感性的認(rèn)識(shí)。接下來(lái)講述一個(gè)用戶表(tbl_user)、用戶與角色關(guān)聯(lián)表(tbl_user_role)、角色表(tbl_role)以及組織表(tbl_organization)的例子。
(1)tbl_user
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.amigo.dao.pojo">
<class name="User" table="tbl_user">
<id name="loginname" column="loginName" type="java.lang.String">
<generator class="assigned"/>
</id>
<property name="name" column="name" type="java.lang.String" not-null="true" />
<property name="password" column="password" type="java.lang.String" not-null="true" />
<property name="mobile" column="mobile" type="java.lang.String" />
<property name="telephone" column="telephone" type="java.lang.String" />
<property name="email" column="email" type="java.lang.String" />
<property name="createtime" column="createTime" type="java.util.Date" not-null="true" />
<property name="lastlogintime" column="lastLoginTime" type="java.util.Date" />
<property name="logintimes" column="loginTimes" type="java.lang.Long" not-null="true" />
<property name="state" column="state" type="java.lang.Byte" not-null="true" />
<property name="description" column="description" type="java.lang.String" />
<many-to-one name="organization" column="orgId" class="Organization" not-null="true" />
<set name="userRoleSet" inverse="true" cascade="all-delete-orphan" lazy="true">
<key column="loginName"/>
<one-to-many class="UserRole"/>
</set>
</hibernate-mapping>
(2)tbl_organization
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.amigo.dao.pojo">
<class name="Organization" table="tbl_organization">
<id name="orgid" column="orgId" type="java.lang.Long">
<generator class="native"/>
</id>
<property name="parentorgid" column="parentOrgId" type="java.lang.Long" not-null="true" />
<property name="orgname" column="orgName" type="java.lang.String" not-null="true" />
<property name="orgfullname" column="orgFullName" type="java.lang.String" />
<property name="orglevel" column="orgLevel" type="java.lang.Integer" not-null="true" />
<property name="state" column="state" type="java.lang.Byte" not-null="true" />
<property name="description" column="description" type="java.lang.String" />
<property name="creator" column="creator" type="java.lang.String" />
<property name="createtime" column="createTime" type="java.util.Date" />
<set name="userSet" inverse="true" lazy="true">
<key column="orgId"/>
<one-to-many class="User"/>
</set>
</class>
</hibernate-mapping>
(3)tbl_user_role
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.cotel.netvote.dao.model">
<class name="UserRole" table="tbl_user_role">
<id name="urid" column="urId" type="java.lang.Integer">
<generator class="native"/>
</id>
<many-to-one name="role" column="roleId" class="Role" not-null="true" />
<many-to-one name="user" column="loginName" class="User" not-null="true" />
</class>
</hibernate-mapping>
(4)tbl_ role
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.cotel.netvote.dao.model">
<class name="Role" table="tbl_role">
<id name="roleid" column="roleId" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="rolename" column="roleName" type="java.lang.String" not-null="true" />
<property name="createdate" column="createDate" type="java.util.Date" not-null="true" />
<property name="description" column="description" type="java.lang.String" />
<set name="userRoleSet" inverse="true" lazy="true" cascade="all">
<key column="roleId"/>
<one-to-many class="UserRole"/>
</set>
</class>
</hibernate-mapping>
http://www.aygfsteel.com/amigoxie/archive/2007/12/31/171831.html