<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>aone</title>
    <description>EASY COME,EASY GO.</description>
    <link>http://aone.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>svn,apache,mysql实现版本控制和身份验证</title>
        <author>aone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://aone.javaeye.com">aone</a>&nbsp;
                    链接：<a href="http://aone.javaeye.com/blog/97352" style="color:red;">http://aone.javaeye.com/blog/97352</a>&nbsp;
          发表时间: 2007年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一.相关下载<br />&nbsp; <a href="http://subversion.tigris.org/files/documents/15/34093/svn-1.4.0-setup.exe" target="_blank">svn-1.4.0</a><br />&nbsp; <a href="http://archive.apache.org/dist/httpd/binaries/win32/apache_2.0.55-win32-x86-no_ssl.msi" target="_blank">apache_2.0.55-win32-x86-no_ssl</a><br />&nbsp; <a href="http://www.gknw.net/development/apache/httpd-2.0/win32/modules/mod_auth_mysql-2.0.49-w32.zip" target="_blank">mod_auth_mysql-2.0.49-w32.zip</a><br />	<br />&nbsp; <a href="http://subclipse.tigris.org/files/documents/906/35678/site-1.0.4.zip" target="_blank">site-1.0.4.zip(subclipse用于eclipse3.1.*)</a><br />&nbsp; <a href="http://subclipse.tigris.org/files/documents/906/38219/site-1.2.2.zip" target="_blank">site-1.2.2.zip(subclipse用于eclipse3.2.*)</a><br />&nbsp; <a href="http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi?download" target="_blank">TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi</a><br />	<br />二.安装配置<br />&nbsp; 首先安装apache,安装过程中会提示填写ServerName等,有的话就填,没有的话就写上IP,我填的是localhost.<br />&nbsp; 安装完apache,如果没有出错的话ApacheMonitor会出现在系统任务栏,并显示已运行状态.<br />&nbsp; <br />&nbsp; 安装svn-1.4.0,安装过程中svn会检测到系统中已经运行apache,apache会在期间自动重新启动,<br />&nbsp; ApacheMonitor的状态栏也会自动改为"Apache/2.0.55(Win32) SVN/1.4.0 DAV/2",说明svn安装成功.<br />&nbsp; <br />&nbsp; 如果apache和svn没有自动集成成功,也可以手动修改apache httpd.conf文件如下3步:<br />&nbsp;&nbsp;&nbsp; 1.找到以下两行:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #LoadModule dav_module modules/mod_dav.so<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #LoadModule dav_fs_module modules/mod_dav_fs.so<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改为:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LoadModule dav_module modules/mod_dav.so<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #LoadModule dav_fs_module modules/mod_dav_fs.so(网上很多说法是把这一行也去掉#注释,但好像并非必须去掉.)<br />&nbsp;&nbsp;&nbsp; 2.添加以下两行:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LoadModule dav_svn_module "C:/Program Files/Subversion/bin/mod_dav_svn.so"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LoadModule authz_svn_module "C:/Program Files/Subversion/bin/mod_authz_svn.so"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # "C:/Program Files/Subversion"是Subversion的安装目录<br />&nbsp;&nbsp;&nbsp; 3.在httpd.conf的最后添加如下内容:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Location /svn><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAV svn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SVNParentPath "E:/svndemo"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # SVNParentPath指向svn资源库的上一级目录<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # SVNPath "E:/svndemo/repository"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # SVNPath指向svn资源库目录<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 使用SVNParentPath或SVNPath根据相应需求<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 关于如何创建svn资源库目录在本文最后有补充<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Location><br />&nbsp;&nbsp;&nbsp; 现在已经可以通过http://localhost:8080/svn/repository/来访问资源库了.<br />三.使用apache身份验证<br />&nbsp; 使用apache身份验证就要使用apache的htpasswd.exe命令生成密码文件,示例如下:<br />&nbsp;&nbsp;&nbsp; 命令行下执行:htpasswd –c E:\svndemo\svn_auth_passwd plmm<br />&nbsp;&nbsp;&nbsp; 参数-c创建密码文件svn_auth_passwd并添加用户plmm,然后会提示输入密码.<br />&nbsp;&nbsp;&nbsp; 继续添加用户:htpasswd -m E:\svndemo\svn_auth_passwd klmm<br />&nbsp;&nbsp;&nbsp; 参数-m在已有的密码文件中添加新用户klmm,并用MD5加密密码.<br />&nbsp;&nbsp;&nbsp; 这样就创建了一个密码文件添加了两个用户.<br />&nbsp; 修改apache httpd.conf文件,添加如下内容:<br />&nbsp;&nbsp;&nbsp; &lt;Location /svn><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAV svn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SVNParentPath "E:/svndemo"<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthType Basic<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthName "Subversion repository"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Require valid-user<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthUserFile "E:/svndemo/svn_auth_passwd"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # AuthUserFile指向密码文件<br />&nbsp;&nbsp;&nbsp; &lt;/Location><br />&nbsp; 现在通过http://localhost:8080/svn/repository/访问资源库需要输入用户名密码.<br />四.结合mysql实现身份验证<br />&nbsp; 1.解压上面下载的mod_auth_mysql-2.0.49-w32.zip文件,拷贝mod_auth_mysql.so文件至apache下modules目录.<br />&nbsp; 2.修改apache httpd.conf文件,添加如下内容:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使apache加载mysql身份验证模块:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LoadModule mysql_auth_module modules/mod_auth_mysql.so<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置apache用来验证用户名密码的数据库表:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Location /svn><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAV svn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SVNParentPath "E:/svndemo"<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthType Basic<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthName "Subversion repository"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #AuthUserFile "E:/svndemo/svn_auth_passwd"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Require valid-user<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthMySQLHost localhost<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthMySQLUser root<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # AuthMySQLUser 数据库登陆用户名<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # AuthMySQLPassword 1234<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthMySQLDB svn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # AuthMySQLDB 数据库名<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthMySQLUserTable users<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # AuthMySQLUserTable 数据库表名<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthMySQLNameField user_name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # AuthMySQLNameField 用户名字段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthMySQLPasswordField user_passwd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # AuthMySQLPasswordField 密码字段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # AuthMySQLMD5Passwords On<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthMySQLCryptedPasswords Off<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Location><br />&nbsp; 3.重启apache,现在通过http://localhost:8080/svn/repository/访问资源库需要输入mysql表中的用户名密码.<br />五.相关命令<br />&nbsp; 安装apache服务:apache -k install<br />&nbsp; 卸载apache服务:apache -k uninstall<br />&nbsp; 启动apache服务:apache -k start或net start Apache2<br />&nbsp; 停止apache服务:apache -k stop 或net stop Apache2<br />&nbsp; <br />&nbsp; svn创建资源库:svnadmin create E:\svndemo\repository<br />&nbsp; 启动资源库服务:svnserve -d -r E:\svndemo\repository<br />&nbsp; <br />&nbsp; 拷贝my.ini到c:\winnt<br />&nbsp; 安装MySQL服务:mysqld-nt -install<br />&nbsp; 启动MySQL服务:net start mysql<br />&nbsp; 停止MySQL服务:net stop mysql<br />&nbsp; 卸载MySQL服务:mysqld-nt -remove
          <br/><br/>
          <span style="color:red;">
            <a href="http://aone.javaeye.com/blog/97352#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jul 2007 16:41:00 +0800</pubDate>
        <link>http://aone.javaeye.com/blog/97352</link>
        <guid>http://aone.javaeye.com/blog/97352</guid>
      </item>
          <item>
        <title>c语言中getc(),getch(),getche(),getchar()的区别</title>
        <author>aone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://aone.javaeye.com">aone</a>&nbsp;
                    链接：<a href="http://aone.javaeye.com/blog/60600" style="color:red;">http://aone.javaeye.com/blog/60600</a>&nbsp;
          发表时间: 2007年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font color="#ff0000">getc():</font><br />
