﻿<?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-从制造到创造-随笔分类-精通Hibernate</title><link>http://www.blogjava.net/coderdream/category/24889.html</link><description>软件工程师成长之路</description><language>zh-cn</language><lastBuildDate>Sat, 06 Oct 2007 05:33:54 GMT</lastBuildDate><pubDate>Sat, 06 Oct 2007 05:33:54 GMT</pubDate><ttl>60</ttl><item><title>[读书笔记]第5章 映射对象标识符</title><link>http://www.blogjava.net/coderdream/archive/2007/08/13/136321.html</link><dc:creator>CoderDream</dc:creator><author>CoderDream</author><pubDate>Mon, 13 Aug 2007 14:38:00 GMT</pubDate><guid>http://www.blogjava.net/coderdream/archive/2007/08/13/136321.html</guid><wfw:comment>http://www.blogjava.net/coderdream/comments/136321.html</wfw:comment><comments>http://www.blogjava.net/coderdream/archive/2007/08/13/136321.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/coderdream/comments/commentRss/136321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/coderdream/services/trackbacks/136321.html</trackback:ping><description><![CDATA[<h3><span style="font-size: 18pt">5.1 关系数据库按主键区分不同的记录</span></h3>
主键的特点：<br />
&nbsp;&nbsp;&nbsp;1、不允许为null；<br />
&nbsp;&nbsp;&nbsp;2、每条记录具有唯一的主键值，不允许主键值重复；<br />
&nbsp;&nbsp;&nbsp;3、每条记录的主键值永远不会改变。<br />
<br />
设置主键的方式：<br />
<h2>5.1.1 把主键定义为自动增长标识符类型</h2>
&nbsp;&nbsp;&nbsp;在MySQL中，如果把表的主键设为 auto_increment 类型，数据库就会自动为主键赋值。<br />
&nbsp;&nbsp;&nbsp;例如：<br />
&nbsp;&nbsp;&nbsp;<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><span style="color: #0000ff">CREATE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;CUSTOMERS(<br />
ID&nbsp;</span><span style="font-weight: bold; color: #000000">int</span><span style="color: #000000">&nbsp;<span style="font-size: 12pt; color: red"><strong>auto_increment</strong></span>&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
NAME&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">15</span><span style="color: #000000">));<br />
<br />
</span><span style="color: #0000ff">INSERT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;CUSTOMERS(NAME)&nbsp;</span><span style="color: #0000ff">VALUES</span><span style="color: #000000">("name1");<br />
</span><span style="color: #0000ff">INSERT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;CUSTOMERS(NAME)&nbsp;</span><span style="color: #0000ff">VALUES</span><span style="color: #000000">("name2");<br />
<br />
</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;ID&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;CUSTOMERS;<br />
</span></div>
<br />
查询结果：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">ID<br />
</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000"><br />
</span><span style="font-weight: bold; color: #800000">2</span></div>
<br />
在MS SQL Server中，如果把表的主键设为 identity 类型，数据库就会自动为主键赋值：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><span style="color: #0000ff">CREATE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;CUSTOMERS(<br />
ID&nbsp;</span><span style="font-weight: bold; color: #000000">int</span><span style="color: #000000">&nbsp;<span style="font-size: 12pt; color: red"><strong>identity(1,1)</strong></span>&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
NAME&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">15</span><span style="color: #000000">));<br />
<br />
</span><span style="color: #0000ff">INSERT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;CUSTOMERS(NAME)&nbsp;</span><span style="color: #0000ff">VALUES</span><span style="color: #000000">("name1");<br />
</span><span style="color: #0000ff">INSERT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;CUSTOMERS(NAME)&nbsp;</span><span style="color: #0000ff">VALUES</span><span style="color: #000000">("name2");<br />
<br />
</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;ID&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;CUSTOMERS;<br />
</span></div>
<br />
查询结果：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">ID<br />
</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000"><br />
</span><span style="font-weight: bold; color: #800000">2</span></div>
<br />
<h2>5.1.2 从序列（Sequence）中获取自动增长的 标识符</h2>
<br />
在Oracle中，可以为每张表的主键创建一个单独的序列，然后从这个序列中获得自动增加的标识符，把它赋值给主键。<br />
<br />
例如以下语句创建了一个名为 CUSTOMERS_ID_SEQ的序列，这个序列的起始值为1，增量为2：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">CREATE</span><span style="color: #000000">&nbsp;SEQUENCE&nbsp;CUSTOMERS_ID_SEQ&nbsp;INCREMENT&nbsp;</span><span style="color: #0000ff">BY</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;START&nbsp;</span><span style="color: #0000ff">WITH</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">;</span></div>
<br />
一旦定义了 CUSTOMERS_ID_SEQ 序列，就可以访问序列的 curval 和 nextval 属性。<br />
<br />
curval：返回序列的当前值。<br />
nextval：先增加序列的值，然后返回序列值。<br />
<br />
以下SQL语句先创建了CUSTOMERS表，然后插入两条记录，在插入时设定了ID和NAME字段的值，其中ID字段的值来自于CUSTOMERS_ID_SEQ序列。最后查询CUSTOMERS表中的ID字段。<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><span style="color: #0000ff">CREATE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;CUSTOMERS(<br />
ID&nbsp;</span><span style="font-weight: bold; color: #000000">int</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">primary</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">key</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,<br />
NAME&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">15</span><span style="color: #000000">));<br />
<br />
</span><span style="color: #0000ff">INSERT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;CUSTOMERS </span><span style="color: #0000ff">VALUES</span><span style="color: #000000">(CUSTOMERS_ID_SEQ.curval, 'Tom');<br />
</span><span style="color: #0000ff">INSERT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;CUSTOMERS </span><span style="color: #0000ff">VALUES</span><span style="color: #000000">(CUSTOMERS_ID_SEQ.nextval, 'Mike');<br />
<br />
</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;ID&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;CUSTOMERS;<br />
</span></div>
<br />
如果在Oracle中执行以上SQL语句，查询结果：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">ID<br />
</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000"><br />
3</span></div>
<br />
<h3><span style="font-size: 18pt">5.2 Java语言按内存地址区分不同的对象</span> </h3>
在Java语言中，判断两个对象引用变量是否相等，有以下两种比较方式： <br />
（1）比较两个变量所引用的对象的内存地址是否相同，&#8220;==&#8221;运算符就是比较的内存地址。此外，在Object类中定义的equals(Object o)方法，也是按内存地址来比较的。如果用户自定义的类没有覆盖Object类的equals(Object o)方法，也按内存地址比较。<br />
<br />
例如，以下代码用new语句共创建了两个Customer对象，并定义了三个Customer类型的引用变量c1、c2和c3：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Verdana; background-color: #eeeeee"><span style="color: #000000">Customer&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Customer(</span><span style="color: #000000">"</span><span style="color: #000000">Tom</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">line1</span><span style="color: #008000"><br />
</span><span style="color: #000000">Customer&nbsp;c2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Customer(</span><span style="color: #000000">"</span><span style="color: #000000">Tom</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">line2</span><span style="color: #008000"><br />
</span><span style="color: #000000">Customer&nbsp;c3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c1;</span><span style="color: #008000">//</span><span style="color: #008000">line3</span><span style="color: #008000"><br />
</span><span style="color: #000000">c3.setName(</span><span style="color: #000000">"</span><span style="color: #000000">Mike</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">line4</span></div>
<p><br />
&nbsp;&nbsp;&nbsp;图5-1和图5-2显示了程序执行到第3行及第4行的对象图。<br />
<img height="366" alt="" src="http://www.blogjava.net/images/blogjava_net/coderdream/SwqHib/chap05/5-1.JPG" width="700" border="0" /><br />
<br />
&nbsp;&nbsp;&nbsp;从图5-1和图5-2看出，c1和c3变量引用同一个Customer对象而c2变量引用了而c2变量引用另一个Customer对象。因此，表达式"c1==c3"以及c1.equals(c3)的值都是true，而表达式"c1==c2"以及c1.equals(c2)的值是false。<br />
<br />
（2）比较两个变量所引用的对象的值是否相同，Java API中的一些类覆盖了Object类的equals(Object o)方法，实现按对象值比较。<br />
String类和Date类<br />
Java包装类，包括：Byte、Integer、Short、Character、Long、Float、Doubl和Boolean。<br />
例如：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Verdana; background-color: #eeeeee"><span style="color: #000000">String&nbsp;s1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
String&nbsp;s2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">hello</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<p><br />
尽管s1和s2引用不同的String对象，但是它们的字符串值都是&#8220;hello&#8221;，因此表达式&#8220;s1==s2的值是false，而表达式s1.equals(s2)的值是true。</p>
<p>用户自定义的类也可以覆盖Object类的equals(Object o)方法，从而实现按对象值比较。例如，在Customer类中添加如下equals(Object o)方法，使它按客户的姓名来比较两个Customer对象是否相等：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Verdana; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;equals(Object&nbsp;o)&nbsp;{<br />
&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #0000ff">this</span><span style="color: #000000">==</span><span style="color: #000000">o){<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;}<br />
<br />
&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">o&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;Customer)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;}<br />
<br />
&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Customer&nbsp;other&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Customer)o;<br />
<br />
&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #0000ff">this</span><span style="color: #000000">.getName().equals(other.getName())){<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;}<br />
}</span></div>
<p><br />
以下代码用new语句共创建了两个Customer对象，并定义了两个Customer类型的引用变量c1和c2：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Verdana; background-color: #eeeeee"><span style="color: #000000">Customer&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Customer(</span><span style="color: #000000">"</span><span style="color: #000000">Tom</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
Customer&nbsp;c2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Customer(</span><span style="color: #000000">"</span><span style="color: #000000">Tom</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<p><br />
尽管c1和c2引用不同的Customer对象，但是它们的name值都是&#8220;Tom&#8221;，因此表达式&#8220;c1==c2的值是false，而表达式c1.equals(c2)的值是true。<br />
&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.blogjava.net/coderdream/aggbug/136321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/coderdream/" target="_blank">CoderDream</a> 2007-08-13 22:38 <a href="http://www.blogjava.net/coderdream/archive/2007/08/13/136321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>