﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-sunnyiric</title><link>http://www.blogjava.net/sunnyiric/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 09:57:18 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 09:57:18 GMT</pubDate><ttl>60</ttl><item><title>TOMCAT 中的访问控制策略</title><link>http://www.blogjava.net/sunnyiric/archive/2008/12/26/248503.html</link><dc:creator>sunnyiric</dc:creator><author>sunnyiric</author><pubDate>Fri, 26 Dec 2008 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyiric/archive/2008/12/26/248503.html</guid><wfw:comment>http://www.blogjava.net/sunnyiric/comments/248503.html</wfw:comment><comments>http://www.blogjava.net/sunnyiric/archive/2008/12/26/248503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyiric/comments/commentRss/248503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyiric/services/trackbacks/248503.html</trackback:ping><description><![CDATA[<h4 class="beTitle" id="subjcns!5D7194EC51724F00!142">TOMCAT 中的访问控制策略</h4>
<div class="bvMsg" id="msgcns!5D7194EC51724F00!142">
<p>TOMCAT的安全控制策略是根据Servlet 2.4规范来实现的。
<p>1.在$CATALINA/conf/server.xml文件中配置:
<p>&lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"&nbsp; debug="0" resourceName="UserDatabase"/&gt;
<p>这里UserDatabase是一个jndi的名称，也需要在server.xml中配置，对应于$CATALINA/conf/tomcat-users.xml文件
<p>2.tomcat-users.xml文件里面定义了用户和角色
<p>&lt;?xml version='1.0' encoding='utf-8'?&gt;<br />
&lt;tomcat-users&gt;<br />
&nbsp; &lt;role rolename="tomcat"/&gt;<br />
&nbsp; &lt;role rolename="role1"/&gt;<br />
&nbsp; &lt;role rolename="manager"/&gt;<br />
&nbsp; &lt;role rolename="admin"/&gt;<br />
&nbsp; &lt;user username="tomcat" password="tomcat" roles="tomcat"/&gt;<br />
&nbsp; &lt;user username="both" password="tomcat" roles="tomcat,role1"/&gt;<br />
&nbsp; &lt;user username="manager" password="tomcat" roles="manager"/&gt;<br />
&nbsp; &lt;user username="admin" password="tomcat" roles="admin"/&gt;<br />
&lt;/tomcat-users&gt;
<p>3.在相应的应用的web.xml文件中加入&lt;security-constraint&gt;&lt;login-config&gt; &lt;security-role&gt;标签，如下所示：<br />
&nbsp; &lt;!-- Security is active on entire directory --&gt;<br />
&nbsp; &lt;security-constraint&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;display-name&gt;Tomcat Server Configuration Security Constraint&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;web-resource-collection&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;web-resource-name&gt;Protected Area&lt;/web-resource-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Define the context-relative URL(s) to be protected --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/web-resource-collection&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;auth-constraint&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Anyone with one of the listed roles may access this area --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role-name&gt;admin&lt;/role-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/auth-constraint&gt;<br />
&nbsp; &lt;/security-constraint&gt;
<p>&nbsp; &lt;!-- Login configuration uses form-based authentication --&gt;<br />
&nbsp; &lt;login-config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;auth-method&gt;FORM&lt;/auth-method&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;realm-name&gt;Tomcat Server Configuration Form-Based Authentication Area&lt;/realm-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form-login-config&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-login-page&gt;/login.jsp&lt;/form-login-page&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-error-page&gt;/error.jsp&lt;/form-error-page&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-login-config&gt;<br />
&nbsp; &lt;/login-config&gt;
<p>&nbsp; &lt;!-- Security roles referenced by this web application --&gt;<br />
&nbsp; &lt;security-role&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The role that is required to log in to the Administration Application<br />
&nbsp;&nbsp;&nbsp; &lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;role-name&gt;admin&lt;/role-name&gt;<br />
&nbsp; &lt;/security-role&gt;
<p>4.在 &lt;login-config&gt;标签的&lt;auth-method&gt;FORM&lt;/auth-method&gt;属性中，可以看到这里的authentication method 设置为FORM，这是一种基于表单的用户认证方式。基于form的用户认证需要在&lt;form-login-page&gt;/login.jsp&lt;/form-login-page&gt;定义的登陆页面中提供一个包括用户名和密码的html表单，这个表单相对应于用户名和密码的元素必须是j_username和j_password,并且表单的ACTION必须为j_security_check。譬如：<font face="宋体" size="3">&nbsp;<br />
<font face="Times New Roman, Times, Serif" size="2">&lt;form&nbsp;method="POST"&nbsp;action="j_security_chack"&gt;&nbsp;<br />
&lt;input&nbsp;type="text"&nbsp;name="j_username"&gt;&nbsp;<br />
&lt;input&nbsp;type="password"&nbsp;name="j_password"&gt;&nbsp;<br />
&lt;/form&gt;&nbsp;</font></font><br />
在验证通过之后，login页面会自动转向该应用的默认页面(index.html,index.jsp等等)。
<p>除了FORM验证方式之外，还有BASIC和CLIENT-CERT这两种用户认证方式，前者是基本的用户认证方式，要求浏览器弹出一个对话框，录入用户名和密码。后者是使用客户数字证书来认证请求。<br />
<p>5.以上四步完成之后便可以通过在tomcat-users.xml文件中添加用户和角色来实现访问控制了。还是比较方面的。</p>
</div>
<img src ="http://www.blogjava.net/sunnyiric/aggbug/248503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyiric/" target="_blank">sunnyiric</a> 2008-12-26 17:17 <a href="http://www.blogjava.net/sunnyiric/archive/2008/12/26/248503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 主键生成策略</title><link>http://www.blogjava.net/sunnyiric/archive/2008/12/22/247783.html</link><dc:creator>sunnyiric</dc:creator><author>sunnyiric</author><pubDate>Mon, 22 Dec 2008 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyiric/archive/2008/12/22/247783.html</guid><wfw:comment>http://www.blogjava.net/sunnyiric/comments/247783.html</wfw:comment><comments>http://www.blogjava.net/sunnyiric/archive/2008/12/22/247783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyiric/comments/commentRss/247783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyiric/services/trackbacks/247783.html</trackback:ping><description><![CDATA[<pre>Hibernate的主键生成策略有好几种：<br />
1) assigned<br />
2) hilo<br />
3) seqhilo<br />
4) increment<br />
5) identity<br />
6) sequence<br />
7) native<br />
8) uuid.hex<br />
9) uuid.string<br />
10) foreign<br />
一般而言，利用uuid.hex方式生成主键将提供最好的性能和数据库平台适<br />
应性。另外由于常用的数据库，如Oracle、DB2、SQLServer、MySql 等，都提<br />
供了易用的主键生成机制（Auto-Increase 字段或者Sequence）。我们可以在数<br />
据库提供的主键生成机制上，采用generator-class=native的主键生成方式。<br />
不过值得注意的是，一些数据库提供的主键生成机制在效率上未必最佳，<br />
大量并发insert数据时可能会引起表之间的互锁。<br />
数据库提供的主键生成机制，往往是通过在一个内部表中保存当前主键状<br />
态（如对于自增型主键而言，此内部表中就维护着当前的最大值和递增量），<br />
之后每次插入数据会读取这个最大值，然后加上递增量作为新记录的主键，之<br />
后再把这个新的最大值更新回内部表中，这样，一次Insert操作可能导致数据<br />
库内部多次表读写操作，同时伴随的还有数据的加锁解锁操作，这对性能产生<br />
了较大影响。<br />
因此，对于并发Insert要求较高的系统，推荐采用uuid.hex 作为主键生成<br />
机制。<br />
另外我们可以扩展Hibernate的类来做自己的主键生成策略：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.gsta.eshore.framework.util.uid;&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.Serializable;&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.hibernate.engine.SessionImplementor;&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.hibernate.id.AbstractUUIDGenerator;&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.hibernate.id.Configurable;&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.hibernate.id.IdentifierGenerator;&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.util.Properties;&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.hibernate.Hibernate;&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.hibernate.dialect.Dialect;&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.hibernate.type.Type;&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.hibernate.util.PropertiesHelper;&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="comment">/**</span>&nbsp;</span>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;&lt;b&gt;uuid&lt;/b&gt;&lt;br&gt;</span>&nbsp;</span>
    <li class=""><span><span class="comment">*&nbsp;@author&nbsp;hwq</span>&nbsp;</span>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;UIDGenerator&nbsp;</span><span class="keyword">extends</span><span>&nbsp;AbstractUUIDGenerator&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Configurable&nbsp;{&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;lastTime&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">short</span><span>&nbsp;lastCount&nbsp;=&nbsp;-</span><span class="number">32768</span><span>;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Object&nbsp;mutex&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object();&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;ONE_SECOND&nbsp;=&nbsp;1000L;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;String&nbsp;sep&nbsp;=&nbsp;</span><span class="string">""</span><span>;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Serializable&nbsp;generate(SessionImplementor&nbsp;session,&nbsp;Object&nbsp;obj)&nbsp;{&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">long</span><span>&nbsp;l&nbsp;=&nbsp;0L;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">short</span><span>&nbsp;word0&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">synchronized</span><span>(mutex)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(lastCount&nbsp;==&nbsp;</span><span class="number">32767</span><span>)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">boolean</span><span>&nbsp;flag&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;!flag;)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(l&nbsp;&lt;&nbsp;lastTime&nbsp;+&nbsp;ONE_SECOND)&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.currentThread();&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(ONE_SECOND);&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">catch</span><span>(InterruptedException&nbsp;interruptedexception)&nbsp;{&nbsp;}&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastTime&nbsp;=&nbsp;l;&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastCount&nbsp;=&nbsp;-<span class="number">32768</span><span>;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;=&nbsp;<span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;=&nbsp;lastTime;&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;word0&nbsp;=&nbsp;lastCount++;&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;getHostUniqueNum();&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;Integer.toString(i,&nbsp;<span class="number">16</span><span>)&nbsp;+&nbsp;sep&nbsp;+&nbsp;Long.toString(l,&nbsp;</span><span class="number">16</span><span>)&nbsp;+&nbsp;sep&nbsp;+&nbsp;Integer.toString(word0,&nbsp;</span><span class="number">16</span><span>);&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(s.length()&nbsp;&gt;&nbsp;</span><span class="number">24</span><span>)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;s.substring(s.length()&nbsp;-&nbsp;<span class="number">24</span><span>);&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;s;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Serializable&nbsp;generate_old(SessionImplementor&nbsp;session,&nbsp;Object&nbsp;obj)&nbsp;{&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;=&nbsp;obj.getClass().getName();&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer(</span><span class="number">64</span><span>)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(name.substring(name.lastIndexOf(<span class="string">'.'</span><span>)+</span><span class="number">1</span><span>)).append(sep)&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append((<span class="keyword">short</span><span>)getIP()).append(sep)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(Math.abs((<span class="keyword">short</span><span>)getJVM())).append(sep)&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(getCount())&nbsp;&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.toString();&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getHostUniqueNum()&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;(</span><span class="keyword">new</span><span>&nbsp;Object()).hashCode();&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;configure(Type&nbsp;type,&nbsp;Properties&nbsp;params,&nbsp;Dialect&nbsp;d)&nbsp;{&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sep&nbsp;=&nbsp;PropertiesHelper.getString(<span class="string">"separator"</span><span>,&nbsp;params,&nbsp;</span><span class="string">""</span><span>);&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(&nbsp;String[]&nbsp;args&nbsp;)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;props&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Properties();&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.setProperty(<span class="string">"separator"</span><span>,&nbsp;</span><span class="string">""</span><span>);&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IdentifierGenerator&nbsp;gen&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;UIDGenerator();&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;(Configurable)&nbsp;gen&nbsp;).configure(Hibernate.STRING,&nbsp;props,&nbsp;<span class="keyword">null</span><span>);&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IdentifierGenerator&nbsp;gen2&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;UIDGenerator();&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;(Configurable)&nbsp;gen2&nbsp;).configure(Hibernate.STRING,&nbsp;props,&nbsp;<span class="keyword">null</span><span>);&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(&nbsp;</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;&nbsp;i&lt;</span><span class="number">10</span><span>;&nbsp;i++)&nbsp;{&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;id&nbsp;=&nbsp;(String)&nbsp;gen.generate(<span class="keyword">null</span><span>,&nbsp;gen);&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(id);&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;id2&nbsp;=&nbsp;(String)&nbsp;gen2.generate(<span class="keyword">null</span><span>,&nbsp;gen2);&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(id2);&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
这个类必须要扩展AbstractUUIDGenerator并实现Configurable接口，在generate方法中生成我们想要的主键。<br />
在hibernate的配置文件中要做以下的配置:<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</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>=</span><span class="attribute-value">"id"</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"java.lang.String"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">column</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"id"</span><span>&nbsp;</span><span class="attribute">length</span><span>=</span><span class="attribute-value">"24"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">generator</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.gsta.eshore.framework.util.uid.UIDGenerator"</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"separator"</span><span class="tag">&gt;</span><span>-</span><span class="tag">&lt;/</span><span class="tag-name">param</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">generator</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">id</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
Generator的类要引用UIDGenerator，并且可以带参数生成主键，示例是根据时间，Ip等生成一个24位的字符串。这样做的灵活性大大提高了，提供了最好的性能和数据库平台适应性。<br />
但是有时候我们在保存一条记录的时候是不能指定主键的，因为它的主键要来源于其他的表的主键，（hibernate推荐用代理主键，但是有时候设计的时候没有用到）。这个时候的主键生成策略就要是assigned了。为了保持主键的连贯性，我总不能又用另外一种主键生成策略吧。<br />
仿照上面的类，我们做一个生成24为随机字符串的类。<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.gsta.eshore.framework.util.uid;&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;UID&nbsp;&nbsp;</span></span>
    <li class="alt"><span>{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;lastTime&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">short</span><span>&nbsp;lastCount&nbsp;=&nbsp;-</span><span class="number">32768</span><span>;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Object&nbsp;mutex&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object();&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;ONE_SECOND&nbsp;=&nbsp;1000L;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;UID()&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;getUID()&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">long</span><span>&nbsp;l&nbsp;=&nbsp;0L;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">short</span><span>&nbsp;word0&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">synchronized</span><span>(mutex)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(lastCount&nbsp;==&nbsp;</span><span class="number">32767</span><span>)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">boolean</span><span>&nbsp;flag&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;!flag;)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(l&nbsp;&lt;&nbsp;lastTime&nbsp;+&nbsp;ONE_SECOND)&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.currentThread();&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(ONE_SECOND);&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">catch</span><span>(InterruptedException&nbsp;interruptedexception)&nbsp;{&nbsp;}&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastTime&nbsp;=&nbsp;l;&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastCount&nbsp;=&nbsp;-<span class="number">32768</span><span>;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;=&nbsp;<span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;=&nbsp;lastTime;&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;word0&nbsp;=&nbsp;lastCount++;&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;getHostUniqueNum();&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;Integer.toString(i,&nbsp;<span class="number">16</span><span>)&nbsp;+&nbsp;</span><span class="string">"`"</span><span>&nbsp;+&nbsp;Long.toString(l,&nbsp;</span><span class="number">16</span><span>)&nbsp;+&nbsp;</span><span class="string">"`"</span><span>&nbsp;+&nbsp;Integer.toString(word0,&nbsp;</span><span class="number">16</span><span>);&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(s.length()&nbsp;&gt;&nbsp;</span><span class="number">24</span><span>)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;s.substring(s.length()&nbsp;-&nbsp;<span class="number">24</span><span>);&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;s;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getHostUniqueNum()&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;(</span><span class="keyword">new</span><span>&nbsp;Object()).hashCode();&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;</span><span class="number">100</span><span>;&nbsp;i++)&nbsp;{&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;uid=getUID();&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(uid);&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
在save一个实体的时候调用entity.setId(UID.getUID())。<br />
呵呵，以后用hibernate就不用烦用什么主键生成策略了，自己做一个。<br />
<id name="id" type="java.lang.String"><column name="id" length="24"><id name="id" type="java.lang.String"><column name="id" length="24"></column></id></column></id></pre>
<img src ="http://www.blogjava.net/sunnyiric/aggbug/247783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyiric/" target="_blank">sunnyiric</a> 2008-12-22 16:29 <a href="http://www.blogjava.net/sunnyiric/archive/2008/12/22/247783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>