调用方式:int getc(FILE *stream)<br />
它返回指定输入流stream的当前位置的下一个字符,并增加文件的位置指示器.</p>
<p><font color="#ff0000">getch():<br />
</font>调用方式:int getch(void)<br />
getch()从控制台读取一个字符,但不把该字符显示在屏幕上,也就是不回显.</p>
<p><font color="#ff0000">getche():</font><br />
调用方式:int getche(void)<br />
getchar()从控制台读取一个字符,把该字符显示在屏幕上,也就是回显.</p>
<p><font color="#ff0000">getchar():</font><br />
调有方式:int getchar(void)<br />
getchar()从控制台读取一个字符,并回显,它和getch(),getche()的不同在于,它等到输入一个回车才结束,就算你输入了一个字符串,它也只取其中的第一个字符.</p>
<p>上面的四个函数不是在stdio.h里,就是在conio.h里,我没有多试,和编译环境有关系.</p>
<p>后天(2007年3月19)我就要到一个新公司报到了,本来我应聘的是java,可老板让我这几天看一下C,我就只好把好久没有碰过的C语言书都翻出来,做了一段时间java,现在觉得学习C挺容易,就是有点麻烦.<br />
首先动手做一个小程序,复习一下...<br />
新的公司,新的开始,我会努力做的更好的.</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://aone.javaeye.com/blog/60600#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 17 Mar 2007 18:14:15 +0800</pubDate>
        <link>http://aone.javaeye.com/blog/60600</link>
        <guid>http://aone.javaeye.com/blog/60600</guid>
      </item>
          <item>
        <title>转:深入浅出SQL之左连接、右连接和全连接</title>
        <author>aone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://aone.javaeye.com">aone</a>&nbsp;
                    链接：<a href="http://aone.javaeye.com/blog/58178" style="color:red;">http://aone.javaeye.com/blog/58178</a>&nbsp;
          发表时间: 2007年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>为了从两个或多个表中选出数据，我们一般使用表连接来实现这个功能。 <br />
