﻿<?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/Crying/category/25484.html</link><description>为了自己</description><language>zh-cn</language><lastBuildDate>Tue, 18 Sep 2007 00:42:01 GMT</lastBuildDate><pubDate>Tue, 18 Sep 2007 00:42:01 GMT</pubDate><ttl>60</ttl><item><title>持久层的3种状态</title><link>http://www.blogjava.net/Crying/articles/145964.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 17 Sep 2007 12:33:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/145964.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/145964.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/145964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/145964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/145964.html</trackback:ping><description><![CDATA[<table width="97%" border="0">
    <tbody>
        <tr>
            <td width="94%">
            <div align="center"><font size="4">持久化层的Java对象可处于哪些状态？这些状态有哪些特征？</font><br />
            <br />
            <font size="2">选自&lt;&lt;精通Hibernate：Java对象持久化技术详解&gt;&gt; 作者：<a href="http://nateyangtech.spaces.live.com/mmm2006-09-13_01.00/main.jsp?bc=weiqin/weiqin.jsp"><font color="#996666">孙卫琴</font></a> 来源:www.javathinker.org<br />
            </font></div>
            </td>
        </tr>
        <tr>
            <td width="94%">
            <p>当应用程序通过new语句创建了一个对象，这个对象的生命周期就开始了，当不再有任何引用变量引用它，这个对象就结束生命周期，它占用的内存就可以被JVM的垃圾回收器回收。对于需要被持久化的Java对象，在它的生命周期中，可处于以下三个状态之一：<br />
            <br />
            (1) 临时状态（transient）：刚刚用new语句创建，还没有被持久化，不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。<br />
            (2) 持久化状态（persistent）：已经被持久化，加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。<br />
            (3) 游离状态（detached）：已经被持久化，但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。<br />
            <img src="http://www.javathinker.org/image/hibernate_essay_5_1.gif"  alt="" /></p>
            <p>图1为Java对象的完整状态转换图，Session的特定方法触发Java对象由一个状态转换到另一个状态。从图1看出，当Java对象处于临时状态或游离状态，只要不被任何变量引用，就会结束生命周期，它占用的内存就可以被JVM的垃圾回收器回收；当处于持久化状态，由于Session的缓存会引用它，因此它始终处于生命周期中。<br />
            <br />
            <br />
            <strong>临时对象的特征</strong><br />
            <br />
            临时对象具有以下特征：<br />
            (1) 不处于Session的缓存中，也可以说，不被任何一个Session实例关联。<br />
            (2) 在数据库中没有对应的记录。 <br />
            <br />
            在以下情况下，Java对象进入临时状态：<br />
            (1) 当通过new语句刚创建了一个Java对象，它处于临时状态，此时不和数据库中的任何记录对应。<br />
            (2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象，delete()方法从数据库中删除与它对应的记录；对于持久化对象，delete()方法从数据库中删除与它对应的记录，并且把它从Session的缓存中删除。</p>
            <p><strong>持久化对象的特征<br />
            </strong><br />
            持久化对象具有以下特征：<br />
            (1) 位于一个Session实例的缓存中，也可以说，持久化对象总是被一个Session实例关联。<br />
            (2) 持久化对象和数据库中的相关记录对应。<br />
            (3) Session在清理缓存时，会根据持久化对象的属性变化，来同步更新数据库。<br />
            <br />
            Session的许多方法都能够触发Java对象进入持久化状态：<br />
            (1) Session的save()方法把临时对象转变为持久化对象。<br />
            (2) Session的load()或get()方法返回的对象总是处于持久化状态。<br />
            (3) Session的find()方法返回的List集合中存放的都是持久化对象。<br />
            (4) Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。(<font color="#ff0000">nate注</font>:根据hibernate reference的说法当试图用update更新一个持久化对象时会抛异常)<br />
            (5)当一个持久化对象关联一个临时对象，在允许级联保存的情况下，Session在清理缓存时会把这个临时对象也转变为持久化对象。 <br />
            <br />
            Hibernate保证在同一个Session实例的缓存中，数据库表中的每条记录只对应惟一的持久化对象。例如对于以下代码，共创建了两个Session实例：session1和session2。session1和session2拥有各自的缓存。在session1的缓存中，只会有惟一的OID为1的Customer持久化对象，在session2的缓存中，也只会有惟一的OID为1的Customer持久化对象。因此在内存中共有两个Customer持久化对象，一个属于session1的缓存，一个属于session2的缓存。引用变量a和b都引用session1缓存中的Customer持久化对象，而引用变量c引用session2缓存中的Customer持久化对象：<br />
            <br />
            Session session1=sessionFactory.openSession();<br />
            Session session2=sessionFactory.openSession();<br />
            Transaction tx1 = session1.beginTransaction();<br />
            Transaction tx2 = session2.beginTransaction();</p>
            <p>Customer a=(Customer)session1.load(Customer.class,new Long(1)); <br />
            Customer b=(Customer)session1.load(Customer.class,new Long(1)); <br />
            Customer c=(Customer)session2.load(Customer.class,new Long(1)); </p>
            <p>System.out.println(a= =b); //true<br />
            System.out.println(a= =c); //false</p>
            <p>tx1.commit();<br />
            tx2.commit();<br />
            session1.close();<br />
            session2.close();<br />
            <br />
            Java对象的持久化状态是相对于某个具体的Session实例的，以下代码试图使一个Java对象同时被两个Session实例关联：<br />
            <br />
            Session session1=sessionFactory.openSession();<br />
            Session session2=sessionFactory.openSession();<br />
            Transaction tx1 = session1.beginTransaction();<br />
            Transaction tx2 = session2.beginTransaction();</p>
            <p>Customer c=(Customer)session1.load(Customer.class,new Long(1)); //Customer对象被session1关联<br />
            session2.update(c); //Customer对象被session2关联<br />
            c.setName("Jack"); //修改Customer对象的属性</p>
            <p>tx1.commit(); //执行update语句<br />
            tx2.commit(); //执行update语句<br />
            session1.close();<br />
            session2.close();</p>
            <p>当执行session1的load()方法时，OID为1的Customer对象被加入到session1的缓存中，因此它是session1的持久化对象，此时它还没有被session2关联，因此相对于session2，它处于游离状态。当执行session2的update()方法时，Customer对象被加入到session2的缓存中，因此也成为session2的持久化对象。接下来修改Customer对象的name属性，会导致两个Session实例在清理各自的缓存时，都执行相同的update语句：<br />
            <br />
            update CUSTOMERS set NAME='Jack' &#8230;&#8230; where ID=1;<br />
            在实际应用程序中，应该避免一个Java对象同时被多个Session实例关联，因为这会导致重复执行SQL语句，并且极容易出现一些并发问题。<br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/Crying/aggbug/145964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-17 20:33 <a href="http://www.blogjava.net/Crying/articles/145964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的检索策略小结</title><link>http://www.blogjava.net/Crying/articles/145951.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 17 Sep 2007 11:45:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/145951.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/145951.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/145951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/145951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/145951.html</trackback:ping><description><![CDATA[　Hibernate的检索策略包括类级别检索策略和关联级别检索策略。
<p>　　类级别检索策略有立即检索和延迟检索，默认的检索策略是立即检索。在Hibernate映射文件中，通过在&lt;class&gt;上配置lazy属性来确定检索策略。对于Session的检索方式，类级别检索策略仅适用于load方法；也就说，对于get、qurey检索，持久化对象都会被立即加载而不管lazy是false还是true.一般来说，我们检索对象就是要访问它，因此立即检索是通常的选择。由于load方法在检索不到对象时会抛出异常（立即检索的情况下），因此我个人并不建议使用load检索；而由于&lt;class&gt;中的lazy属性还影响到多对一及一对一的检索策略，因此使用load方法就更没必要了。</p>
<p>　　关联级别检索策略有立即检索、延迟检索和迫切左外连接检索。对于关联级别检索，又可分为一对多和多对多、多对一和一对一两种情况讨论。</p>
<p>　　一对多和多对多关联关系一般使用&lt;set&gt;配置。&lt;set&gt;有lazy和outer-join属性，它们的不同取值绝对了检索策略。</p>
<p>　　1）立即检索：这是一对多默认的检索策略，此时lazy=false，outer-join=false.尽管这是默认的检索策略，但如果关联的集合是无用的，那么就不要使用这种检索方式。</p>
<p>　　2）延迟检索：此时lazy=true，outer-join=false（outer-join=true是无意义的），这是优先考虑的检索方式。</p>
<p>　　3）迫切左外连接检索：此时 lazy=false，outer-join=true，这种检索策略只适用于依靠id检索方式（load、get），而不适用于query的集合检索（它会采用立即检索策略）。相比于立即检索，这种检索策略减少了一条sql语句，但在Hibernate中，只能有一个&lt;set&gt;配置成 outer-join=true.</p>
<p>　　多对一和一对一检索策略一般使用&lt;many-to-one&gt;、&lt;one-to-one&gt;配置。&lt;many-to-one&gt;中需要配置的属性是 outer-join，同时还需要配置one端关联的&lt;class&gt;的lazy属性（配置的可不是&lt;many-to-one&gt;中的lazy哦），它们的组合后的检索策略如下：</p>
<p>　　1） outer-join=auto：这是默认值，如果lazy=true为延迟检索，如果lazy=false为迫切左外连接检索。</p>
<p>　　2） outer-join=true，无关于lazy，都为迫切左外连接检索。</p>
<p>　　3） outer-join=false，如果lazy=true为延迟检索，否则为立即检索。</p>
<p>　　可以看到，在默认的情况下（outer-join=auto，lazy=false），对关联的one端对象Hibernate采用的迫切左外连接检索。依我看，很多情况下，我们并不需要加载one端关联的对象（很可能我们需要的仅仅是关联对象的id）；另外，如果关联对象也采用了迫切左外连接检索，就会出现select语句中有多个外连接表，如果个数多的话会影响检索性能，这也是为什么Hibernate通过hibernate.max_fetch_depth属性来控制外连接的深度。对于迫切左外连接检索，query的集合检索并不适用，它会采用立即检索策略。</p>
<p>　　对于检索策略，需要根据实际情况进行选择。对于立即检索和延迟检索，它们的优点在于select语句简单（每张表一条语句）、查询速度快，缺点在于关联表时需要多条select语句，增加了访问数据库的频率。因此在选择即检索和延迟检索时，可以考虑使用批量检索策略来减少select语句的数量（配置batch-size属性）。对于切左外连接检索，优点在于select较少，但缺点是select语句的复杂度提高，多表之间的关联会是很耗时的操作。另外，配置文件是死的，但程序是活的，可以根据需要在程序里显示的指定检索策略（可能经常需要在程序中显示指定迫切左外连接检索）。为了清楚检索策略的配置效果如何，可以配置show_sql属性查看程序运行时Hibernate执行的sql语句。</p>
<img src ="http://www.blogjava.net/Crying/aggbug/145951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-17 19:45 <a href="http://www.blogjava.net/Crying/articles/145951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>one-to-many 和one-to-one</title><link>http://www.blogjava.net/Crying/articles/142039.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sun, 02 Sep 2007 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/142039.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/142039.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/142039.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/142039.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/142039.html</trackback:ping><description><![CDATA[<p>创建 db_iteam表&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; create table db_iteam(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id&nbsp; int identity not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;iteamNum"char(10) not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff6600">&nbsp;&nbsp;paId </span>int null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;primary key ("id")<br />
&nbsp;&nbsp;&nbsp; )<br />
go<br />
<br />
/*************/<br />
创建db_user表<br />
<br />
&nbsp;&nbsp;&nbsp; create table db_user (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id&nbsp;&nbsp; int identity not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name char(10) not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff6600">&nbsp; iteamId </span>int null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; primary key ("id")<br />
&nbsp;&nbsp;&nbsp; )<br />
/***********************/<br />
创建db_passport<br />
&nbsp;create table db_passport(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "id" int not null,&nbsp;&nbsp;//主键关联与db_user<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "number" char(10) not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; primary key ("id")<br />
&nbsp;&nbsp;&nbsp; )<br />
go<br />
*******************<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vo:<br />
*******************<br />
package wsq.vo;</p>
<p>import java.util.HashSet;<br />
import java.util.Set;</p>
<p>public class DbIteam implements java.io.Serializable {</p>
<p>&nbsp;private Integer id;</p>
<p>&nbsp;private String iteamNum;<br />
&nbsp;private DbIteam subIteam;<br />
<br />
&nbsp;<span style="color: #0000ff">private Set subIteams=new HashSet();<br />
&nbsp;<br />
&nbsp;private Set users=new HashSet();</span></p>
<p>&nbsp;public Set getUsers() {<br />
&nbsp;&nbsp;return users;<br />
&nbsp;}</p>
<p>&nbsp;public void setUsers(Set users) {<br />
&nbsp;&nbsp;this.users = users;<br />
&nbsp;}<br />
&nbsp;public DbIteam() {<br />
&nbsp;}<br />
&nbsp;public DbIteam(String iteamNum) {<br />
&nbsp;&nbsp;this.iteamNum = iteamNum;<br />
&nbsp;}</p>
<p>&nbsp;public Integer getId() {<br />
&nbsp;&nbsp;return this.id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(Integer id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getIteamNum() {<br />
&nbsp;&nbsp;return this.iteamNum;<br />
&nbsp;}</p>
<p>&nbsp;public void setIteamNum(String iteamNum) {<br />
&nbsp;&nbsp;this.iteamNum = iteamNum;<br />
&nbsp;}</p>
<p>&nbsp;public DbIteam getSubIteam() {<br />
&nbsp;&nbsp;return subIteam;<br />
&nbsp;}</p>
<p>&nbsp;public void setSubIteam(DbIteam subIteam) {<br />
&nbsp;&nbsp;this.subIteam = subIteam;<br />
&nbsp;}</p>
<p>&nbsp;public Set getSubIteams() {<br />
&nbsp;&nbsp;return subIteams;<br />
&nbsp;}</p>
<p>&nbsp;public void setSubIteams(Set subIteams) {<br />
&nbsp;&nbsp;this.subIteams = subIteams;<br />
&nbsp;}</p>
<p>}<br />
</p>
<p><br />
******************<br />
</p>
<p>package wsq.vo;</p>
<p>public class DbUser implements java.io.Serializable {</p>
<p>&nbsp;private Integer id;</p>
<p>&nbsp;private String name;<br />
&nbsp;&nbsp;&nbsp;<br />
<span style="color: #0000ff">&nbsp;private DbIteam dbIteam;<br />
&nbsp;private DbPassport&nbsp; dbPassport;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;public DbPassport getDbPassport() {<br />
&nbsp;&nbsp;return dbPassport;<br />
&nbsp;}</p>
<p>&nbsp;public void setDbPassport(DbPassport dbPassport) {<br />
&nbsp;&nbsp;this.dbPassport = dbPassport;<br />
&nbsp;}</p>
<p>&nbsp;&nbsp;public DbUser() {<br />
&nbsp;}<br />
&nbsp;public DbUser(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}</p>
<p>&nbsp;public Integer getId() {<br />
&nbsp;&nbsp;return this.id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(Integer id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getName() {<br />
&nbsp;&nbsp;return this.name;<br />
&nbsp;}</p>
<p>&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}<br />
&nbsp;public String toString()<br />
&nbsp;{<br />
&nbsp;&nbsp;return name+"&nbsp;&nbsp; 测试！";<br />
&nbsp;}</p>
<p>&nbsp;public DbIteam getDbIteam() {<br />
&nbsp;&nbsp;return dbIteam;<br />
&nbsp;}</p>
<p>&nbsp;public void setDbIteam(DbIteam dbIteam) {<br />
&nbsp;&nbsp;this.dbIteam = dbIteam;<br />
&nbsp;}</p>
<p>}<br />
</p>
<p>/**********************************/<br />
</p>
<p>package wsq.vo;</p>
<p>public class DbPassport implements java.io.Serializable {</p>
<p>&nbsp;private Integer id;</p>
<p>&nbsp;private String number;</p>
<p>&nbsp;<span style="color: #0000ff">private DbUser dbUser;</span></p>
<p>&nbsp;public DbUser getDbUser() {<br />
&nbsp;&nbsp;return dbUser;<br />
&nbsp;}</p>
<p>&nbsp;public void setDbUser(DbUser dbUser) {<br />
&nbsp;&nbsp;this.dbUser = dbUser;<br />
&nbsp;}</p>
<p>&nbsp;public DbPassport() {<br />
&nbsp;}<br />
&nbsp;public DbPassport(String number) {<br />
&nbsp;&nbsp;this.number = number;<br />
&nbsp;}</p>
<p>&nbsp;public Integer getId() {<br />
&nbsp;&nbsp;return this.id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(Integer id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getNumber() {<br />
&nbsp;&nbsp;return this.number;<br />
&nbsp;}</p>
<p>&nbsp;public void setNumber(String number) {<br />
&nbsp;&nbsp;this.number = number;<br />
&nbsp;}</p>
<p>}<br />
</p>
<p>/******************************/<br />
配置DbIteam.hbm.xml<br />
<br />
&nbsp;&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="wsq.vo.DbIteam" table="db_iteam" schema="dbo"<br />
&nbsp;&nbsp;catalog="dbs" &gt;<br />
&nbsp;&nbsp;&lt;id name="id" type="java.lang.Integer"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;column name="id" /&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="native" /&gt;<br />
&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;&lt;property name="iteamNum" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;column name="iteamNum" length="10" not-null="true" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; <span style="color: #0000ff">&lt;many-to-one name="subIteam" class="wsq.vo.DbIteam" column="paId"&nbsp; /&gt;&nbsp;<br />
</span>&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<span style="color: #0000ff">&lt;set name="users" cascade="all" table="db_user" lazy="true" batch-size="5"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;key column="iteamId"&gt;&lt;/key&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;one-to-many class="wsq.vo.DbUser" /&gt;<br />
&nbsp;&nbsp;&lt;/set&gt;<br />
&nbsp;&nbsp;&lt;set name="subIteams" cascade="all" table="db_iteam" lazy="true" batch-size="5"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;key column="paId"&gt;&lt;/key&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;one-to-many class="wsq.vo.DbIteam" /&gt;<br />
&nbsp;&nbsp;&lt;/set&gt;<br />
&nbsp;&lt;/class&gt;<br />
</span>&lt;/hibernate-mapping&gt;<br />
<br />
<br />
配置DbUser.hbm.xml<br />
<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;&nbsp;&nbsp; Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;class name="wsq.vo.DbUser" table="db_user" schema="dbo" catalog="dbs"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.Integer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="id" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="native" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="name" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="name" length="10" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080">&nbsp; &lt;many-to-one name="dbIteam" class="wsq.vo.DbIteam" column="iteamId" outer-join="true"&nbsp; &gt;&lt;/many-to-one&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080">&nbsp;&nbsp; &lt;one-to-one name="dbPassport" class="wsq.vo.DbPassport" cascade="all" &gt;&lt;/one-to-one&gt;<br />
</span>&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<br />
配置DbPassport.hbm.xml<br />
<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="wsq.vo.DbPassport" table="db_passport" schema="dbo"<br />
&nbsp;&nbsp;catalog="dbs"&gt;<br />
&nbsp;<span style="color: #0000ff">&nbsp;&lt;id name="id" type="java.lang.Integer"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;column name="id" /&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="foreign" &gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="property"&gt;dbUser&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/generator&gt;<br />
</span>&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;&lt;property name="number" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;column name="number" length="10" not-null="true" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;<span style="color: #0000ff">&nbsp;&lt;one-to-one name="dbUser" class="wsq.vo.DbUser" constrained="true"&gt;&lt;/one-to-one&gt;<br />
</span>&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<br />
<br />
/*******************<br />
测试类<br />
</p>
<p>package wsq.vo;</p>
<p>import org.apache.commons.logging.Log;<br />
import org.apache.commons.logging.LogFactory;<br />
import org.hibernate.Transaction;</p>
<p>public class Test {<br />
&nbsp;private static final Log log = LogFactory.getLog(Test.class);</p>
<p>&nbsp;Test() {</p>
<p>&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;BaseHibernateDAO basedao = new BaseHibernateDAO( );<br />
&nbsp;&nbsp;DbIteamDAO iteamDAO = new DbIteamDAO( );<br />
&nbsp;&nbsp;DbUserDAO userDAO = new DbUserDAO( );</p>
<p>&nbsp;&nbsp;DbIteam iteam = new DbIteam( ); <br />
&nbsp;&nbsp;DbIteam iteam3 = new DbIteam( );<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;DbUser user = new DbUser( );<br />
&nbsp;&nbsp;DbPassport ps = new DbPassport( );<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Transaction tx = basedao.getSession( ).beginTransaction( );<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;iteam.setIteamNum("2");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;iteam.setSubIteam(iteamDAO.findById(16));&nbsp;&nbsp; //iteamDAO.findById(16)找到的是一级&nbsp; 此处添加是2级<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;iteam3.setIteamNum("3");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;iteam3.setSubIteam(iteam);//3级<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;user.setName("djg");</p>
<p>&nbsp;&nbsp;user.setDbIteam(iteam3);</p>
<p>&nbsp;&nbsp;ps.setNumber("48");</p>
<p>&nbsp;&nbsp;user.setDbPassport(ps);</p>
<p>&nbsp;&nbsp;ps.setDbUser(user);</p>
<p>&nbsp;&nbsp;<br />
&nbsp;&nbsp;// iteamDAO.delete(iteamDAO.findById(23));<br />
&nbsp;&nbsp;iteamDAO.save(iteam);<br />
&nbsp;&nbsp;iteamDAO.save(iteam3);<br />
&nbsp;&nbsp;userDAO.save(user);<br />
&nbsp;&nbsp;log.info("ok!!!!!!&nbsp;&nbsp;&nbsp; !!ok!!!&nbsp; ok!&nbsp;&nbsp;&nbsp;&nbsp; 111111111111111111&nbsp; !!&nbsp; !");<br />
&nbsp;&nbsp;tx.commit(&nbsp; );</p>
<p>&nbsp;}</p>
<p>}<br />
</p>
<p><br />
<br />
<br />
<br />
<br />
<br />
<br />
&nbsp;</p>
<img src ="http://www.blogjava.net/Crying/aggbug/142039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-02 10:21 <a href="http://www.blogjava.net/Crying/articles/142039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的一个表对应多个VO</title><link>http://www.blogjava.net/Crying/articles/142038.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sun, 02 Sep 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/142038.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/142038.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/142038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/142038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/142038.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;创建表：<br />
&nbsp;&nbsp;&nbsp;&nbsp; PersonOne <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id;&nbsp;&nbsp; <span style="color: #0000ff">role;</span>&nbsp;&nbsp; username;&nbsp;&nbsp; password; sex;&nbsp; birthday;&nbsp;&nbsp; grade;&nbsp; schoolage;<br />
<br />
&nbsp;&nbsp;////////////////////// /****///////////////****///////////////////********/////////////////////////////<br />
VO :<br />
<br />
&nbsp;
<p>package wsq.po;</p>
<p>import java.util.Date;</p>
<p>public class PersonOne implements java.io.Serializable {</p>
<p>&nbsp;private static final long serialVersionUID = 3694568337955384021L;</p>
<p>&nbsp;private Integer id;</p>
<p>&nbsp;private String role;</p>
<p>&nbsp;private String username;</p>
<p>&nbsp;private String password;</p>
<p>&nbsp;private String sex;</p>
<p>&nbsp;private Date birthday;</p>
<p><span style="color: #0000ff">//&nbsp;private String grade;<br />
//&nbsp;private String schoolage;</span></p>
<p>&nbsp;public PersonOne() {<br />
&nbsp;}</p>
<p>&nbsp;<br />
&nbsp;public PersonOne(String role, String username, String password, String sex,<br />
&nbsp;&nbsp;&nbsp;Date birthday, String grade, String schoolage) {<br />
&nbsp;&nbsp;this.role = role;<br />
&nbsp;&nbsp;this.username = username;<br />
&nbsp;&nbsp;this.password = password;<br />
&nbsp;&nbsp;this.sex = sex;<br />
&nbsp;&nbsp;this.birthday = birthday;<br />
&nbsp;&nbsp;//this.grade = grade;<br />
&nbsp;&nbsp;//this.schoolage = schoolage;<br />
&nbsp;}<br />
&nbsp;public Integer getId() {<br />
&nbsp;&nbsp;return this.id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(Integer id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getRole() {<br />
&nbsp;&nbsp;return this.role;<br />
&nbsp;}</p>
<p>&nbsp;public void setRole(String role) {<br />
&nbsp;&nbsp;this.role = role;<br />
&nbsp;}</p>
<p>&nbsp;public String getUsername() {<br />
&nbsp;&nbsp;return this.username;<br />
&nbsp;}</p>
<p>&nbsp;public void setUsername(String username) {<br />
&nbsp;&nbsp;this.username = username;<br />
&nbsp;}</p>
<p>&nbsp;public String getPassword() {<br />
&nbsp;&nbsp;return this.password;<br />
&nbsp;}</p>
<p>&nbsp;public void setPassword(String password) {<br />
&nbsp;&nbsp;this.password = password;<br />
&nbsp;}</p>
<p>&nbsp;public String getSex() {<br />
&nbsp;&nbsp;return this.sex;<br />
&nbsp;}</p>
<p>&nbsp;public void setSex(String sex) {<br />
&nbsp;&nbsp;this.sex = sex;<br />
&nbsp;}</p>
<p>&nbsp;public Date getBirthday() {<br />
&nbsp;&nbsp;return this.birthday;<br />
&nbsp;}</p>
<p>&nbsp;public void setBirthday(Date birthday) {<br />
&nbsp;&nbsp;this.birthday = birthday;<br />
&nbsp;}</p>
<p>//&nbsp;public String getGrade() {<br />
//&nbsp;&nbsp;return this.grade;<br />
//&nbsp;}<br />
//<br />
//&nbsp;public void setGrade(String grade) {<br />
//&nbsp;&nbsp;this.grade = grade;<br />
//&nbsp;}<br />
//<br />
//&nbsp;public String getSchoolage() {<br />
//&nbsp;&nbsp;return this.schoolage;<br />
//&nbsp;}<br />
//<br />
//&nbsp;public void setSchoolage(String schoolage) {<br />
//&nbsp;&nbsp;this.schoolage = schoolage;<br />
//&nbsp;}</p>
<p>}<br />
</p>
<br />
<span style="color: #0000ff">Student:&nbsp;&nbsp;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;
<p>package wsq.po;</p>
<p>public class Student extends PersonOne implements java.io.Serializable {</p>
<p>&nbsp;private static final long serialVersionUID = -2981420482383402755L;</p>
<p>&nbsp;<br />
&nbsp;private String grade;</p>
<p>&nbsp;&nbsp;&nbsp; public String getGrade() {<br />
&nbsp;&nbsp;return this.grade;<br />
&nbsp;}</p>
<p>&nbsp;public void setGrade(String grade) {<br />
&nbsp;&nbsp;this.grade = grade;<br />
&nbsp;}</p>
<p>}<br />
<br />
Teacher :<br />
package wsq.po;</p>
<p>public class Teacher extends PersonOne implements java.io.Serializable {</p>
<p><br />
&nbsp;private static final long serialVersionUID = -8404469876025711535L;</p>
<p>&nbsp;private String schoolage;</p>
<p>&nbsp;public String getSchoolage() {<br />
&nbsp;&nbsp;return schoolage;<br />
&nbsp;}</p>
<p>public void setSchoolage(String schoolage) {<br />
&nbsp;&nbsp;this.schoolage = schoolage;<br />
&nbsp;}<br />
}<br />
<br />
配置：<br />
</p>
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="wsq.po.PersonOne" table="personOne" schema="dbo"<br />
&nbsp;&nbsp;catalog="J2EE"&gt;<br />
&nbsp;&nbsp;&lt;id name="id" type="java.lang.Integer"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;column name="id" /&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;generator class="increment" /&gt;<br />
&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp;&nbsp;<span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; important&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&lt;discriminator column="role" type="java.lang.String"/&gt;</span><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;property name="username" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;column name="username" length="20" not-null="true" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="password" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;column name="password" length="20" not-null="true" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="sex" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;column name="sex" length="5" not-null="true" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="birthday" type="java.util.Date"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;column name="birthday" length="23" not-null="true" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
<span style="color: #0000ff">&nbsp;&nbsp;&lt;subclass name="wsq.po.Student" discriminator-value="1"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="grade" column="grade" type="java.lang.String" /&gt;<br />
&nbsp;&nbsp;&lt;/subclass&gt;<br />
&nbsp;&nbsp;&lt;subclass name="wsq.po.Teacher" discriminator-value="2"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="schoolage" column="schoolage" type="java.lang.String" /&gt;<br />
&nbsp;&nbsp;&lt;/subclass&gt;</span></p>
<p>&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
</p>
<p><br />
&nbsp;</p>
<br />
<img src ="http://www.blogjava.net/Crying/aggbug/142038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-02 09:54 <a href="http://www.blogjava.net/Crying/articles/142038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中继承</title><link>http://www.blogjava.net/Crying/articles/142033.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sun, 02 Sep 2007 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/142033.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/142033.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/142033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/142033.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/142033.html</trackback:ping><description><![CDATA[首先<br />
&nbsp;&nbsp;&nbsp;&nbsp; 创建表（mssql）&nbsp;&nbsp;及vo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<p><span style="color: #ff00ff">person 表</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id;(主键) int;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;username&nbsp; varchar;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password&nbsp; varchar;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; sex&nbsp;&nbsp; varchar;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; birthday&nbsp; DateTime;<br />
*******************<br />
<span style="color: #ff00ff">student表&nbsp;</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp; id;(主键)<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; grade&nbsp; varchar;</p>
<p>*******************<br />
<span style="color: #ff00ff">teacher表</span><br />
&nbsp;&nbsp;&nbsp; id;(主键)<br />
&nbsp;&nbsp; schoolage varchar;</p>
<p>/////////////////////******////////////////////////////////<br />
再创建VO<br />
<span style="color: #ff00ff">Person&nbsp; </span></p>
<p>package wsq.po;</p>
<p>import java.util.Date;<br />
public class Person implements java.io.Serializable {<br />
&nbsp;private static final long serialVersionUID = -4431851578811178858L;</p>
<p>&nbsp;private Integer id;</p>
<p>&nbsp;private String username;</p>
<p>&nbsp;private String password;</p>
<p>&nbsp;private String sex;</p>
<p>&nbsp;private Date birthday;<br />
&nbsp;public Person() {<br />
&nbsp;}<br />
&nbsp;public Person(String username, String password, String sex, Date birthday) {<br />
&nbsp;&nbsp;this.username = username;<br />
&nbsp;&nbsp;this.password = password;<br />
&nbsp;&nbsp;this.sex = sex;<br />
&nbsp;&nbsp;this.birthday = birthday;<br />
&nbsp;}</p>
<p>&nbsp;public Integer getId() {<br />
&nbsp;&nbsp;return this.id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(Integer id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getUsername() {<br />
&nbsp;&nbsp;return this.username;<br />
&nbsp;}</p>
<p>&nbsp;public void setUsername(String username) {<br />
&nbsp;&nbsp;this.username = username;<br />
&nbsp;}</p>
<p>&nbsp;public String getPassword() {<br />
&nbsp;&nbsp;return this.password;<br />
&nbsp;}</p>
<p>&nbsp;public void setPassword(String password) {<br />
&nbsp;&nbsp;this.password = password;<br />
&nbsp;}</p>
<p>&nbsp;public String getSex() {<br />
&nbsp;&nbsp;return this.sex;<br />
&nbsp;}</p>
<p>&nbsp;public void setSex(String sex) {<br />
&nbsp;&nbsp;this.sex = sex;<br />
&nbsp;}</p>
<p>&nbsp;public Date getBirthday() {<br />
&nbsp;&nbsp;return this.birthday;<br />
&nbsp;}</p>
<p>&nbsp;public void setBirthday(Date birthday) {<br />
&nbsp;&nbsp;this.birthday = birthday;<br />
&nbsp;}</p>
<p>}</p>
<p style="color: #ff00ff">&nbsp;Student&nbsp; </p>
&nbsp;&nbsp;&nbsp; 注意id属性没有了
<p>package wsq.po;<br />
public class Student extends Person implements java.io.Serializable {</p>
<p>&nbsp;private static final long serialVersionUID = -2981420482383402755L;<br />
&nbsp;private String grade;<br />
&nbsp;public Student() {<br />
&nbsp;}</p>
<p>&nbsp;public String getGrade() {<br />
&nbsp;&nbsp;return this.grade;<br />
&nbsp;}</p>
<p>&nbsp;public void setGrade(String grade) {<br />
&nbsp;&nbsp;this.grade = grade;<br />
&nbsp;}</p>
<p>}</p>
<p style="color: #ff00ff">Teacher&nbsp;<br />
&nbsp;&nbsp; </p>
<p>package wsq.po;</p>
<p>public class Teacher extends Person implements java.io.Serializable {</p>
<p><br />
&nbsp;private static final long serialVersionUID = -8404469876025711535L;</p>
<p>&nbsp;private String schoolage;</p>
<p>&nbsp;&nbsp;public Teacher() {<br />
&nbsp;}</p>
<p>&nbsp;public String getSchoolage() {<br />
&nbsp;&nbsp;return this.schoolage;<br />
&nbsp;}</p>
<p>&nbsp;public void setSchoolage(String schoolage) {<br />
&nbsp;&nbsp;this.schoolage = schoolage;<br />
&nbsp;}</p>
<p>}<br />
<span style="color: #000080">////////////////////****************/////////////////////////<br />
最关键的就是配置了<br />
&nbsp; &lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp;&nbsp;&nbsp; Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;class name="wsq.po.Person" table="person" schema="dbo" catalog="J2EE"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.Integer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="id" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="increment" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="username" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="username" length="20" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="password" length="20" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sex" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="sex" length="2" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="birthday" type="java.util.Date"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="birthday" length="8" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">&nbsp; &lt;joined-subclass name="wsq.po.Student" table="student"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &lt;key column="id"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="grade" type="java.lang.String" column="grade" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/joined-subclass&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;joined-subclass name="wsq.po.Teacher" table="teacher"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &lt;key column="id"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="schoolage" type="java.lang.String" column="schoolage" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/joined-subclass&gt;<br />
</span>&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
</span></p>
<img src ="http://www.blogjava.net/Crying/aggbug/142033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-02 09:30 <a href="http://www.blogjava.net/Crying/articles/142033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PO VO BO DTO POJO DAO 之间的关系（转载）</title><link>http://www.blogjava.net/Crying/articles/141927.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sat, 01 Sep 2007 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/141927.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/141927.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/141927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/141927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/141927.html</trackback:ping><description><![CDATA[<div><font size="2">J2EE开发中大量的专业缩略语很是让人迷惑，尤其是跟一些高手讨论问题的时候，三分钟就被人家满口的专业术语喷晕了，</font> </div>
<div><font size="2">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PO VO BO DTO POJO </font>&nbsp;&nbsp; </div>
<div><font size="+0">PO：</font> </div>
<div><font size="+0">persistant object持久对象</font> </div>
<div><font size="+0">最形象的理解就是一个PO就是数据库中的一条记录。</font> </div>
<div><font size="+0">好处是可以把一条记录作为一个对象处理，可以方便的转为其它对象。</font> </div>
<div><font size="+0">BO：</font> </div>
<div><font size="+0">business object业务对象</font> <font size="+0">主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。</font> </div>
<div><font size="+0">比如一个简历，有教育经历、工作经历、社会关系等等。</font> </div>
<div><font size="+0">我们可以把教育经历对应一个PO，工作经历对应一个PO，社会关系对应一个PO。</font> </div>
<div><font size="+0">建立一个对应简历的BO对象处理简历，每个BO包含这些PO。</font> </div>
<div><font size="+0">这样处理业务逻辑时，我们就可以针对BO去处理。</font> </div>
<div><font size="+0">VO ：</font> </div>
<div><font size="+0">value object值对象</font> </div>
<div><font size="+0">ViewObject表现层对象</font> </div>
<div><font size="+0">主要对应界面显示的数据对象。对于一个WEB页面，或者SWT、SWING的一个界面，用一个VO对象对应整个界面的值。</font> </div>
<div><font size="+0">DTO ：</font> </div>
<div><font size="+0">Data Transfer Object数据传输对象</font> </div>
<div><font size="+0">主要用于远程调用等需要大量传输对象的地方。</font> </div>
<div><font size="+0">比如我们一张表有100个字段，那么对应的PO就有100个属性。</font> </div>
<div><font size="+0">但是我们界面上只要显示10个字段，</font> </div>
<div><font size="+0">客户端用WEB service来获取数据，没有必要把整个PO对象传递到客户端，</font> </div>
<div><font size="+0">这时我们就可以用只有这10个属性的DTO来传递结果到客户端，这样也不会暴露服务端表结构.到达客户端以后，如果用这个对象来对应界面显示，那此时它的身份就转为VO</font> &shy;</div>
<div><font size="+0">POJO ：</font> </div>
<div><font size="+0"><font color="#333333">plain ordinary java object 简单ava对象</font> </div>
<div>个人感觉POJO是最参见最多变的对象，是一个中间对象，也是我们最常打交道的对象。</font> </div>
<div><font size="+0">一个POJO持久化以后就是PO</font> </div>
<div><font size="+0">直接用它传递、传递过程中就是DTO</font> </div>
<div><font size="+0">直接用来对应表示层就是VO</font> </div>
<div><font size="+0">DAO：</font> </div>
<div><font size="+0">data access object数据访问对象</font> </div>
<div><font size="+0">这个大家最熟悉，和上面几个O区别最大，基本没有互相转化的可能性和必要.</font> </div>
<div><font size="+0">主要用来封装对数据库的访问。通过它可以把POJO持久化为PO，用PO组装出来VO、DTO</font> </div>
<div><font size="+0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结下我认为一个对象究竟是什么O要看具体环境，在不同的层、不同的应用场合，对象的身份也不一样，而且对象身份的转化也是很自然的。就像你对老婆来说就是老公，对父母来说就是子女。设计这些概念的初衷不是为了唬人而是为了更好的理解和处理各种逻辑，让大家能更好的去用<font color="#ff0000">面向对象</font>的方式处理问题.</font> </div>
<div><font size="+0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家千万不要陷入过度设计，大可不必为了设计而设计一定要在代码中区分各个对象。一句话技术是为应用服务的。</font> </div>
<div><font size="+0">画了个图，感觉没有完全表达出自己的意思。。。。。谁帮忙完善下，最好能体现各个O在MVC中的位置</font> </div>
<div><font size="+0"><img height="480" src="http://www.blogjava.net/images/blogjava_net/vip01/snap20070108.jpg" width="557" border="0"  alt="" /></font>&nbsp;&nbsp;</div>
<img src ="http://www.blogjava.net/Crying/aggbug/141927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-01 14:44 <a href="http://www.blogjava.net/Crying/articles/141927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORM</title><link>http://www.blogjava.net/Crying/articles/141928.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sat, 01 Sep 2007 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/141928.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/141928.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/141928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/141928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/141928.html</trackback:ping><description><![CDATA[<a href="http://www.itisedu.com/phrase/200603051342455.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">对象关系映射</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">（</font><wbr><a href="http://www.itisedu.com/phrase/200604231312415.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">Object Relational Mapping</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">，简称</font><wbr><a href="http://www.itisedu.com/phrase/200604231312115.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">ORM</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">）是一种为了解决</font><wbr><a href="http://www.itisedu.com/phrase/200603101726185.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">面向对象</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">与关系</font><wbr><a href="http://www.itisedu.com/phrase/200602271218062.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">数据库</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">存在的互不匹配的现象的技术。 简单的说，ORM是通过使用描述</font><wbr><a href="http://www.itisedu.com/phrase/200603090845215.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">对象</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">和数据库之间映射的</font><wbr><a href="http://www.itisedu.com/phrase/200603141328355.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">元数据</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">，将java</font><wbr><a href="http://www.itisedu.com/phrase/200604232224305.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">程序</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示者额外的执行开销；然而，如果ORM作为一种</font><wbr><a href="http://www.itisedu.com/phrase/200604241155005.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">中间件</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">实现，则会有很多机会做优化，而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理；但是同样，这些花费要比维护手写的方案要少；而且就算是遵守ODMG规范的对象数据库依然需要</font><wbr><a href="http://www.itisedu.com/phrase/200603090857555.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">类</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">级别的元数据。 </font><wbr><a href="http://www.itisedu.com/phrase/200604231311465.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">对象-关系映射</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">（</font><wbr><a href="http://www.itisedu.com/phrase/200604231338435.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">Object</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">/Relation Mapping，简称ORM），是随着面向对象的</font><wbr><a href="http://www.itisedu.com/phrase/200603282233345.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">软件开发</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法，关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是</font><wbr><a href="http://www.itisedu.com/phrase/200603101513085.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">业务实体</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">的两种表现形式，业务实体在内存中表现为对象，在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系，而在数据库中，关系数据无法直接表达多对多关联和继承关系。因此，对象-关系映射(ORM)系统一般以中间件的形式存在，主要实现程序对象到关系数据库数据的映射。</font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面向对象是从</font><wbr><a href="http://www.itisedu.com/phrase/200602281725525.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">软件工程</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">基本原则(如耦合、聚合、封装)的基础上发展起来的，而关系数据库则是从数学理论发展而来的，两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。 </font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面，都存在对象和关系数据库。在业务逻辑层和</font><wbr><a href="http://www.itisedu.com/phrase/200604241148495.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">用户界面层</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">中，我们是面向对象的。当对象信息发生变化的时候，我们需要把对象的信息保存在关系数据库中。 </font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码，用来从数据库保存，删除，读取对象信息，等等。你在DAL中写了很多的方法来读取对象数据，改变状态对象等等任务。而这些代码写起来总是重复的。<br />
&nbsp;<br />
　　如果打开你最近的程序，看看DAL代码，你肯定会看到很多近似的通用的</font><wbr><a href="http://www.itisedu.com/phrase/200603061709535.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">模式</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">。我们以保存对象的方法为例，你传入一个对象，为SqlCommand对象添加SqlParameter，把所有属性和对象对应，设置SqlCommand的CommandText属性为存储过程，然后运行SqlCommand。对于每个对象都要重复的写这些代码。 </font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">　　除此之外，还有更好的办法吗？有，引入一个O/R Mapping。实质上，一个O/R Mapping会为你生成DAL。与其自己写DAL代码，不如用O/R Mapping。你用O/R Mapping保存，删除，读取对象，O/R Mapping负责生成</font><wbr><a href="http://www.itisedu.com/phrase/200604022014515.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">SQL</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">，你只需要关心对象就好。</font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对象关系映射成功运用在不同的面向对象持久层产品中，如:Torque,OJB,Hibernate,TopLink,</font><wbr><a href="http://www.itisedu.com/phrase/200603062248285.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">Castor</font><wbr></a><wbr><a href="http://www.itisedu.com/phrase/200604091919205.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">JDO</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">, TJDO 等。 </font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般的ORM包括以下四部分： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个对持久类对象进行CRUD操作的</font><wbr><a href="http://www.itisedu.com/phrase/200604241228185.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">API</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个语言或API用来规定与类和类属性相关的查询； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个规定mapping metadata的工具； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化操作。 </font><wbr><br />
<font style="line-height: 1.3em" color="#339999"><font style="line-height: 1.3em" size="3"><strong><wbr>一、目前流行的 ORM 产品</strong><wbr> </font><wbr></font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前众多厂商和</font><wbr><a href="http://www.itisedu.com/phrase/200603091812115.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">开源</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">社区都提供了持久层</font><wbr><a href="http://www.itisedu.com/phrase/200603061723295.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">框架</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">的实现，常见的有：</font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache OJB （http://</font><wbr><a href="http://www.itisedu.com/phrase/200604231245475.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">db</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">.apache.org/ojb/） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cayenne （http://objectstyle.org/cayenne/） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Jaxor （http://jaxor.sourceforge.net） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate （http://www.hibernate.org） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iBatis （http://www.ibatis.com） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jRelationalFramework （http://ijf.sourceforge.net） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mirage （http://itor.cq2.org/en/oss/mirage/toon） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SMYLE （http://www.drjava.de/smyle） <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TopLink （http://otn.</font><wbr><a href="http://www.itisedu.com/phrase/200604040935115.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">oracle</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">.com/products/ias/toplink/index.html） </font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中 TopLink 是 Oracle 的商业产品，其他均为开源项目。 </font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中 Hibernate 的轻量级 ORM 模型逐步确立了在 Java ORM </font><wbr><a href="http://www.itisedu.com/phrase/200604241328115.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">架构</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">中领导地位，甚至取代复杂而又繁琐的 </font><wbr><a href="http://www.itisedu.com/phrase/200604241156485.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">EJB</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3"> 模型而成为事实上的 Java ORM 工业标准。而且其中的许多设计均被 </font><wbr><a href="http://www.itisedu.com/phrase/200603091447335.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">J2EE</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3"> 标准组织吸纳而成为最新 EJB 3.0 规范的标准，这也是开源项目影响工业领域标准的有力见证。 </font><wbr><br />
<strong><wbr><font style="line-height: 1.3em" color="#339999" size="3">二、对象－关系映射模式</font><wbr></strong><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从《公共仓库元模型：开发指南》一书第8章CWM元仓库中摘录出来的内容，实现了公共仓库元模型(CWM)的</font><wbr><a href="http://www.itisedu.com/phrase/200602271429302.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">UML</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">图到Microsoft </font><wbr><a href="http://www.itisedu.com/phrase/200604040933575.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">SQL Server</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">数据库的映射，是一种将对象层次结构映射成关系型结构的方法。个人认为可以作为将本体(</font><wbr><a href="http://www.itisedu.com/phrase/200604250921325.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">Ontology</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">)</font><wbr><a href="http://www.itisedu.com/phrase/200602282323195.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">文件</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">存储到关系型数据库中的一种可借鉴方法。</font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本情况：公共仓库元模型(CWM)是对象管理组织(OMG)的一种和</font><wbr><a href="http://www.itisedu.com/phrase/200603091358275.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">数据仓库</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">相关的元模型标准，采用UML表示的对象层次结构，在保存到数据库中时由于面向对象的数据库技术的不完善(理论研究和商业应用都不是主流)，所以该书的作者倾向于使用成熟的关系型数据库来保存－这也是存储本体时所遇到的问题。</font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 采用方法：将UML模型中的各种元素通过转换，保存为数据库模式。由于CWM是一种元模型，因此模型的实例也是一种模型，将这种实例以数据库数据的形式保存。使用数据库中比较成熟的存储过程技术提高开发和执行效率。</font><wbr><br />
<strong><wbr><font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、数据</font><wbr><a href="http://www.itisedu.com/phrase/200603051002565.html" target="_blank"><font style="line-height: 1.3em" color="#339999" size="3">类型</font><wbr></a><wbr><font style="line-height: 1.3em" color="#339999" size="3">映射模式</font><wbr></strong><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.1简单数据类型模式：建立UML和关系型数据库中简单数据类型的映射表以指导映射。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.2枚举数据类型模式：每种枚举类型对应一个表，只有一个列(_EnumLiteral)表示枚举值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.3基于类的数据类型模式：使用外键约束，将基础列与基于类的类型实例相关联。</font><wbr><br />
<strong><wbr><font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、类映射模型</font><wbr></strong><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个类对应一个表。单值属性、多值属性、继承关系可以用下述方法映射，而引用属性将在关联映射模式中提到。</font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1单值属性模式：是cardinality的上界为1的属性，映射到类所对应的表的列上。若其下界也为1（必须有的属性），列属性为NOT NULL。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.2多值属性模式：每个多值属性映射成一个独立的表，使用外键连接到类所对应的表上。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.3继承模式：每加入一个类的实例时，根据其继承关系自顶向下生成每个类的对象，这些对象具有相同的ID（根对象对应记录的主键）。删除对象实例时，自底向上删除数据。遇到从中间删的情况怎么办？多重继承怎么处理？（金龙飞） </font><wbr><br />
<font style="line-height: 1.3em" color="#339999"><font style="line-height: 1.3em" size="3">&nbsp; <strong><wbr>&nbsp;&nbsp;&nbsp; 3、关联映射模式</strong><wbr></font><wbr></font><wbr><br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1一对一关联模式：在关联两端各加一列。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2一对多关联模式：和3.1一样。如果多这端是有序的，还需加入一列表示序号。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.3多对多关联模式：将关联单独作一个表。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.4组合关联模式：注意级联式删除。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.5反演关联模式：关联两端指向相关的类型，和普通关联一样。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.6成对关联模式：关联记录两个类间的关系，用交集类表示关联，表示成一个单独的表，每个关联对应一个表，用外键表示它们间的关系。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.7关联上的OCL需要分析成对应的存储过程代码。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.8保证关联的cardinality也需要分析成对应的存储过程代码。</font><wbr><br />
<strong><wbr><font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、引用映射模式</font><wbr></strong><wbr><br />
<br />
<font style="line-height: 1.3em" color="#339999" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在UML中不存在的MOF特征，指属性是声明为引用类型的实例。用存储过程实现。</font><wbr> 
<img src ="http://www.blogjava.net/Crying/aggbug/141928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-01 14:44 <a href="http://www.blogjava.net/Crying/articles/141928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HIBERNATE中重要的接口</title><link>http://www.blogjava.net/Crying/articles/141926.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sat, 01 Sep 2007 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/141926.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/141926.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/141926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/141926.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/141926.html</trackback:ping><description><![CDATA[<font style="line-height: 1.3em" size="3">Hibernate 使用了J2EE 架构中的如下技术：JDBC 、JTA 、JNDI 。其中JDBC 是一个支持关系 数据库操作的一个基础层；它与JNDI 和JTA 一起结合，使得Hibernate 可以方便地集成到J2EE 应用服务器中去。</font><wbr> <br />
<font style="line-height: 1.3em" size="3">讨论Hibernate API 接口中的所有方法，只简要讲一下每个主要 接口的功能，如果你想了解得更多的话，你可以在Hibernate 的源码包中的net.sf.hibernate 子包中 去查看这些接口的源代码。下面我们依次讲一下所有的主要接口： </font><wbr><br />
<font style="line-height: 1.3em" size="3">核心接口</font><wbr> <br />
<font style="line-height: 1.3em" size="3">以下5 个核心接口几乎在任何实际开发中都会用到。通过这些接口，你不仅可以存储和获得持 久对象，并且能够进行事务控制。</font><wbr> <br />
<font style="line-height: 1.3em" size="3">Configuration 接口</font><wbr> <br />
<font style="line-height: 1.3em" size="3">Configuration 接口的作用是对Hibernate 进行配置，以及对它进行启动。在Hibernate 的启动 <br />
过程中，Configuration 类的实例首先定位映射文档的位置，读取这些配置，然后创建一个 <br />
SessionFactory 对象。</font><wbr> <br />
<font style="line-height: 1.3em" size="3">虽然Configuration 接口在整个Hibernate 项目中只扮演着一个很小的角色，但它是启动 <br />
hibernate 时你所遇到的每一个对象。</font><wbr> <br />
&nbsp;<br />
<font style="line-height: 1.3em" size="3">SessionFactory 接口</font><wbr> <br />
<font style="line-height: 1.3em" size="3">这里用到了一个设计模式――工厂模式，用户程序从工厂类SessionFactory 中取得Session 的 实例。</font><wbr> <font style="line-height: 1.3em" size="3">令你感到奇怪的是SessionFactory 并不是轻量级的！实际上它的设计者的意图是让它能在整个 应用中共享。典型地来说，一个项目通常只需要一个SessionFactory 就够了，但是当你的项目要操 作多个数据库时，那你必须为每个数据库指定一个SessionFactory 。SessionFactory 在Hibernate 中实际起到了一个缓冲区的作用，它缓冲了Hibernate 自动生成的SQL 语句和一些其它的映射数据，还缓冲了一些将来有可能重复利用的数据。</font><wbr> <br />
&nbsp;<br />
<font style="line-height: 1.3em" size="3">Session 接口</font><wbr> <br />
<font style="line-height: 1.3em" size="3">Session 接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate 中，实例 化的Session 是一个轻量级的类，创建和销毁它都不会占用很多资源。这在实际项目中确实很重要， <br />
因为在客户程序中，可能会不断地创建以及销毁Session 对象，如果Session 的开销太大，会给系 <br />
统带来不良影响。但值得注意的是Session 对象是非线程安全的，因此在你的设计中，最好是一个 线程只创建一个Session 对象。</font><wbr> <br />
<font style="line-height: 1.3em" size="3">在Hibernate 的设计者的头脑中，他们将session 看作介于数据连接与事务管理一种中间接口。 <br />
我们可以将session 想象成一个持久对象的缓冲区，Hibernate 能检测到这些持久对象的改变，并及 时刷新数据库。我们有时也称Session 是一个持久层管理器，因为它包含这一些持久层相关的操作， <br />
诸如存储持久对象至数据库，以及从数据库从获得它们。请注意，Hibernate 的session 不同于JSP <br />
应用中的HttpSession 。当我们使用session 这个术语时，我们指的是Hibernate 中的session，而 我们以后会将HttpSesion 对象称为用户session 。</font><wbr> <br />
&nbsp;<br />
<font style="line-height: 1.3em" size="3">Transaction 接口</font><wbr> <br />
<font style="line-height: 1.3em" size="3">Transaction 接口是一个可选的API，你可以选择不使用这个接口，取而代之的是Hibernate 的 <br />
设计者自己写的底层事务处理代码。Transaction 接口是对实际事务实现的一个抽象，这些实现包 <br />
括JDBC 的事务、JTA 中的UserTransaction 、甚至可以是CORBA 事务。之所以这样设计是能让开 <br />
发者能够使用一个统一事务的操作界面，使得自己的项目可以在不同的环境和容器之间方便地移值。</font><wbr> <br />
&nbsp;<br />
<font style="line-height: 1.3em" size="3">Query 和Criteria 接口</font><wbr> <br />
<font style="line-height: 1.3em" size="3">Query 接口让你方便地对数据库及持久对象进行查询，它可以有两种表达方式：HQL 语言或本 <br />
地数据库的SQL 语句。Query 经常被用来绑定查询参数、限制查询记录数量，并最终执行查询操作。</font><wbr> <br />
<br />
<font style="line-height: 1.3em" size="3">Criteria 接口与Query 接口非常类似，它允许你创建并执行面向对象的标准化查询。</font><wbr> <br />
<font style="line-height: 1.3em" size="3">值得注意的是Query 接口也是轻量级的，它不能在Session 之外使用。</font><wbr> <br />
&nbsp;<br />
<font style="line-height: 1.3em" size="3">Callback 接口</font><wbr> <br />
<font style="line-height: 1.3em" size="3">当一些有用的事件发生时――例如持久对象的载入、存储、删除时，Callback 接口会通知 <br />
Hibernate 去接收一个通知消息。一般而言，Callback 接口在用户程序中并不是必须的，但你要在你 <br />
的项目中创建审计日志时，你可能会用到它。</font><wbr> <br />
<font style="line-height: 1.3em" size="3">一个重要的术语：Type </font><wbr><br />
<font style="line-height: 1.3em" size="3">Hibernate 的设计者们发明了一个术语：Type ，它在整个构架中是一个非常基础、有着强大功 <br />
能的元素。一个Type 对象能将一个Java 类型映射到数据库中一个表的字段中去（实际上，它可以 映射到表的多个字段中去）。持久类的所有属性都对应一个type 。这种设计思想使用Hibernate 有着 高度的灵活性和扩展性。</font><wbr> <br />
<font style="line-height: 1.3em" size="3">Hibernate 内置很多type 类型，几乎包括所有的Java 基本类型，例如Java.util.Currency 、 <br />
Java.util.calendar 、byte[] 和Java.io.Serializable 。</font><wbr> <br />
<font style="line-height: 1.3em" size="3">不仅如此， Hibernate 还支持用户自定义的type ，通过实现接口UserType 和接口 <br />
CompositeUserType ，你可以加入自己的type 。你可以利用这种特色让你的项目中使用自定义的诸 如Address 、Name 这样的type，这样你就可以获得更大的便利，让你的代码更优雅。自定义type 在Hibernate 中是一项核心特色，它的设计者鼓励你多多使用它来创建一个灵活、优雅的项目！ <br />
</font><wbr><br />
<font style="line-height: 1.3em" size="3">策略接口</font><wbr> <br />
<font style="line-height: 1.3em" size="3">Hibernate 与某些其它开源软件不同的还有一点――高度的可扩展性，这通过它的内置策略机制 来实现。当你感觉到Hibernate 的某些功能不足，或者有某些缺陷时，你可以开发一个自己的策略</font><wbr> <font style="line-height: 1.3em" size="3">来替换它，而你所要做的仅仅只是继承它的某个策略接口，然后实现你的新策略就可以了，以下是 <br />
它的策略接口： </font><wbr><br />
<font style="line-height: 1.3em" size="3">&#183; 主键的生成(IdentifierGenerator 接口) <br />
&#183; 本地SQL 语言支持(Dialect 抽象类) <br />
&#183; 缓冲机制(Cache 和CacheProvider 接口) <br />
&#183; JDBC 连接管理(ConnectionProvider 接口) <br />
&#183; 事务管理(TransactionFactory, Transaction, 和TransactionManagerLookup 接口) <br />
&#183; ORM 策略(ClassPersister 接口) <br />
&#183; 属性访问策略(PropertyAccessor 接口) <br />
&#183; 代理对象的创建(ProxyFactory 接口) <br />
Hibernate 为以上所列的机制分别创建了一个缺省的实现，因此如果你只是要增强它的某个策略 <br />
的功能的话，只需简单地继承这个类就可以了，没有必要从头开始写代码。</font><wbr> <br />
<font style="line-height: 1.3em" size="3">以上就是Hibernate 的一些核心接口，但当我们真正开始用它进行开发时，你的脑海里可能总 <br />
会有一个疑问：我是通过什么方式，并从哪里取得Session 的呢？以下我们就解答这个问题。</font><wbr> <br />
<br />
<font style="line-height: 1.3em" size="3">创建一个SessionFactory 对象</font><wbr> <br />
<font style="line-height: 1.3em" size="3">为了能创建一个SessionFactory 对象，你必须在Hibernate 初始化时创建一个Configuration <br />
类的实例，并将已写好的映射文件交由它处理。这样， Configuration 对象就可以创建一个 <br />
SessionFactory 对象，当SessionFactory 对象创建成功后，Configuration 对象就没有用了，你可以简单地抛弃它。如下是示例代码：</font><wbr> <br />
<font style="line-height: 1.3em" size="3">Configuration cfg = new Configuration(); </font><wbr><br />
<br />
<font style="line-height: 1.3em" size="3">SessionFactory sessionFactory = cfg.buildSessionFactory(); <br />
<br />
Session session=sessionFactory.openSession();</font><wbr> <br />
<br />
<font style="line-height: 1.3em" size="3">Transaction ts=session.beginTransaction();</font><wbr> <br />
<br />
<font style="line-height: 1.3em" size="3">session.save(..);</font><wbr> <br />
<br />
<font style="line-height: 1.3em" size="3">ts.commit()</font><wbr>&nbsp; 
<img src ="http://www.blogjava.net/Crying/aggbug/141926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-01 14:42 <a href="http://www.blogjava.net/Crying/articles/141926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>