<br />
本节介绍join（连接）的概念. 为此我们准备了两个试验用表： album（专辑表） 和 track（曲目表）. <br />
<br />
专辑表：包含200首来自Amazon的音乐CD的概要信息。<br />
<br />
　　album(asin, title, artist, price, release, label, rank)<br />
<br />
　　曲目表：每张专辑中的曲目（因为是音乐CD，所以也可叫歌曲）的详细信息。<br />
<br />
　　track(album, dsk, posn, song) <br />
<br />
　　SQL短语 FROM album JOIN track ON album.asin=track.album 表示连接album和track表。<br />
<br />
　　其中，album.asin表示专辑的惟一标识号，track.album表示曲目表中和专辑关联的专辑号。<br />
<br />
　　连接后，得到一个临时表，该临时表中每条记录包含的字段由两部分组成，<br />
<br />
　　除了专辑表中的对应字段album(title, artist ...)，还包含曲目表的所有字段track(album, disk, posn and song)。<br />
<br />
　　有了这张临时表，很多查询就容易实现了。<br />
<br />
　　看看一些具体的实例，<br />
<br />
　　一、列出歌名为'Alison'的专辑名称和作者<br />
<br />
</p>
<table border="1" bordercolor="#cccccc" align="center" bgcolor="#e7e9e9" width="90%">
    <tbody>
        <tr>
            <td>SELECT title, artist<br />
            FROM album JOIN track<br />
            ON (album.asin=track.album)<br />
            WHERE song = 'Alison'</td>
        </tr>
    </tbody>
</table>
<br />
<br />
　　显然，歌名、专辑名称和作者分别在两个表中，必需使用表连接来完成这个查询。<br />
<br />
　　二、哪个artist录制了歌曲'Exodus'<br />
<br />
<table border="1" bordercolor="#cccccc" align="center" bgcolor="#e7e9e9" width="90%">
    <tbody>
        <tr>
            <td>SELECT artist<br />
            FROM album JOIN track ON (asin=album)<br />
            WHERE song = 'Exodus'</td>
        </tr>
    </tbody>
</table>
<br />
　　用作连接的两个字段asin，album因为在两个表中都是惟一的，所以不一定要加表名作为前缀。<br />
<br />
　　但为了方便理解，建议使用前缀，形如：album.asin=track.album<br />
<br />
　　三、列出曲目表中所有属于'Blur'专辑的歌曲 <br />
<br />
<table border="1" bordercolor="#cccccc" align="center" bgcolor="#e7e9e9" width="90%">
    <tbody>
        <tr>
            <td>SELECT song<br />
            FROM album JOIN track ON (asin=album)<br />
            WHERE title = 'Blur'</td>
        </tr>
    </tbody>
</table>
<p><br />
　　如果我们把　album JOIN track ON (asin=album)　看成一个临时表的话，join的概念就很好理解了。 </p>
<p>&nbsp;</p>
<p>內连接仅选出两张表中互相匹配的记录．因此，这会导致有时我们需要的记录没有包含进来。<br />
<br />
　　为更好的理解这个概念，我们介绍两个表作演示。苏格兰议会中的政党表(party)和议员表(msp)。 <br />
<br />
party(Code,Name,Leader)<br />
Code: 政党代码<br />
Name: 政党名称<br />
Leader: 政党领袖<br />
<br />
msp(Name,Party,Constituency)<br />
Name: 议员名<br />
Party: 议员所在政党代码<br />
Constituency: 选区<br />
<br />
　　在介绍左连接、右连接和全连接前，有一个数据库中重要的概念要介绍一下，即空值(NULL)。<br />
<br />
　　有时表中，更确切的说是某些字段值，可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。<br />
<br />
　　空值不等同于字符串中的空格，也不是数字类型的0。因此，判断某个字段值是否为空值时不能使用=,&lt;&gt;这些判断符。必需有专用的短语：IS NULL 来选出有空值字段的记录，同理，可用 IS NOT NULL 选出不包含空值的记录。<br />
<br />
　　例如：下面的语句选出了没有领导者的政党。（不要奇怪，苏格兰议会中确实存在这样的政党）<br />
<br />
SELECT code, name FROM party<br />
WHERE leader IS NULL<br />
<br />
　　又如：一个议员被开除出党，看看他是谁。(即该议员的政党为空值)<br />
<br />
SELECT name FROM msp <br />
WHERE party IS NULL<br />
<br />
　　好了，让我们言归正传，看看什么叫左连接、右连接和全连接。<br />
<br />
　　A left join（左连接）包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。<br />
<br />
　　同理，也存在着相同道理的 right join（右连接），即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。 <br />
而full join(全连接)顾名思义，左右表中所有记录都会选出来。<br />
<br />
　　讲到这里，有人可能要问，到底什么叫：包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。<br />
<br />
　　我们来看一个实例：<br />
<br />
SELECT msp.name, party.name<br />
FROM msp JOIN party ON party=code<br />
<br />
　　这个是我们上一节所学的Join(注意：也叫inner join)，这个语句的本意是列出所有议员的名字和他所属政党。<br />
<br />
　　很遗憾，我们发现该查询的结果少了两个议员：Canavan MSP, Dennis。为什么，因为这两个议员不属于任何政党，即他们的政党字段(Party)为空值。那么为什么不属于任何政党就查不出来了？这是因为空值在作怪。因为议员表中政党字段(Party)的空值在政党表中找不到对应的记录作匹配，即FROM msp JOIN party ON party=code　没有把该记录连接起来，而是过滤出去了。<br />
<br />
　　在该短语中，msp在Join的左边，所有称为左表。party在Join的右边，所有称为右表。<br />
<br />
　　现在再看看这句话，&ldquo;包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录&rdquo;，意思应该很明白了吧。执行下面这个语句，那两个没有政党的议员就漏不了了。<br />
<br />
SELECT msp.name, party.name<br />
FROM msp LEFT JOIN party ON party=code<br />
<br />
　　关于右连接,看看这个查询就明白了：<br />
<br />
SELECT msp.name, party.name<br />
FROM msp RIGHT JOIN party ON msp.party=party.code<br />
<br />
　　这个查询的结果列出所有的议员和政党，包含没有议员的政党，但不包含没有政党的议员。 那么既要包含没有议员的政党，又要包含没有政党的议员该怎么办呢，对了，全连接(full join)。<br />
<br />
SELECT msp.name, party.name<br />
FROM msp FULL JOIN party ON msp.party=party.code </p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://aone.javaeye.com/blog/58178#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 Mar 2007 12:00:42 +0800</pubDate>
        <link>http://aone.javaeye.com/blog/58178</link>
        <guid>http://aone.javaeye.com/blog/58178</guid>
      </item>
          <item>
        <title>hibernate id 映射配置</title>
        <author>aone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://aone.javaeye.com">aone</a>&nbsp;
                    链接：<a href="http://aone.javaeye.com/blog/47746" style="color:red;">http://aone.javaeye.com/blog/47746</a>&nbsp;
          发表时间: 2007年01月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;
<h1><span lang="EN-US">hibernate id </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射配置</span></h1>
<p class="MsoNormal"><span lang="EN-US"></span></p>
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<div class="code_title">xml 代码</div>
</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">id</span><span>&nbsp;</span><span class="attribute">name</span><span>=&rdquo;id&rdquo;&nbsp;</span><span class="attribute">column</span><span>=&rdquo;id&rdquo;&nbsp;</span><span class="attribute">type</span><span>=&rdquo;java.lang.Integer&rdquo;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">generator</span><span>&nbsp;</span><span class="attribute">class</span><span>=&rdquo;native&rdquo;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">id</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p class="MsoNormal">&nbsp; </p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面是一个简单的</span><span lang="EN-US">id</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射配置，</span><span lang="EN-US">id</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性对应映射类中的属性，</span><span lang="EN-US">column</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对应数据库中表字段。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重点是这个generator<generator></generator><generator class="native"></generator></span><span lang="EN-US"><generator class="”native”"></generator></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，其中</span><span lang="EN-US">class</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性可以有以下几种可选类型。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">Assigned</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主键由应用逻辑产生，即我们在代码里面指定</span><span lang="EN-US">id</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，数据交由</span><span lang="EN-US">Hibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保存时，主键已经设置完成，无需</span><span lang="EN-US">Hibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">干预。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><st1:place w:st="on"><st1:city w:st="on"><span lang="EN-US">hilo</span></st1:city></st1:place></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</span><span lang="EN-US">hi/lo</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法实现的主键生成机制，需要额外的数据库表保存主键生成历史状态。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">seqhilo</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</span><span lang="EN-US">hilo</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类似，通过</span><span lang="EN-US">hi/lo</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法实现的主键生成机制，只是主键历史状态保存在</span><span lang="EN-US">Sequence</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里，适合于支持</span><span lang="EN-US">sequence</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数据库，例如</span><span lang="EN-US">Oracle</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">increment</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量，以保存着当前的最大值，之后每次需要生成主键的时候将此值加</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成主键。这种方式产生的问题是：如果当前有多个实例访问数据库，那么由于各个实例各自维护主键状态，不同实例可能生成同样的主键，从而造成主键重复异常。因此如果同一数据库由多个实例访问，必须避免这种方式。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">identity</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用数据库提供的主键生成机制，如</span><span lang="EN-US">SQLServer</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">MYSQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的自增主键生成机制。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">sequence</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用数据库提供的</span><span lang="EN-US">sequence</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">机制生成主键，如</span><span lang="EN-US">Oracle sequence</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">native</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同</span><span lang="EN-US">hibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据数据库适配器中的定义，自动采用</span><span lang="EN-US">identity</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">hilo</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">sequence</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的一种作为主键生成机制。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">uuid.hex</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由</span><span lang="EN-US">hibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于</span><span lang="EN-US">128</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位惟一值产生算法，根据当前设备</span><span lang="EN-US">IP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，时间，</span><span lang="EN-US">JVM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启动时间，内部自增量等四个参数生成</span><span lang="EN-US">16</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进制数值</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编码后以</span><span lang="EN-US">32</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位的字符串表示</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为主键。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">uuid.string</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">uuid.hex</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类似，只是生成的主键未生成编码</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">长度</span><span lang="EN-US">16</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在某些数据库中可能出现问题，如</span><span lang="EN-US">PostgreSQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">foreign</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用外部表的字段作为主键。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">select</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span lang="EN-US">hibernate3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中引入新的主键生成机制，主要针对遗留系统的改造工程。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">(摘自《深入浅出Hibernate》)</span></p>
</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://aone.javaeye.com/blog/47746#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 16 Jan 2007 14:54:46 +0800</pubDate>
        <link>http://aone.javaeye.com/blog/47746</link>
        <guid>http://aone.javaeye.com/blog/47746</guid>
      </item>
          <item>
        <title>tomcat中给server.xml加入&lt;Context&gt;元素</title>
        <author>aone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://aone.javaeye.com">aone</a>&nbsp;
                    链接：<a href="http://aone.javaeye.com/blog/38495" style="color:red;">http://aone.javaeye.com/blog/38495</a>&nbsp;
          发表时间: 2006年12月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          (本文摘自《Tomcat与Java Web开发技术详解》)<br /><br />&lt;Context>代表了运行在&lt;Host>上的单个Web应用，一个&lt;Host>可以有多个&lt;Context>元素，每个Web应用必须有唯一的URL路径，这个URL路径在&lt;Context>中的属性path中设定。<br /><pre name="code" class="java">&lt;Context path="/helloApp" docBase="helloApp" debug="0" reloadable="true"/></pre><br />&lt;Context>元素的属性:<br /><strong>path:</strong>指定访问该Web应用的URL入口。<br /><strong>docBase:</strong>指定Web应用的文件路径，可以给定绝对路径，也可以给定相对于&lt;Host>的appBase属性的相对路径，如果Web应用采用开放目录结构，则指定Web应用的根目录，如果Web应用是个war文件，则指定war文件的路径。<br /><strong>reloadable:</strong>如果这个属性设为true，tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动，如果监测到有class文件被更新的，服务器会自动重新加载Web应用。<br /><br />在开发阶段将reloadable属性设为true，有助于调试servlet和其它的class文件，但这样用加重服务器运行负荷，建议在Web应用的发存阶段将reloadable设为false。
          <br/><br/>
          <span style="color:red;">
            <a href="http://aone.javaeye.com/blog/38495#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 11 Dec 2006 13:14:32 +0800</pubDate>
        <link>http://aone.javaeye.com/blog/38495</link>
        <guid>http://aone.javaeye.com/blog/38495</guid>
      </item>
      </channel>
</rss>