﻿<?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-HelloWorld 善战者,求之于势,不责于人;故能择人而任势。-随笔分类-java - hibernate</title><link>http://www.blogjava.net/zhaochengming/category/24904.html</link><description> 知止而后有定，定而后能静，静而后能安，安而后能虑，虑而后能得。物有本末，事有终始。知所先后，则近道矣。</description><language>zh-cn</language><lastBuildDate>Wed, 27 Jul 2011 14:06:50 GMT</lastBuildDate><pubDate>Wed, 27 Jul 2011 14:06:50 GMT</pubDate><ttl>60</ttl><item><title>spring和Hibernate整合时候的asm包冲突 转自(http://apps.hi.baidu.com/share/detail/33127760)</title><link>http://www.blogjava.net/zhaochengming/archive/2011/07/25/355003.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 25 Jul 2011 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2011/07/25/355003.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/355003.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2011/07/25/355003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/355003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/355003.html</trackback:ping><description><![CDATA[<div id="app-share-content"><span style="color: rgb(255,0,0)"><span style="color: rgb(0,0,0); font-size: 12pt">
<p style="text-align: left" class="MsoNormal" align="left"></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="color: rgb(0,0,0); font-weight: bold"><span style="color: #ff6600">org.springframework.beans.factory.BeanCreationException</span>: <span style="color: #006600">Error creating bean with name 'SessionFactory' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError</span>: <span style="color: #cc0000">org.objectweb.asm.ClassVisitor.visit</span>(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)VCaused by: <span style="color: #990000">java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit</span>(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)<br /><br />网上的说法真是良莠不齐,最终找个<span style="color: #009900">能解决问题的方法</span>(折腾我一下午,快疯了)</span></p>
<p style="text-align: left" class="MsoNormal" align="left"></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="color: rgb(0,0,0); font-weight: bold">原因：</span></p>
<div></div>
<div><font size="4"><strong>在使用Spring的AOP编程时，会用到这几个lib：<br />asm-2.2.2.jar<br />asm-commons-2.2.2.jar<br />asm-util-2.2.2.jar</strong></font></div>
<div></div>
<div><font size="4"><strong>Hibernate使用如下lib：</strong></font></div>
<div></div>
<div><font size="4"><strong>asm.jar<br />asm-attrs.jar</strong></font></div>
<div>
<p><br /><font size="4"><strong>其中asm-2.2.2.jar与asm.jar存在类上的冲突！！！<br />使用其中之一或两者都使用，可能会出现如下错误：<br />java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor<br />java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor<br />java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit</strong></font></p>
<p>&nbsp;</p></div>
<div></div>
<div></div>
<div><span style="color: rgb(0,255,0); font-weight: bold"><font size="4"><font color="#000000"><span style="color: rgb(0,0,0)">解决方法</span>：</font></font><br /><br /></span><font color="#ff0000"><font size="4"><strong><font color="#000000">1.<u><font color="#800080" size="5">去掉</font></u>类路径上的关于Hibernate的3个lib</font><br />asm.jar<br />asm-attrs.jar<br />cglib-2.1.2.jar<br /><font color="#000000">2.<font color="#008080" size="5"><u>加入</u></font>Spring中的以下4个lib</font><br />asm-2.2.2.jar<br />asm-commons-2.2.2.jar<br />asm-util-2.2.2.jar<br />cglib-nodep-2.1_3.jar<br /><br /></strong></font><font color="#000000" size="4"><strong>自己的一个小测试： (运行环境：apache-tomcat-5.5.15 + .MyEclipse_5.5GA_E3.2.2 )<br /><br />整合ssh项目中, 在 Tomcat 部署的环境中 D:\tomcat\webapps\my\WEB-INF\lib 发生了点异常：同时有 <br /></strong></font><font size="4"><strong><font color="#800080">asm.jar、asm-attrs.jar、asm-2.2.3.jar 、 asm-commons-2.2.3.jar<br />asm-util-2.2.3.jar、 cglib-nodep-2.1_3.jar</font> </strong></font><font size="4"><strong><font color="#003366">在启动tomcat中不会出现异常信息。(我想asm-2.2.3jar可能在一定程度上作了改进。)<br /></font><br /><font color="#000000">当在D:\tomcat\webapps\my\WEB-INF\lib 下加入</font> cglib-2.1.3.jar <br /></strong></font><font size="4"><strong><font color="#ff6600">会报上面的java.lang.NoSuchMethodError: <br />org.objectweb.asm.ClassVisitor.visit错误信息。</font> <font color="#993366">说明cglib-2.1.3.jar与其它包发生了冲突</font>。</strong></font></font></div>
<div></div>
<div><font color="#ff0000" size="4"><strong>删除cglib-2.1.3.jar问题解决!</strong></font></div></span></span></div><img src ="http://www.blogjava.net/zhaochengming/aggbug/355003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2011-07-25 17:14 <a href="http://www.blogjava.net/zhaochengming/archive/2011/07/25/355003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 查询 </title><link>http://www.blogjava.net/zhaochengming/archive/2009/10/18/298756.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Sun, 18 Oct 2009 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2009/10/18/298756.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/298756.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2009/10/18/298756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/298756.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/298756.html</trackback:ping><description><![CDATA[<p>转自http://blog.csdn.net/ctgyp/archive/2007/12/18/1946626.aspx<br />
第 14 章 批量处理（Batch processing）<br />
使用Hibernate将 100 000 条记录插入到数据库的一个很自然的做法可能是这样的 </p>
<p>Session session = sessionFactory.openSession();<br />
Transaction tx = session.beginTransaction();<br />
for ( int i=0; i&lt;100000; i++ ) {<br />
Customer customer = new Customer(.....);<br />
session.save(customer);<br />
}<br />
tx.commit();<br />
session.close();这段程序大概运行到 50 000 条记录左右会失败并抛出 内存溢出异常（OutOfMemoryException） 。 这是因为 Hibernate 把所有新插入的 客户（Customer）实例在 session级别的缓存区进行了缓存的缘故。 </p>
<p>我们会在本章告诉你如何避免此类问题。首先，如果你要执行批量处理并且想要达到一个理想的性能， 那么使用JDBC的批量（batching）功能是至关重要。将JDBC的批量抓取数量（batch size）参数设置到一个合适值 （比如，10-50之间）： </p>
<p>hibernate.jdbc.batch_size 20你也可能想在执行批量处理时关闭二级缓存： </p>
<p>hibernate.cache.use_second_level_cache false14.1. 批量插入（Batch inserts）<br />
如果要将很多对象持久化，你必须通过经常的调用 flush() 以及稍后调用 clear() 来控制第一级缓存的大小。 </p>
<p>Session session = sessionFactory.openSession();<br />
Transaction tx = session.beginTransaction();<br />
for ( int i=0; i&lt;100000; i++ ) {<br />
Customer customer = new Customer(.....);<br />
session.save(customer);<br />
if ( i % 20 == 0 ) { //20, same as the JDBC batch size //20,与JDBC批量设置相同<br />
//flush a batch of inserts and release memory:<br />
//将本批插入的对象立即写入数据库并释放内存<br />
session.flush();<br />
session.clear();<br />
}<br />
}<br />
tx.commit();<br />
session.close();14.2. 批量更新（Batch updates）<br />
此方法同样适用于检索和更新数据。此外，在进行会返回很多行数据的查询时， 你需要使用 scroll() 方法以便充分利用服务器端游标所带来的好处。 </p>
<p>Session session = sessionFactory.openSession();<br />
Transaction tx = session.beginTransaction();<br />
ScrollableResults customers = session.getNamedQuery("GetCustomers")<br />
.setCacheMode(CacheMode.IGNORE)<br />
.scroll(ScrollMode.FORWARD_ONLY);<br />
int count=0;<br />
while ( customers.next() ) {<br />
Customer customer = (Customer) customers.get(0);<br />
customer.updateStuff(...);<br />
if ( ++count % 20 == 0 ) {<br />
//flush a batch of updates and release memory:<br />
session.flush();<br />
session.clear();<br />
}<br />
}<br />
tx.commit();<br />
session.close();14.3. 大批量更新/删除（Bulk update/delete）<br />
就像已经讨论的那样，自动和透明的 对象/关系 映射（object/relational mapping）关注于管理对象的状态。 这就意味着对象的状态存在于内存，因此直接更新或者删除 (使用 SQL 语句 UPDATE 和 DELETE) 数据库中的数据将不会影响内存中的对象状态和对象数据。 不过，Hibernate提供通过Hibernate查询语言（第 15 章 HQL: Hibernate查询语言）来执行大批 量SQL风格的（UPDATE）和（DELETE） 语句的方法。 </p>
<p>UPDATE 和 DELETE语句的语法为： ( UPDATE | DELETE ) FROM? ClassName (WHERE WHERE_CONDITIONS)?。 有几点说明： </p>
<p>在FROM子句（from-clause）中，FROM关键字是可选的 </p>
<p>在FROM子句（from-clause）中只能有一个类名，并且它不能有别名 </p>
<p>不能在大批量HQL语句中使用连接（显式或者隐式的都不行）。不过在WHERE子句中可以使用子查询。 </p>
<p>整个WHERE子句是可选的。 </p>
<p>举个例子，使用Query.executeUpdate()方法执行一个HQL UPDATE语句： </p>
<p>Session session = sessionFactory.openSession();<br />
Transaction tx = session.beginTransaction();<br />
String hqlUpdate = "update Customer set name = :newName where name = :oldName";<br />
int updatedEntities = s.createQuery( hqlUpdate )<br />
.setString( "newName", newName )<br />
.setString( "oldName", oldName )<br />
.executeUpdate();<br />
tx.commit();<br />
session.close();执行一个HQL DELETE，同样使用 Query.executeUpdate() 方法 （此方法是为 那些熟悉JDBC PreparedStatement.executeUpdate() 的人们而设定的） </p>
<p>Session session = sessionFactory.openSession();<br />
Transaction tx = session.beginTransaction();<br />
String hqlDelete = "delete Customer where name = :oldName";<br />
int deletedEntities = s.createQuery( hqlDelete )<br />
.setString( "oldName", oldName )<br />
.executeUpdate();<br />
tx.commit();<br />
session.close();由Query.executeUpdate()方法返回的整型值表明了受此操作影响的记录数量。 注意这个数值可能与数据库中被（最后一条SQL语句）影响了的&#8220;行&#8221;数有关，也可能没有。一个大批量HQL操作可能导致多条实际的SQL语句被执行， 举个例子，对joined-subclass映射方式的类进行的此类操作。这个返回值代表了实际被语句影响了的记录数量。在那个joined-subclass的例子中， 对一个子类的删除实际上可能不仅仅会删除子类映射到的表而且会影响&#8220;根&#8221;表，还有可能影响与之有继承关系的joined-subclass映射方式的子类的表。 </p>
<p>注意，上述大批量HQL操作的少数限制会在新版本中得到改进；进一步详细信息请参考JIRA里的路线图(roadmap)。 </p>
<p>第 15 章 HQL: Hibernate查询语言<br />
Hibernate配备了一种非常强大的查询语言，这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑，HQL是非常有意识的被设计为完全面向对象的查询，它可以理解如继承、多态 和关联之类的概念。 </p>
<p>15.1. 大小写敏感性问题<br />
除了Java类与属性的名称外，查询语句对大小写并不敏感。 所以 SeLeCT 与 sELEct 以及 SELECT 是相同的，但是 org.hibernate.eg.FOO 并不等价于 org.hibernate.eg.Foo 并且 foo.barSet 也不等价于 foo.BARSET。 </p>
<p>本手册中的HQL关键字将使用小写字母. 很多用户发现使用完全大写的关键字会使查询语句 的可读性更强, 但我们发现，当把查询语句嵌入到Java语句中的时候使用大写关键字比较难看。 </p>
<p>15.2. from子句<br />
Hibernate中最简单的查询语句的形式如下： </p>
<p>from eg.Cat该子句简单的返回eg.Cat类的所有实例。 通常我们不需要使用类的全限定名, 因为 auto-import（自动引入） 是缺省的情况。 所以我们几乎只使用如下的简单写法： </p>
<p>from Cat大多数情况下, 你需要指定一个别名, 原因是你可能需要 在查询语句的其它部分引用到Cat </p>
<p>from Cat as cat这个语句把别名cat指定给类Cat 的实例, 这样我们就可以在随后的查询中使用此别名了。 关键字as 是可选的，我们也可以这样写: </p>
<p>from Cat cat子句中可以同时出现多个类, 其查询结果是产生一个笛卡儿积或产生跨表的连接。 </p>
<p>from Formula, Parameterfrom Formula as form, Parameter as param查询语句中别名的开头部分小写被认为是实践中的好习惯， 这样做与Java变量的命名标准保持了一致 (比如，domesticCat)。 </p>
<p>15.3. 关联(Association)与连接(Join)<br />
我们也可以为相关联的实体甚至是对一个集合中的全部元素指定一个别名, 这时要使用关键字join。 </p>
<p>from Cat as cat<br />
inner join cat.mate as mate<br />
left outer join cat.kittens as kittenfrom Cat as cat left join cat.mate.kittens as kittensfrom Formula form full join form.parameter param受支持的连接类型是从ANSI SQL中借鉴来的。 </p>
<p>inner join（内连接） </p>
<p>left outer join（左外连接） </p>
<p>right outer join（右外连接） </p>
<p>full join (全连接，并不常用) </p>
<p>语句inner join, left outer join 以及 right outer join 可以简写。 </p>
<p>from Cat as cat<br />
join cat.mate as mate<br />
left join cat.kittens as kitten还有，一个"fetch"连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化，这种方法在使用到集合的情况下尤其有用，对于关联和集合来说，它有效的代替了映射文件中的外联接 与延迟声明（lazy declarations）. 查看 第 20.1 节 &#8220; 抓取策略(Fetching strategies) &#8221; 以获得等多的信息。 </p>
<p>from Cat as cat<br />
inner join fetch cat.mate<br />
left join fetch cat.kittens一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在 where 子句 (或其它任何子句)中。同时，相关联的对象 并不在查询的结果中直接返回，但可以通过他们的父对象来访问到他们。 </p>
<p>注意fetch构造变量在使用了scroll() 或 iterate()函数 的查询中是不能使用的。最后注意，使用full join fetch 与 right join fetch是没有意义的。 </p>
<p>如果你使用属性级别的延迟获取（lazy fetching）（这是通过重新编写字节码实现的），可以使用 fetch all properties 来强制Hibernate立即取得那些原本需要延迟加载的属性（在第一个查询中）。 </p>
<p>from Document fetch all properties order by namefrom Document doc fetch all properties where lower(doc.name) like '%cats%'15.4. select子句<br />
select 子句选择将哪些对象与属性返 回到查询结果集中. 考虑如下情况: </p>
<p>select mate<br />
from Cat as cat<br />
inner join cat.mate as mate该语句将选择mates of other Cats。（其他猫的配偶） 实际上, 你可以更简洁的用以下的查询语句表达相同的含义: </p>
<p>select cat.mate from Cat cat查询语句可以返回值为任何类型的属性，包括返回类型为某种组件(Component)的属性: </p>
<p>select cat.name from DomesticCat cat<br />
where cat.name like 'fri%'select cust.name.firstName from Customer as cust查询语句可以返回多个对象和（或）属性，存放在 Object[]队列中, </p>
<p>select mother, offspr, mate.name<br />
from DomesticCat as mother<br />
inner join mother.mate as mate<br />
left outer join mother.kittens as offspr或存放在一个List对象中, </p>
<p>select new list(mother, offspr, mate.name)<br />
from DomesticCat as mother<br />
inner join mother.mate as mate<br />
left outer join mother.kittens as offspr也可能直接返回一个实际的类型安全的Java对象, </p>
<p>select new Family(mother, mate, offspr)<br />
from DomesticCat as mother<br />
join mother.mate as mate<br />
left join mother.kittens as offspr假设类Family有一个合适的构造函数. </p>
<p>你可以使用关键字as给&#8220;被选择了的表达式&#8221;指派别名: </p>
<p>select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n<br />
from Cat cat这种做法在与子句select new map一起使用时最有用: </p>
<p>select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )<br />
from Cat cat该查询返回了一个Map的对象，内容是别名与被选择的值组成的名-值映射。 </p>
<p>15.5. 聚集函数<br />
HQL查询甚至可以返回作用于属性之上的聚集函数的计算结果: </p>
<p>select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)<br />
from Cat cat受支持的聚集函数如下： </p>
<p>avg(...), sum(...), min(...), max(...) </p>
<p>count(*) </p>
<p>count(...), count(distinct ...), count(all...) </p>
<p>你可以在选择子句中使用数学操作符、连接以及经过验证的SQL函数： </p>
<p>select cat.weight + sum(kitten.weight)<br />
from Cat cat<br />
join cat.kittens kitten<br />
group by cat.id, cat.weightselect firstName||' '||initial||' '||upper(lastName) from Person关键字distinct与all 也可以使用，它们具有与SQL相同的语义. </p>
<p>select distinct cat.name from Cat cat<br />
select count(distinct cat.name), count(cat) from Cat cat15.6. 多态查询<br />
一个如下的查询语句: </p>
<p>from Cat as cat不仅返回Cat类的实例, 也同时返回子类 DomesticCat的实例. Hibernate 可以在from子句中指定任何 Java 类或接口. 查询会返回继承了该类的所有持久化子类 的实例或返回声明了该接口的所有持久化类的实例。下面的查询语句返回所有的被持久化的对象： </p>
<p>from java.lang.Object o接口Named 可能被各种各样的持久化类声明： </p>
<p>from Named n, Named m where n.name = m.name注意，最后的两个查询将需要超过一个的SQL SELECT.这表明order by子句 没有对整个结果集进行正确的排序. (这也说明你不能对这样的查询使用Query.scroll()方法.) </p>
<p>15.7. where子句<br />
where子句允许你将返回的实例列表的范围缩小. 如果没有指定别名，你可以使用属性名来直接引用属性: </p>
<p>from Cat where name='Fritz'如果指派了别名，需要使用完整的属性名: </p>
<p>from Cat as cat where cat.name='Fritz'返回名为（属性name等于）'Fritz'的Cat类的实例。 </p>
<p>select foo<br />
from Foo foo, Bar bar<br />
where foo.startDate = bar.date将返回所有满足下面条件的Foo类的实例： 存在如下的bar的一个实例，其date属性等于 Foo的startDate属性。 复合路径表达式使得where子句非常的强大，考虑如下情况： </p>
<p>from Cat cat where cat.mate.name is not null该查询将被翻译成为一个含有表连接（内连接）的SQL查询。如果你打算写像这样的查询语句 </p>
<p>from Foo foo<br />
where foo.bar.baz.customer.address.city is not null在SQL中，你为达此目的将需要进行一个四表连接的查询。 </p>
<p>=运算符不仅可以被用来比较属性的值，也可以用来比较实例： </p>
<p>from Cat cat, Cat rival where cat.mate = rival.mateselect cat, mate<br />
from Cat cat, Cat mate<br />
where cat.mate = mate特殊属性（小写）id可以用来表示一个对象的唯一的标识符。（你也可以使用该对象的属性名。） </p>
<p>from Cat as cat where cat.id = 123<br />
from Cat as cat where cat.mate.id = 69第二个查询是有效的。此时不需要进行表连接！ </p>
<p>同样也可以使用复合标识符。比如Person类有一个复合标识符，它由country属性 与medicareNumber属性组成。 </p>
<p>from bank.Person person<br />
where person.id.country = 'AU'<br />
and person.id.medicareNumber = 123456from bank.Account account<br />
where account.owner.id.country = 'AU'<br />
and account.owner.id.medicareNumber = 123456第二个查询也不需要进行表连接。 </p>
<p>同样的，特殊属性class在进行多态持久化的情况下被用来存取一个实例的鉴别值（discriminator value）。 一个嵌入到where子句中的Java类的名字将被转换为该类的鉴别值。 </p>
<p>from Cat cat where cat.class = DomesticCat你也可以声明一个属性的类型是组件或者复合用户类型（以及由组件构成的组件等等）。永远不要尝试使用以组件类型来结尾的路径表达式（path-expression） （与此相反，你应当使用组件的一个属性来结尾）。 举例来说，如果store.owner含有一个包含了组件的实体address </p>
<p>store.owner.address.city&nbsp;&nbsp;&nbsp; // 正确<br />
store.owner.address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 错误!一个&#8220;任意&#8221;类型有两个特殊的属性id和class, 来允许我们按照下面的方式表达一个连接（AuditLog.item 是一个属性，该属性被映射为&lt;any&gt;）。 </p>
<p>from AuditLog log, Payment payment<br />
where log.item.class = 'Payment' and log.item.id = payment.id注意，在上面的查询与句中，log.item.class 和 payment.class 将涉及到完全不同的数据库中的列。 </p>
<p>15.8. 表达式<br />
在where子句中允许使用的表达式包括 大多数你可以在SQL使用的表达式种类: </p>
<p>数学运算符+, -, *, / </p>
<p>二进制比较运算符=, &gt;=, &lt;=, &lt;&gt;, !=, like </p>
<p>逻辑运算符and, or, not </p>
<p>in, not in, between, is null, is not null, is empty, is not empty, member of and not member of </p>
<p>"简单的" case, case ... when ... then ... else ... end,和 "搜索" case, case when ... then ... else ... end </p>
<p>字符串连接符...||... or concat(...,...) </p>
<p>current_date(), current_time(), current_timestamp() </p>
<p>second(...), minute(...), hour(...), day(...), month(...), year(...), </p>
<p>EJB-QL 3.0定义的任何函数或操作：substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length() </p>
<p>coalesce() 和 nullif() </p>
<p>cast(... as ...), 其第二个参数是某Hibernate类型的名字，以及extract(... from ...)，只要ANSI cast() 和 extract() 被底层数据库支持 </p>
<p>任何数据库支持的SQL标量函数，比如sign(), trunc(), rtrim(), sin() </p>
<p>JDBC参数传入 ? </p>
<p>命名参数:name, :start_date, :x1 </p>
<p>SQL 直接常量 'foo', 69, '1970-01-01 10:00:01.0' </p>
<p>Java public static final 类型的常量 eg.Color.TABBY </p>
<p>关键字in与between可按如下方法使用: </p>
<p>from DomesticCat cat where cat.name between 'A' and 'B'from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )而且否定的格式也可以如下书写： </p>
<p>from DomesticCat cat where cat.name not between 'A' and 'B'from DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )同样, 子句is null与is not null可以被用来测试空值(null). </p>
<p>在Hibernate配置文件中声明HQL&#8220;查询替代（query substitutions）&#8221;之后， 布尔表达式（Booleans）可以在其他表达式中轻松的使用: </p>
<p>&lt;property name="hibernate.query.substitutions"&gt;true 1, false 0&lt;/property&gt;系统将该HQL转换为SQL语句时，该设置表明将用字符 1 和 0 来 取代关键字true 和 false: </p>
<p>from Cat cat where cat.alive = true你可以用特殊属性size, 或是特殊函数size()测试一个集合的大小。 </p>
<p>from Cat cat where cat.kittens.size &gt; 0from Cat cat where size(cat.kittens) &gt; 0对于索引了（有序）的集合，你可以使用minindex 与 maxindex函数来引用到最小与最大的索引序数。 同理，你可以使用minelement 与 maxelement函数来 引用到一个基本数据类型的集合中最小与最大的元素。 </p>
<p>from Calendar cal where maxelement(cal.holidays) &gt; current datefrom Order order where maxindex(order.items) &gt; 100from Order order where minelement(order.items) &gt; 10000在传递一个集合的索引集或者是元素集(elements与indices 函数) 或者传递一个子查询的结果的时候，可以使用SQL函数any, some, all, exists, in </p>
<p>select mother from Cat as mother, Cat as kit<br />
where kit in elements(foo.kittens)select p from NameList list, Person p<br />
where p.name = some elements(list.names)from Cat cat where exists elements(cat.kittens)from Player p where 3 &gt; all elements(p.scores)from Show show where 'fizard' in indices(show.acts)注意，在Hibernate3种，这些结构变量- size, elements, indices, minindex, maxindex, minelement, maxelement - 只能在where子句中使用。 </p>
<p>一个被索引过的（有序的）集合的元素(arrays, lists, maps)可以在其他索引中被引用（只能在where子句中）： </p>
<p>from Order order where order.items[0].id = 1234select person from Person person, Calendar calendar<br />
where calendar.holidays['national day'] = person.birthDay<br />
and person.nationality.calendar = calendarselect item from Item item, Order order<br />
where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11select item from Item item, Order order<br />
where order.items[ maxindex(order.items) ] = item and order.id = 11在[]中的表达式甚至可以是一个算数表达式。 </p>
<p>select item from Item item, Order order<br />
where order.items[ size(order.items) - 1 ] = item对于一个一对多的关联（one-to-many association）或是值的集合中的元素， HQL也提供内建的index()函数， </p>
<p>select item, index(item) from Order order<br />
join order.items item<br />
where index(item) &lt; 5如果底层数据库支持标量的SQL函数，它们也可以被使用 </p>
<p>from DomesticCat cat where upper(cat.name) like 'FRI%'如果你还不能对所有的这些深信不疑，想想下面的查询。如果使用SQL，语句长度会增长多少，可读性会下降多少： </p>
<p>select cust<br />
from Product prod,<br />
Store store<br />
inner join store.customers cust<br />
where prod.name = 'widget'<br />
and store.location.name in ( 'Melbourne', 'Sydney' )<br />
and prod = all elements(cust.currentOrder.lineItems)提示: 会像如下的语句 </p>
<p>SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order<br />
FROM customers cust,<br />
stores store,<br />
locations loc,<br />
store_customers sc,<br />
product prod<br />
WHERE prod.name = 'widget'<br />
AND store.loc_id = loc.id<br />
AND loc.name IN ( 'Melbourne', 'Sydney' )<br />
AND sc.store_id = store.id<br />
AND sc.cust_id = cust.id<br />
AND prod.id = ALL(<br />
SELECT item.prod_id<br />
FROM line_items item, orders o<br />
WHERE item.order_id = o.id<br />
AND cust.current_order = o.id<br />
)15.9. order by子句<br />
查询返回的列表(list)可以按照一个返回的类或组件（components)中的任何属性（property）进行排序： </p>
<p>from DomesticCat cat<br />
order by cat.name asc, cat.weight desc, cat.birthdate可选的asc或desc关键字指明了按照升序或降序进行排序. </p>
<p>15.10. group by子句<br />
一个返回聚集值(aggregate values)的查询可以按照一个返回的类或组件（components)中的任何属性（property）进行分组： </p>
<p>select cat.color, sum(cat.weight), count(cat)<br />
from Cat cat<br />
group by cat.colorselect foo.id, avg(name), max(name)<br />
from Foo foo join foo.names name<br />
group by foo.idhaving子句在这里也允许使用. </p>
<p>select cat.color, sum(cat.weight), count(cat)<br />
from Cat cat<br />
group by cat.color<br />
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)如果底层的数据库支持的话(例如不能在MySQL中使用)，SQL的一般函数与聚集函数也可以出现 在having与order by 子句中。 </p>
<p>select cat<br />
from Cat cat<br />
join cat.kittens kitten<br />
group by cat<br />
having avg(kitten.weight) &gt; 100<br />
order by count(kitten) asc, sum(kitten.weight) desc注意group by子句与 order by子句中都不能包含算术表达式（arithmetic expressions）. </p>
<p>15.11. 子查询<br />
对于支持子查询的数据库，Hibernate支持在查询中使用子查询。一个子查询必须被圆括号包围起来（经常是SQL聚集函数的圆括号）。 甚至相互关联的子查询（引用到外部查询中的别名的子查询）也是允许的。 </p>
<p>from Cat as fatcat<br />
where fatcat.weight &gt; (<br />
select avg(cat.weight) from DomesticCat cat<br />
)from DomesticCat as cat<br />
where cat.name = some (<br />
select name.nickName from Name as name<br />
)from Cat as cat<br />
where not exists (<br />
from Cat as mate where mate.mate = cat<br />
)from DomesticCat as cat<br />
where cat.name not in (<br />
select name.nickName from Name as name<br />
)在select列表中包含一个表达式以上的子查询，你可以使用一个元组构造符（tuple constructors）： </p>
<p>from Cat as cat<br />
where not ( cat.name, cat.color ) in (<br />
select cat.name, cat.color from DomesticCat cat<br />
)注意在某些数据库中（不包括Oracle与HSQL），你也可以在其他语境中使用元组构造符， 比如查询用户类型的组件与组合： </p>
<p>from Person where name = ('Gavin', 'A', 'King')该查询等价于更复杂的： </p>
<p>from Person where name.first = 'Gavin' and name.initial = 'A' and name.last = 'King')有两个很好的理由使你不应当作这样的事情：首先，它不完全适用于各个数据库平台；其次，查询现在依赖于映射文件中属性的顺序。 </p>
<p>15.12. HQL示例<br />
Hibernate查询可以非常的强大与复杂。实际上，Hibernate的一个主要卖点就是查询语句的威力。这里有一些例子，它们与我在最近的 一个项目中使用的查询非常相似。注意你能用到的大多数查询比这些要简单的多！ </p>
<p>下面的查询对于某个特定的客户的所有未支付的账单，在给定给最小总价值的情况下，返回订单的id，条目的数量和总价值， 返回值按照总价值的结果进行排序。为了决定价格，查询使用了当前目录。作为转换结果的SQL查询，使用了ORDER, ORDER_LINE, PRODUCT, CATALOG 和PRICE 库表。 </p>
<p>select order.id, sum(price.amount), count(item)<br />
from Order as order<br />
join order.lineItems as item<br />
join item.product as product,<br />
Catalog as catalog<br />
join catalog.prices as price<br />
where order.paid = false<br />
and order.customer = :customer<br />
and price.product = product<br />
and catalog.effectiveDate &lt; sysdate<br />
and catalog.effectiveDate &gt;= all (<br />
select cat.effectiveDate<br />
from Catalog as cat<br />
where cat.effectiveDate &lt; sysdate<br />
)<br />
group by order<br />
having sum(price.amount) &gt; :minAmount<br />
order by sum(price.amount) desc这简直是一个怪物！实际上，在现实生活中，我并不热衷于子查询，所以我的查询语句看起来更像这个： </p>
<p>select order.id, sum(price.amount), count(item)<br />
from Order as order<br />
join order.lineItems as item<br />
join item.product as product,<br />
Catalog as catalog<br />
join catalog.prices as price<br />
where order.paid = false<br />
and order.customer = :customer<br />
and price.product = product<br />
and catalog = :currentCatalog<br />
group by order<br />
having sum(price.amount) &gt; :minAmount<br />
order by sum(price.amount) desc下面一个查询计算每一种状态下的支付的数目，除去所有处于AWAITING_APPROVAL状态的支付，因为在该状态下 当前的用户作出了状态的最新改变。该查询被转换成含有两个内连接以及一个相关联的子选择的SQL查询，该查询使用了表 PAYMENT, PAYMENT_STATUS 以及 PAYMENT_STATUS_CHANGE。 </p>
<p>select count(payment), status.name<br />
from Payment as payment<br />
join payment.currentStatus as status<br />
join payment.statusChanges as statusChange<br />
where payment.status.name &lt;&gt; PaymentStatus.AWAITING_APPROVAL<br />
or (<br />
statusChange.timeStamp = (<br />
select max(change.timeStamp)<br />
from PaymentStatusChange change<br />
where change.payment = payment<br />
)<br />
and statusChange.user &lt;&gt; :currentUser<br />
)<br />
group by status.name, status.sortOrder<br />
order by status.sortOrder如果我把statusChanges实例集映射为一个列表（list）而不是一个集合（set）, 书写查询语句将更加简单. </p>
<p>select count(payment), status.name<br />
from Payment as payment<br />
join payment.currentStatus as status<br />
where payment.status.name &lt;&gt; PaymentStatus.AWAITING_APPROVAL<br />
or payment.statusChanges[ maxIndex(payment.statusChanges) ].user &lt;&gt; :currentUser<br />
group by status.name, status.sortOrder<br />
order by status.sortOrder下面一个查询使用了MS SQL Server的 isNull()函数用以返回当前用户所属组织的组织帐号及组织未支付的账。 它被转换成一个对表ACCOUNT, PAYMENT, PAYMENT_STATUS, ACCOUNT_TYPE, ORGANIZATION 以及 ORG_USER进行的三个内连接， 一个外连接和一个子选择的SQL查询。 </p>
<p>select account, payment<br />
from Account as account<br />
left outer join account.payments as payment<br />
where :currentUser in elements(account.holder.users)<br />
and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)<br />
order by account.type.sortOrder, account.accountNumber, payment.dueDate对于一些数据库，我们需要弃用（相关的）子选择。 </p>
<p>select account, payment<br />
from Account as account<br />
join account.holder.users as user<br />
left outer join account.payments as payment<br />
where :currentUser = user<br />
and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)<br />
order by account.type.sortOrder, account.accountNumber, payment.dueDate15.13. 批量的UPDATE &amp; DELETE语句<br />
HQL现在支持UPDATE与DELETE语句. 查阅 第 14.3 节 &#8220;大批量更新/删除（Bulk update/delete）&#8221; 以获得更多信息。 </p>
<p>15.14. 小技巧 &amp; 小窍门<br />
你可以统计查询结果的数目而不必实际的返回他们： </p>
<p>( (Integer) session.iterate("select count(*) from ....").next() ).intValue()若想根据一个集合的大小来进行排序，可以使用如下的语句： </p>
<p>select usr.id, usr.name<br />
from User as usr<br />
left join usr.messages as msg<br />
group by usr.id, usr.name<br />
order by count(msg)如果你的数据库支持子选择，你可以在你的查询的where子句中为选择的大小（selection size）指定一个条件: </p>
<p>from User usr where size(usr.messages) &gt;= 1如果你的数据库不支持子选择语句，使用下面的查询： </p>
<p>select usr.id, usr.name<br />
from User usr.name<br />
join usr.messages msg<br />
group by usr.id, usr.name<br />
having count(msg) &gt;= 1因为内连接（inner join）的原因，这个解决方案不能返回含有零个信息的User 类的实例, 所以这种情况下使用下面的格式将是有帮助的: </p>
<p>select usr.id, usr.name<br />
from User as usr<br />
left join usr.messages as msg<br />
group by usr.id, usr.name<br />
having count(msg) = 0JavaBean的属性可以被绑定到一个命名查询（named query）的参数上： </p>
<p>Query q = s.createQuery("from foo Foo as foo where foo.name=:name and foo.size=:size");<br />
q.setProperties(fooBean); // fooBean包含方法getName()与getSize()<br />
List foos = q.list();通过将接口Query与一个过滤器（filter）一起使用，集合（Collections）是可以分页的： </p>
<p>Query q = s.createFilter( collection, "" ); // 一个简单的过滤器<br />
q.setMaxResults(PAGE_SIZE);<br />
q.setFirstResult(PAGE_SIZE * pageNumber);<br />
List page = q.list();通过使用查询过滤器（query filter）可以将集合（Collection）的原素分组或排序: </p>
<p>Collection orderedCollection = s.filter( collection, "order by this.amount" );<br />
Collection counts = s.filter( collection, "select this.type, count(this) group by this.type" );不用通过初始化，你就可以知道一个集合（Collection）的大小： </p>
<p>( (Integer) session.iterate("select count(*) from ....").next() ).intValue();第 16 章&nbsp; 条件查询(Criteria Queries) <br />
具有一个直观的、可扩展的条件查询API是Hibernate的特色。 </p>
<p>16.1. 创建一个Criteria 实例<br />
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。 </p>
<p>Criteria crit = sess.createCriteria(Cat.class);<br />
crit.setMaxResults(50);<br />
List cats = crit.list();16.2. 限制结果集内容<br />
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。 </p>
<p>List cats = sess.createCriteria(Cat.class)<br />
.add( Restrictions.like("name", "Fritz%") )<br />
.add( Restrictions.between("weight", minWeight, maxWeight) )<br />
.list();约束可以按逻辑分组。 </p>
<p>List cats = sess.createCriteria(Cat.class)<br />
.add( Restrictions.like("name", "Fritz%") )<br />
.add( Restrictions.or(<br />
Restrictions.eq( "age", new Integer(0) ),<br />
Restrictions.isNull("age")<br />
) )<br />
.list();List cats = sess.createCriteria(Cat.class)<br />
.add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )<br />
.add( Restrictions.disjunction()<br />
.add( Restrictions.isNull("age") )<br />
.add( Restrictions.eq("age", new Integer(0) ) )<br />
.add( Restrictions.eq("age", new Integer(1) ) )<br />
.add( Restrictions.eq("age", new Integer(2) ) )<br />
) )<br />
.list();Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。 </p>
<p>List cats = sess.createCriteria(Cat.class)<br />
.add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) )<br />
.list();{alias}占位符应当被替换为被查询实体的列别名。 </p>
<p>Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。 </p>
<p>Property age = Property.forName("age");<br />
List cats = sess.createCriteria(Cat.class)<br />
.add( Restrictions.disjunction()<br />
.add( age.isNull() )<br />
.add( age.eq( new Integer(0) ) )<br />
.add( age.eq( new Integer(1) ) )<br />
.add( age.eq( new Integer(2) ) )<br />
) )<br />
.add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )<br />
.list();16.3. 结果集排序<br />
你可以使用org.hibernate.criterion.Order来为查询结果排序。 </p>
<p>List cats = sess.createCriteria(Cat.class)<br />
.add( Restrictions.like("name", "F%")<br />
.addOrder( Order.asc("name") )<br />
.addOrder( Order.desc("age") )<br />
.setMaxResults(50)<br />
.list();List cats = sess.createCriteria(Cat.class)<br />
.add( Property.forName("name").like("F%") )<br />
.addOrder( Property.forName("name").asc() )<br />
.addOrder( Property.forName("age").desc() )<br />
.setMaxResults(50)<br />
.list();16.4. 关联<br />
你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。 </p>
<p>List cats = sess.createCriteria(Cat.class)<br />
.add( Restrictions.like("name", "F%")<br />
.createCriteria("kittens")<br />
.add( Restrictions.like("name", "F%")<br />
.list();注意第二个 createCriteria()返回一个新的 Criteria实例，该实例引用kittens 集合中的元素。 </p>
<p>接下来，替换形态在某些情况下也是很有用的。 </p>
<p>List cats = sess.createCriteria(Cat.class)<br />
.createAlias("kittens", "kt")<br />
.createAlias("mate", "mt")<br />
.add( Restrictions.eqProperty("kt.name", "mt.name") )<br />
.list();(createAlias()并不创建一个新的 Criteria实例。) </p>
<p>Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens， 你必须使用returnMaps()。 </p>
<p>List cats = sess.createCriteria(Cat.class)<br />
.createCriteria("kittens", "kt")<br />
.add( Restrictions.eq("name", "F%") )<br />
.returnMaps()<br />
.list();<br />
Iterator iter = cats.iterator();<br />
while ( iter.hasNext() ) {<br />
Map map = (Map) iter.next();<br />
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);<br />
Cat kitten = (Cat) map.get("kt");<br />
}16.5. 动态关联抓取<br />
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。 </p>
<p>List cats = sess.createCriteria(Cat.class)<br />
.add( Restrictions.like("name", "Fritz%") )<br />
.setFetchMode("mate", FetchMode.EAGER)<br />
.setFetchMode("kittens", FetchMode.EAGER)<br />
.list();这个查询可以通过外连接抓取mate和kittens。 查看第 20.1 节 &#8220; 抓取策略(Fetching strategies) &#8221;可以获得更多信息。 </p>
<p>16.6. 查询示例<br />
org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。 </p>
<p>Cat cat = new Cat();<br />
cat.setSex('F');<br />
cat.setColor(Color.BLACK);<br />
List results = session.createCriteria(Cat.class)<br />
.add( Example.create(cat) )<br />
.list();版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。 </p>
<p>你可以自行调整Example使之更实用。 </p>
<p>Example example = Example.create(cat)<br />
.excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //exclude zero valued properties<br />
.excludeProperty("color")&nbsp; //exclude the property named "color"<br />
.ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //perform case insensitive string comparisons<br />
.enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //use like for string comparisons<br />
List results = session.createCriteria(Cat.class)<br />
.add(example)<br />
.list();你甚至可以使用examples在关联对象上放置条件。 </p>
<p>List results = session.createCriteria(Cat.class)<br />
.add( Example.create(cat) )<br />
.createCriteria("mate")<br />
.add( Example.create( cat.getMate() ) )<br />
.list();16.7. 投影(Projections)、聚合（aggregation）和分组（grouping）<br />
org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。 </p>
<p>List results = session.createCriteria(Cat.class)<br />
.setProjection( Projections.rowCount() )<br />
.add( Restrictions.eq("color", Color.BLACK) )<br />
.list();List results = session.createCriteria(Cat.class)<br />
.setProjection( Projections.projectionList()<br />
.add( Projections.rowCount() )<br />
.add( Projections.avg("weight") )<br />
.add( Projections.max("weight") )<br />
.add( Projections.groupProperty("color") )<br />
)<br />
.list();在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影，他们也出现在SQL的group by子句中。 </p>
<p>你可以选择把一个别名指派给一个投影，这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式： </p>
<p>List results = session.createCriteria(Cat.class)<br />
.setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )<br />
.addOrder( Order.asc("colr") )<br />
.list();List results = session.createCriteria(Cat.class)<br />
.setProjection( Projections.groupProperty("color").as("colr") )<br />
.addOrder( Order.asc("colr") )<br />
.list();alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之，当你添加一个投影到一个投影列表中时 你可以为它指定一个别名： </p>
<p>List results = session.createCriteria(Cat.class)<br />
.setProjection( Projections.projectionList()<br />
.add( Projections.rowCount(), "catCountByColor" )<br />
.add( Projections.avg("weight"), "avgWeight" )<br />
.add( Projections.max("weight"), "maxWeight" )<br />
.add( Projections.groupProperty("color"), "color" )<br />
)<br />
.addOrder( Order.desc("catCountByColor") )<br />
.addOrder( Order.desc("avgWeight") )<br />
.list();List results = session.createCriteria(Domestic.class, "cat")<br />
.createAlias("kittens", "kit")<br />
.setProjection( Projections.projectionList()<br />
.add( Projections.property("cat.name"), "catName" )<br />
.add( Projections.property("kit.name"), "kitName" )<br />
)<br />
.addOrder( Order.asc("catName") )<br />
.addOrder( Order.asc("kitName") )<br />
.list();你也可以使用Property.forName()来表示投影： </p>
<p>List results = session.createCriteria(Cat.class)<br />
.setProjection( Property.forName("name") )<br />
.add( Property.forName("color").eq(Color.BLACK) )<br />
.list();List results = session.createCriteria(Cat.class)<br />
.setProjection( Projections.projectionList()<br />
.add( Projections.rowCount().as("catCountByColor") )<br />
.add( Property.forName("weight").avg().as("avgWeight") )<br />
.add( Property.forName("weight").max().as("maxWeight") )<br />
.add( Property.forName("color").group().as("color" )<br />
)<br />
.addOrder( Order.desc("catCountByColor") )<br />
.addOrder( Order.desc("avgWeight") )<br />
.list();16.8. 离线(detached)查询和子查询<br />
DetachedCriteria类使你在一个session范围之外创建一个查询，并且可以使用任意的 Session来执行它。 </p>
<p>DetachedCriteria query = DetachedCriteria.forClass(Cat.class)<br />
.add( Property.forName("sex").eq('F') );<br />
Session session = ....;<br />
Transaction txn = session.beginTransaction();<br />
List results = query.getExecutableCriteria(session).setMaxResults(100).list();<br />
txn.commit();<br />
session.close();DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。 </p>
<p>DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)<br />
.setProjection( Property.forName("weight").avg() );<br />
session.createCriteria(Cat.class)<br />
.add( Property.forName("weight).gt(avgWeight) )<br />
.list();DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)<br />
.setProjection( Property.forName("weight") );<br />
session.createCriteria(Cat.class)<br />
.add( Subqueries.geAll("weight", weights) )<br />
.list();甚至相互关联的子查询也是有可能的： </p>
<p>DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")<br />
.setProjection( Property.forName("weight").avg() )<br />
.add( Property.forName("cat2.sex").eqProperty("cat.sex") );<br />
session.createCriteria(Cat.class, "cat")<br />
.add( Property.forName("weight).gt(avgWeightForSex) )<br />
.list();第 17 章 Native SQL查询<br />
你也可以使用你的数据库的Native SQL语言来查询数据。这对你在要使用数据库的某些特性的时候(比如说在查询提示或者Oracle中的 CONNECT关键字)，这是非常有用的。这就能够扫清你把原来直接使用SQL/JDBC 的程序迁移到基于 Hibernate应用的道路上的障碍。 </p>
<p>Hibernate3允许你使用手写的sql来完成所有的create,update,delete,和load操作（包括存储过程） </p>
<p>17.1. 创建一个基于SQL的Query<br />
SQL查询是通过SQLQuery接口来控制的，它是通过调用Session.createSQLQuery()方法来获得 </p>
<p>List cats = sess.createSQLQuery("select {cat.*} from cats cat")<br />
.addEntity("cat", Cat.class);<br />
.setMaxResults(50);<br />
.list();这个查询指定了: </p>
<p>SQL查询语句，它带一个占位符，可以让Hibernate使用字段的别名. </p>
<p>查询返回的实体，和它的SQL表的别名. </p>
<p>addEntity()方法将SQL表的别名和实体类联系起来，并且确定查询结果集的形态。 </p>
<p>addJoin()方法可以被用于载入其他的实体和集合的关联，TODO:examples! </p>
<p>原生的SQL查询可能返回一个简单的标量值或者一个标量和实体的结合体。 </p>
<p>Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")<br />
.addScalar("maxWeight", Hibernate.DOUBLE);<br />
.uniqueResult();17.2. 别名和属性引用<br />
上面使用的{cat.*}标记是 "所有属性" 的简写.你可以显式地列出需要的字段,但是你必须让Hibernate 为每一个属性注入字段的别名.这些字段的站位符是以字段别名为前导,再加上属性名.在下面的例子里,我们从一个其他的表(cat_log) 中获取Cat对象,而非Cat对象原本在映射元数据中声明的表.注意我们甚至在where子句中也可以使用属性别名. 对于命名查询,{}语法并不是必需的.你可以在第 17.3 节 &#8220;命名SQL查询&#8221;得到更多的细节. </p>
<p>String sql = "select cat.originalId as {cat.id}, " +<br />
"cat.mateid as {cat.mate}, cat.sex as {cat.sex}, " +<br />
"cat.weight*10 as {cat.weight}, cat.name as {cat.name} " +<br />
"from cat_log cat where {cat.mate} = :catId"<br />
List loggedCats = sess.createSQLQuery(sql)<br />
.addEntity("cat", Cat.class)<br />
.setLong("catId", catId)<br />
.list();注意:如果你明确地列出了每个属性,你必须包含这个类和它的子类的属性! and its subclasses! </p>
<p>17.3. 命名SQL查询<br />
可以在映射文档中定义查询的名字,然后就可以象调用一个命名的HQL查询一样直接调用命名SQL查询.在这种情况下,我们不 需要调用addEntity()方法. </p>
<p>&lt;sql-query name="mySqlQuery"&gt;<br />
&lt;return alias="person" class="eg.Person"/&gt;<br />
SELECT person.NAME AS {person.name},<br />
person.AGE AS {person.age},<br />
person.SEX AS {person.sex}<br />
FROM PERSON person WHERE person.NAME LIKE 'Hiber%'<br />
&lt;/sql-query&gt;List people = sess.getNamedQuery("mySqlQuery")<br />
.setMaxResults(50)<br />
.list();一个命名查询可能会返回一个标量值.你必须使用&lt;return-scalar&gt;元素来指定字段的别名和 Hibernate类型 </p>
<p>&lt;sql-query name="mySqlQuery"&gt;<br />
&lt;return-scalar column="name" type="string"/&gt;<br />
&lt;return-scalar column="age" type="long"/&gt;<br />
SELECT p.NAME AS name,<br />
p.AGE AS age,<br />
FROM PERSON p WHERE p.NAME LIKE 'Hiber%'<br />
&lt;/sql-query&gt;&lt;return-join&gt;和&lt;load-collection&gt;元素分别用作 外连接和定义那些初始化集合的查询 </p>
<p>17.3.1. 使用return-property来明确地指定字段/别名<br />
使用&lt;return-property&gt;你可以明确的告诉Hibernate使用哪些字段,这和使用{}-语法 来让Hibernate注入它自己的别名是相反的. </p>
<p>&lt;sql-query name="mySqlQuery"&gt;<br />
&lt;return alias="person" class="eg.Person"&gt;<br />
&lt;return-property name="name" column="myName"/&gt;<br />
&lt;return-property name="age" column="myAge"/&gt;<br />
&lt;return-property name="sex" column="mySex"/&gt;<br />
&lt;/return&gt;<br />
SELECT person.NAME AS myName,<br />
person.AGE AS myAge,<br />
person.SEX AS mySex,<br />
FROM PERSON person WHERE person.NAME LIKE :name<br />
&lt;/sql-query&gt;<br />
&lt;return-property&gt;也可用于多个字段,它解决了使用{}-语法不能细粒度控制多个字段的限制 <br />
&lt;sql-query name="organizationCurrentEmployments"&gt;<br />
&lt;return alias="emp" class="Employment"&gt;<br />
&lt;return-property name="salary"&gt;<br />
&lt;return-column name="VALUE"/&gt;<br />
&lt;return-column name="CURRENCY"/&gt;<br />
&lt;/return-property&gt;<br />
&lt;return-property name="endDate" column="myEndDate"/&gt;<br />
&lt;/return&gt;<br />
SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},<br />
STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},<br />
REGIONCODE as {emp.regionCode}, EID AS {emp.id}, VALUE, CURRENCY<br />
FROM EMPLOYMENT<br />
WHERE EMPLOYER = :id AND ENDDATE IS NULL<br />
ORDER BY STARTDATE ASC<br />
&lt;/sql-query&gt;注意在这个例子中,我们使用了&lt;return-property&gt;结合{}的注入语法. 允许用户来选择如何引用字段以及属性. </p>
<p>如果你映射一个识别器(discriminator),你必须使用&lt;return-discriminator&gt;来指定识别器字段 </p>
<p>17.3.2. 使用存储过程来查询<br />
Hibernate 3引入了对存储过程查询的支持. 存储过程必须返回一个结果集,作为Hibernate能够使用的第一个外部参数. 下面是一个Oracle9和更高版本的存储过程例子. </p>
<p>CREATE OR REPLACE FUNCTION selectAllEmployments<br />
RETURN SYS_REFCURSOR<br />
AS<br />
st_cursor SYS_REFCURSOR;<br />
BEGIN<br />
OPEN st_cursor FOR<br />
SELECT EMPLOYEE, EMPLOYER,<br />
STARTDATE, ENDDATE,<br />
REGIONCODE, EID, VALUE, CURRENCY<br />
FROM EMPLOYMENT;<br />
RETURN&nbsp; st_cursor;<br />
END;在Hibernate里要要使用这个查询,你需要通过命名查询来映射它. </p>
<p>&lt;sql-query name="selectAllEmployees_SP" callable="true"&gt;<br />
&lt;return alias="emp" class="Employment"&gt;<br />
&lt;return-property name="employee" column="EMPLOYEE"/&gt;<br />
&lt;return-property name="employer" column="EMPLOYER"/&gt;<br />
&lt;return-property name="startDate" column="STARTDATE"/&gt;<br />
&lt;return-property name="endDate" column="ENDDATE"/&gt;<br />
&lt;return-property name="regionCode" column="REGIONCODE"/&gt;<br />
&lt;return-property name="id" column="EID"/&gt;<br />
&lt;return-property name="salary"&gt;<br />
&lt;return-column name="VALUE"/&gt;<br />
&lt;return-column name="CURRENCY"/&gt;<br />
&lt;/return-property&gt;<br />
&lt;/return&gt;<br />
{ ? = call selectAllEmployments() }<br />
&lt;/sql-query&gt;注意存储过程当前仅仅返回标量和实体.现在不支持&lt;return-join&gt;和&lt;load-collection&gt; </p>
<p>17.3.2.1. 使用存储过程的规则和限制<br />
为了在Hibernate中使用存储过程,你必须遵循一些规则.不遵循这些规则的存储过程将不可用.如果你仍然想要使用他们, 你必须通过session.connection()来执行他们.这些规则针对于不同的数据库.因为数据库 提供商有各种不同的存储过程语法和语义. </p>
<p>对存储过程进行的查询无法使用setFirstResult()/setMaxResults()进行分页。 </p>
<p>对于Oracle有如下规则: </p>
<p>存储过程必须返回一个结果集.它通过返回SYS_REFCURSOR实现(在Oracle9或10),在Oracle里你需要定义一个REF CURSOR 类型 </p>
<p>推荐的格式是 { ? = call procName(&lt;parameters&gt;) } 或 { ? = call procName }(这更像是Oracle规则而不是Hibernate规则) </p>
<p>对于Sybase或者MS SQL server有如下规则: </p>
<p>存储过程必须返回一个结果集。.注意这些servers可能返回多个结果集以及更新的数目.Hibernate将取出第一条结果集作为它的返回值， 其他将被丢弃。 </p>
<p>如果你能够在存储过程里设定SET NOCOUNT ON，这可能会效率更高，但这不是必需的。 </p>
<p>17.4. 定制SQL用来create，update和delete<br />
Hibernate3能够使用定制的SQL语句来执行create,update和delete操作。在Hibernate中，持久化的类和集合已经 包含了一套配置期产生的语句(insertsql, deletesql, updatesql等等)，这些映射标记 &lt;sql-insert&gt;, &lt;sql-delete&gt;, and &lt;sql-update&gt;重载了 这些语句。 </p>
<p>&lt;class name="Person"&gt;<br />
&lt;id name="id"&gt;<br />
&lt;generator class="increment"/&gt;<br />
&lt;/id&gt;<br />
&lt;property name="name" not-null="true"/&gt;<br />
&lt;sql-insert&gt;INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )&lt;/sql-insert&gt;<br />
&lt;sql-update&gt;UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?&lt;/sql-update&gt;<br />
&lt;sql-delete&gt;DELETE FROM PERSON WHERE ID=?&lt;/sql-delete&gt;<br />
&lt;/class&gt;这些SQL直接在你的数据库里执行，所以你可以自由的使用你喜欢的任意语法。但如果你使用数据库特定的语法， 这当然会降低你映射的可移植性。 </p>
<p>如果设定callable，则能够支持存储过程了。 </p>
<p>&lt;class name="Person"&gt;<br />
&lt;id name="id"&gt;<br />
&lt;generator class="increment"/&gt;<br />
&lt;/id&gt;<br />
&lt;property name="name" not-null="true"/&gt;<br />
&lt;sql-insert callable="true"&gt;{call createPerson (?, ?)}&lt;/sql-insert&gt;<br />
&lt;sql-delete callable="true"&gt;{? = call deletePerson (?)}&lt;/sql-delete&gt;<br />
&lt;sql-update callable="true"&gt;{? = call updatePerson (?, ?)}&lt;/sql-update&gt;<br />
&lt;/class&gt;参数的位置顺序是非常重要的，他们必须和Hibernate所期待的顺序相同。 </p>
<p>你能够通过设定日志调试级别为org.hiberante.persister.entity,来查看Hibernate所期待的顺序。在这个级别下， Hibernate将会打印出create,update和delete实体的静态SQL。如果想看到预想中的顺序。记得不要将定制SQL包含在映射文件里， 因为他们会重载Hibernate生成的静态SQL。 </p>
<p>在大多数情况下(最好这么做)，存储过程需要返回插入/更新/删除的行数，因为Hibernate对语句的成功执行有些运行时的检查。 Hibernate常会把进行CUD操作的语句的第一个参数注册为一个数值型输出参数。 </p>
<p>CREATE OR REPLACE FUNCTION updatePerson (uid IN NUMBER, uname IN VARCHAR2)<br />
RETURN NUMBER IS<br />
BEGIN<br />
update PERSON<br />
set<br />
NAME = uname,<br />
where<br />
ID = uid;<br />
return SQL%ROWCOUNT;<br />
END updatePerson;17.5. 定制装载SQL<br />
你可能需要声明你自己的SQL(或HQL)来装载实体 </p>
<p>&lt;sql-query name="person"&gt;<br />
&lt;return alias="p" class="Person" lock-mode="upgrade"/&gt;<br />
SELECT NAME AS {p.name}, ID AS {p.id} FROM PERSON WHERE ID=? FOR UPDATE<br />
&lt;/sql-query&gt;这只是一个前面讨论过的命名查询声明，你可以在类映射里引用这个命名查询。 </p>
<p>&lt;class name="Person"&gt;<br />
&lt;id name="id"&gt;<br />
&lt;generator class="increment"/&gt;<br />
&lt;/id&gt;<br />
&lt;property name="name" not-null="true"/&gt;<br />
&lt;loader query-ref="person"/&gt;<br />
&lt;/class&gt;这也可以用于存储过程 </p>
<p>TODO: 未完成的例子 </p>
<p>&lt;sql-query name="organizationEmployments"&gt;<br />
&lt;load-collection alias="empcol" role="Organization.employments"/&gt;<br />
SELECT {empcol.*}<br />
FROM EMPLOYMENT empcol<br />
WHERE EMPLOYER = :id<br />
ORDER BY STARTDATE ASC, EMPLOYEE ASC<br />
&lt;/sql-query&gt;<br />
&lt;sql-query name="organizationCurrentEmployments"&gt;<br />
&lt;return alias="emp" class="Employment"/&gt;<br />
&lt;synchronize table="EMPLOYMENT"/&gt;<br />
SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},<br />
STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},<br />
REGIONCODE as {emp.regionCode}, ID AS {emp.id}<br />
FROM EMPLOYMENT<br />
WHERE EMPLOYER = :id AND ENDDATE IS NULL<br />
ORDER BY STARTDATE ASC<br />
&lt;/sql-query&gt;第 18 章 过滤数据<br />
Hibernate3 提供了一种创新的方式来处理具有&#8220;显性(visibility)&#8221;规则的数据，那就是使用Hibernate filter。 Hibernate filter是全局有效的、具有名字、可以带参数的过滤器， 对于某个特定的Hibernate session您可以选择是否启用（或禁用）某个过滤器。 </p>
<p>18.1. Hibernate 过滤器(filters)<br />
Hibernate3新增了对某个类或者集合使用预先定义的过滤器条件(filter criteria)的功能。过滤器条件相当于定义一个 非常类似于类和各种集合上的&#8220;where&#8221;属性的约束子句，但是过滤器条件可以带参数。 应用程序可以在运行时决定是否启用给定的过滤器，以及使用什么样的参数值。 过滤器的用法很像数据库视图，只不过是在应用程序中确定使用什么样的参数的。 </p>
<p>要使用过滤器，必须首先在相应的映射节点中定义。而定义一个过滤器，要用到位于&lt;hibernate-mapping/&gt; 节点之内的&lt;filter-def/&gt;节点： </p>
<p>&lt;filter-def name="myFilter"&gt;<br />
&lt;filter-param name="myFilterParam" type="string"/&gt;<br />
&lt;/filter-def&gt;定义好之后，就可以在某个类中使用这个过滤器： </p>
<p>&lt;class name="myClass" ...&gt;<br />
...<br />
&lt;filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/&gt;<br />
&lt;/class&gt;也可以在某个集合使用它： </p>
<p>&lt;set ...&gt;<br />
&lt;filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/&gt;<br />
&lt;/set&gt;可以在多个类或集合中使用某个过滤器；某个类或者集合中也可以使用多个过滤器。 </p>
<p>Session对象中会用到的方法有：enableFilter(String filterName), getEnabledFilter(String filterName), 和 disableFilter(String filterName). Session中默认是不启用过滤器的，必须通过Session.enabledFilter()方法显式的启用。 该方法返回被启用的Filter的实例。以上文定义的过滤器为例： </p>
<p>session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");注意，org.hibernate.Filter的方法允许链式方法调用。（类似上面例子中启用Filter之后设定Filter参数这个&#8220;方法链&#8221;） Hibernate的其他部分也大多有这个特性。 </p>
<p>下面是一个比较完整的例子，使用了记录生效日期模式过滤有时效的数据： </p>
<p>&lt;filter-def name="effectiveDate"&gt;<br />
&lt;filter-param name="asOfDate" type="date"/&gt;<br />
&lt;/filter-def&gt;<br />
&lt;class name="Employee" ...&gt;<br />
...<br />
&lt;many-to-one name="department" column="dept_id" class="Department"/&gt;<br />
&lt;property name="effectiveStartDate" type="date" column="eff_start_dt"/&gt;<br />
&lt;property name="effectiveEndDate" type="date" column="eff_end_dt"/&gt;<br />
...<br />
&lt;!--<br />
Note that this assumes non-terminal records have an eff_end_dt set to<br />
a max db date for simplicity-sake<br />
注意，为了简单起见，此处假设雇用关系生效期尚未结束的记录的eff_end_dt字段的值等于数据库最大的日期<br />
--&gt;<br />
&lt;filter name="effectiveDate"<br />
condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/&gt;<br />
&lt;/class&gt;<br />
&lt;class name="Department" ...&gt;<br />
...<br />
&lt;set name="employees" lazy="true"&gt;<br />
&lt;key column="dept_id"/&gt;<br />
&lt;one-to-many class="Employee"/&gt;<br />
&lt;filter name="effectiveDate"<br />
condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/&gt;<br />
&lt;/set&gt;<br />
&lt;/class&gt;定义好后，如果想要保证取回的都是目前处于生效期的记录，只需在获取雇员数据的操作之前先开启过滤器即可： </p>
<p>Session session = ...;<br />
session.enabledFilter("effectiveDate").setParameter("asOfDate", new Date());<br />
List results = session.createQuery("from Employee as e where e.salary &gt; :targetSalary")<br />
.setLong("targetSalary", new Long(1000000))<br />
.list();<br />
在上面的HQL中，虽然我们仅仅显式的使用了一个薪水条件，但因为启用了过滤器，查询将仅返回那些目前雇用 关系处于生效期的，并且薪水高于一百万美刀的雇员的数据。 </p>
<p>注意：如果你打算在使用外连接（或者通过HQL或load fetching）的同时使用过滤器，要注意条件表达式的方向（左还是右）。 最安全的方式是使用左外连接（left outer joining）。并且通常来说，先写参数， 然后是操作符，最后写数据库字段名。 </p>
<p>第 19 章 XML映射<br />
注意这是Hibernate 3.0的一个实验性的特性。这一特性仍在积极开发中。 </p>
<p>19.1. 用XML数据进行工作<br />
Hibernate使得你可以用XML数据来进行工作，恰如你用持久化的POJO进行工作那样。解析过的XML树 可以被认为是另外一种在对象层面上代替POJO来表示关系型数据的途径. </p>
<p>Hibernate支持采用dom4j作为操作XML树的API。你可以写一个查询从数据库中检索出 dom4j树，随后你对这颗树做的任何修改都将自动同步回数据库。你甚至可以用dom4j解析 一篇XML文档，然后使用Hibernate的任一基本操作将它写入数据库： persist(), saveOrUpdate(), merge(), delete(), replicate() (合并操作merge()目前还不支持)。 </p>
<p>这一特性可以应用在很多场合，包括数据导入导出，通过JMS或SOAP表现实体数据以及 基于XSLT的报表。 </p>
<p>一个单一的映射就可以将类的属性和XML文档的节点同时映射到数据库。如果不需要映射类， 它也可以用来只映射XML文档。 </p>
<p>19.1.1. 指定同时映射XML和类<br />
这是一个同时映射POJO和XML的例子： </p>
<p>&lt;class name="Account"<br />
table="ACCOUNTS"<br />
node="account"&gt;<br />
&lt;id name="accountId"<br />
column="ACCOUNT_ID"<br />
node="@id"/&gt;<br />
&lt;many-to-one name="customer"<br />
column="CUSTOMER_ID"<br />
node="customer/@id"<br />
embed-xml="false"/&gt;<br />
&lt;property name="balance"<br />
column="BALANCE"<br />
node="balance"/&gt;<br />
...<br />
&lt;/class&gt;19.1.2. 只定义XML映射<br />
这是一个不映射POJO的例子： </p>
<p>&lt;class entity-name="Account"<br />
table="ACCOUNTS"<br />
node="account"&gt;<br />
&lt;id name="id"<br />
column="ACCOUNT_ID"<br />
node="@id"<br />
type="string"/&gt;<br />
&lt;many-to-one name="customerId"<br />
column="CUSTOMER_ID"<br />
node="customer/@id"<br />
embed-xml="false"<br />
entity-name="Customer"/&gt;<br />
&lt;property name="balance"<br />
column="BALANCE"<br />
node="balance"<br />
type="big_decimal"/&gt;<br />
...<br />
&lt;/class&gt;这个映射使得你既可以把数据作为一棵dom4j树那样访问，又可以作为由属性键值对(java Maps) 组成的图那样访问。属性名字是纯粹逻辑上的结构，你可以在HQL查询中引用它。 </p>
<p>19.2. XML映射元数据<br />
许多Hibernate映射元素具有node属性。这使你可以指定用来保存 属性或实体数据的XML属性或元素。node属性必须是下列格式之一： </p>
<p>"element-name" - 映射为指定的XML元素</p>
<p>"@attribute-name" - 映射为指定的XML属性</p>
<p>"." - 映射为父元素</p>
<p>"element-name/@attribute-name" - 映射为指定元素的指定属性 </p>
<p>对于集合和单值的关联，有一个额外的embed-xml属性可用。 这个属性的缺省值是真(embed-xml="true")。如果embed-xml="true"， 则对应于被关联实体或值类型的集合的XML树将直接嵌入拥有这些关联的实体的XML树中。 否则，如果embed-xml="false"，那么对于单值的关联，仅被引用的实体的标识符出现在 XML树中(被引用实体本身不出现)，而集合则根本不出现。 </p>
<p>你应该小心，不要让太多关联的embed-xml属性为真(embed-xml="true")，因为XML不能很好地处理 循环引用! </p>
<p>&lt;class name="Customer"<br />
table="CUSTOMER"<br />
node="customer"&gt;<br />
&lt;id name="id"<br />
column="CUST_ID"<br />
node="@id"/&gt;<br />
&lt;map name="accounts"<br />
node="."<br />
embed-xml="true"&gt;<br />
&lt;key column="CUSTOMER_ID"<br />
not-null="true"/&gt;<br />
&lt;map-key column="SHORT_DESC"<br />
node="@short-desc"<br />
type="string"/&gt;<br />
&lt;one-to-many entity-name="Account"<br />
embed-xml="false"<br />
node="account"/&gt;<br />
&lt;/map&gt;<br />
&lt;component name="name"<br />
node="name"&gt;<br />
&lt;property name="firstName"<br />
node="first-name"/&gt;<br />
&lt;property name="initial"<br />
node="initial"/&gt;<br />
&lt;property name="lastName"<br />
node="last-name"/&gt;<br />
&lt;/component&gt;<br />
...<br />
&lt;/class&gt;在这个例子中，我们决定嵌入帐目号码(account id)的集合，但不嵌入实际的帐目数据。下面的HQL查询： </p>
<p>from Customer c left join fetch c.accounts where c.lastName like :lastName返回的数据集将是这样： </p>
<p>&lt;customer id="123456789"&gt;<br />
&lt;account id="987632567" short-desc="Savings"/&gt;<br />
&lt;account id="985612323" short-desc="Credit Card"/&gt;<br />
&lt;name&gt;<br />
&lt;first-name&gt;Gavin&lt;/first-name&gt;<br />
&lt;initial&gt;A&lt;/initial&gt;<br />
&lt;last-name&gt;King&lt;/last-name&gt;<br />
&lt;/name&gt;<br />
...<br />
&lt;/customer&gt;如果你把一对多映射&lt;one-to-many&gt;的embed-xml属性置为真(embed-xml="true")， 则数据看上去就像这样： </p>
<p>&lt;customer id="123456789"&gt;<br />
&lt;account id="987632567" short-desc="Savings"&gt;<br />
&lt;customer id="123456789"/&gt;<br />
&lt;balance&gt;100.29&lt;/balance&gt;<br />
&lt;/account&gt;<br />
&lt;account id="985612323" short-desc="Credit Card"&gt;<br />
&lt;customer id="123456789"/&gt;<br />
&lt;balance&gt;-2370.34&lt;/balance&gt;<br />
&lt;/account&gt;<br />
&lt;name&gt;<br />
&lt;first-name&gt;Gavin&lt;/first-name&gt;<br />
&lt;initial&gt;A&lt;/initial&gt;<br />
&lt;last-name&gt;King&lt;/last-name&gt;<br />
&lt;/name&gt;<br />
...<br />
&lt;/customer&gt;19.3. 操作XML数据<br />
让我们来读入和更新应用程序中的XML文档。通过获取一个dom4j会话可以做到这一点： </p>
<p>Document doc = ....;<br />
Session session = factory.openSession();<br />
Session dom4jSession = session.getSession(EntityMode.DOM4J);<br />
Transaction tx = session.beginTransaction();<br />
List results = dom4jSession<br />
.createQuery("from Customer c left join fetch c.accounts where c.lastName like :lastName")<br />
.list();<br />
for ( int i=0; i&lt;results.size(); i++ ) {<br />
//add the customer data to the XML document<br />
Element customer = (Element) results.get(i);<br />
doc.add(customer);<br />
}<br />
tx.commit();<br />
session.close();Session session = factory.openSession();<br />
Session dom4jSession = session.getSession(EntityMode.DOM4J);<br />
Transaction tx = session.beginTransaction();<br />
Element cust = (Element) dom4jSession.get("Customer", customerId);<br />
for ( int i=0; i&lt;results.size(); i++ ) {<br />
Element customer = (Element) results.get(i);<br />
//change the customer name in the XML and database<br />
Element name = customer.element("name");<br />
name.element("first-name").setText(firstName);<br />
name.element("initial").setText(initial);<br />
name.element("last-name").setText(lastName);<br />
}<br />
tx.commit();<br />
session.close();将这一特色与Hibernate的replicate()操作结合起来而实现的基于XML的数据导入/导出将非常有用.</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/ctgyp/archive/2007/12/18/1946626.aspx</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/298756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2009-10-18 16:30 <a href="http://www.blogjava.net/zhaochengming/archive/2009/10/18/298756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(2) Hibernate 数据关联 one to one(共享主键)</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/14/136659.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Tue, 14 Aug 2007 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/14/136659.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136659.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/14/136659.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136659.html</trackback:ping><description><![CDATA[<p>CREATE TABLE t_users<br>(<br>&nbsp; id int4 NOT NULL DEFAULT nextval('t_user_id_seq'::text),<br>&nbsp; age int4,<br>&nbsp; name varchar(30),<br>&nbsp; CONSTRAINT t_users_pkey PRIMARY KEY (id)<br>) <br>CREATE TABLE t_passports<br>(<br>&nbsp; id int4 NOT NULL DEFAULT nextval('t_user_id_seq'::text),<br>&nbsp; serial varchar(30),<br>&nbsp; expiry int4,<br>&nbsp; CONSTRAINT t_passports_pkey PRIMARY KEY (id),<br>&nbsp; CONSTRAINT t_passports_id_fkey FOREIGN KEY (id)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REFERENCES t_users (id) MATCH SIMPLE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON UPDATE RESTRICT ON DELETE RESTRICT<br>) <br><strong>第一部分 使用xml配置</strong><br><strong style="COLOR: #008080">源代码下载<a href="http://www.blogjava.net/Files/zhaochengming/one2one%20xml配置格式的.rar"><a href="http://www.blogjava.net/Files/zhaochengming/one2one%20xml配置格式的.rar"><strong style="COLOR: #008080"><a href="http://www.blogjava.net/Files/zhaochengming/one2one%20xml配置格式的.rar"><a href="http://www.blogjava.net/Files/zhaochengming/one2one%20xmlcomfig%20hibernate.rar"><strong style="COLOR: #008080"><a href="http://www.blogjava.net/Files/zhaochengming/one2one%20xmlcomfig%20hibernate.rar">http://www.blogjava.net/Files/zhaochengming/one2one%20xmlcomfig%20hibernate.rar</a></a></strong><br></a></strong></a></a></strong>t_users和t_passports根据t_user.id一对一关联<br><span style="COLOR: red">TUsers.hbm.xml</span><br>&lt;hibernate-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;class name="com.tables.one2one.TUsers" table="t_users" schema="public"&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; <span style="COLOR: #993366">&lt;generator class="sequence"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="sequence"&gt;t_user_id_seq&lt;/param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="age" type="java.lang.Integer"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="age" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&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="30" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #00ffff"> <span style="COLOR: #3366ff">&lt;!-- 如果cascade=none的话，就不会级联更新了,就是说只在t_users中插入值，在t_passports中不插入值 --&gt;</span><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #993366">&lt;one-to-one name="passport" class="com.tables.one2one.TPassports"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;cascade="all" outer-join="true"&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/one-to-one&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br>&lt;/hibernate-mapping&gt;<br><br><span style="COLOR: #ff0000">TPassports.hbm.xml</span><br><span style="COLOR: #000000">&lt;hibernate-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;class name="com.tables.one2one.TPassports" table="t_passports" schema="public"&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; <span style="COLOR: #993366">&lt;!-- 这里一定要改成foreign --&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="foreign"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="property"&gt;user&lt;/param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-one name="user" class="com.tables.one2one.TUsers" constrained="true"&gt;&lt;/one-to-one&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="serial" type="java.lang.String"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="serial" length="30" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="expiry" type="java.lang.Integer"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="expiry" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br>&lt;/hibernate-mapping&gt;<br>测试<br>public class One2OneTest extends BaseHibernateDAO {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void test() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TUsers user = new TUsers();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setAge(100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setName("CEYLIN");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TPassports passport = new TPassports();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; passport.setSerial("PCN1002211");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; passport.setExpiry(20080806);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; passport.setUser(user);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.setPassport(passport);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session = this.getSession();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction tx = session.beginTransaction();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.save(user);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br><strong>第二部分 使用注解，</strong><br><span style="COLOR: red"><strong><font color=#008080>源代码下载&nbsp; </font></strong></span><a href="http://www.blogjava.net/Files/zhaochengming/one2oneAnno1.rar">http://www.blogjava.net/Files/zhaochengming/one2oneAnno1.rar</a><br><br>package com;</span></p>
<p><span style="COLOR: #000000">import javax.persistence.CascadeType;<br>import javax.persistence.Column;<br>import javax.persistence.Entity;<br>import javax.persistence.GeneratedValue;<br>import javax.persistence.Id;<br>import javax.persistence.OneToOne;<br>import javax.persistence.PrimaryKeyJoinColumn;<br>import javax.persistence.SequenceGenerator;<br>import javax.persistence.Table;</span></p>
<p><span style="COLOR: #000000">@Entity<br>@Table(name="t_users")<br>public class TUser {<br>&nbsp;@Id<br>&nbsp;@Column(name = "user_id")<br>&nbsp;@GeneratedValue(generator = "sequence")<br>&nbsp;@SequenceGenerator(name = "sequence", sequenceName = "t_table_id_seq")<br>&nbsp;private Integer id;<br>&nbsp;<br>&nbsp;@Column(name = "age")<br>&nbsp;private Integer age;<br>&nbsp;<br>&nbsp;@Column(name= "name")<br>&nbsp;private String name;<br>&nbsp;<br>&nbsp;@OneToOne(cascade = CascadeType.ALL) <br>&nbsp;@PrimaryKeyJoinColumn <br>&nbsp;private TPassport passport;</span></p>
<p><span style="COLOR: #000000">&nbsp;public Integer getAge() {<br>&nbsp;&nbsp;return age;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public void setAge(Integer age) {<br>&nbsp;&nbsp;this.age = age;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public Integer getId() {<br>&nbsp;&nbsp;return id;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public void setId(Integer id) {<br>&nbsp;&nbsp;this.id = id;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public String getName() {<br>&nbsp;&nbsp;return name;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public void setName(String name) {<br>&nbsp;&nbsp;this.name = name;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public TPassport getPassport() {<br>&nbsp;&nbsp;return passport;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public void setPassport(TPassport passport) {<br>&nbsp;&nbsp;this.passport = passport;<br>&nbsp;}<br>}<br><br>package com;</span></p>
<p><span style="COLOR: #000000">import javax.persistence.Column;<br>import javax.persistence.Entity;<br>import javax.persistence.GeneratedValue;<br>import javax.persistence.Id;<br>import javax.persistence.OneToOne;<br>import javax.persistence.Table;</span></p>
<p><span style="COLOR: #000000">import org.hibernate.annotations.GenericGenerator;<br>import org.hibernate.annotations.Parameter;</span></p>
<p><span style="COLOR: #000000">@Entity<br>@Table(name = "t_passports")<br>public class TPassport {<br>&nbsp;@Id <br>&nbsp;@GeneratedValue(generator = "fk")<br>&nbsp;@GenericGenerator(strategy = "foreign", name = "fk", parameters = @Parameter(name="property", value="user"))<br>&nbsp;private Integer id;<br>&nbsp;<br>&nbsp;@Column(name = "serial")<br>&nbsp;private String serial;<br>&nbsp;<br>&nbsp;@Column(name="expiry")<br>&nbsp;private Integer expiry;<br>&nbsp;<br>&nbsp;@OneToOne(mappedBy="passport", optional = false)<br>&nbsp;private TUser user;</span></p>
<p><span style="COLOR: #000000">&nbsp;public Integer getExpiry() {<br>&nbsp;&nbsp;return expiry;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public void setExpiry(Integer expiry) {<br>&nbsp;&nbsp;this.expiry = expiry;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public Integer getId() {<br>&nbsp;&nbsp;return id;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public void setId(Integer id) {<br>&nbsp;&nbsp;this.id = id;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public String getSerial() {<br>&nbsp;&nbsp;return serial;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public void setSerial(String serial) {<br>&nbsp;&nbsp;this.serial = serial;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public TUser getUser() {<br>&nbsp;&nbsp;return user;<br>&nbsp;}</span></p>
<p><span style="COLOR: #000000">&nbsp;public void setUser(TUser user) {<br>&nbsp;&nbsp;this.user = user;<br>&nbsp;}<br>}<br></p>
</span>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-14 13:58 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/14/136659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(1) Hibernate的3种继承形式</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/12/136193.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Sun, 12 Aug 2007 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/12/136193.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136193.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/12/136193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136193.html</trackback:ping><description><![CDATA[<p><strong>Hibernate</strong><strong>的</strong><strong>3</strong><strong>种继承形式</strong></p>
<p>1．&nbsp;&nbsp;&nbsp;&nbsp; 表和子类之间的对立一对一关系 Table per concrete class<br></p>
<p><strong>源码下载 </strong><a href="http://download.csdn.net/source/226662" _fcksavedurl="http://download.csdn.net/source/226662"><strong><u><font color=#800080>http://download.csdn.net/source/226662</font></u></strong></a><br>2．&nbsp;&nbsp;&nbsp;&nbsp; 每个子类对应一张子表,并与主类共享主表 Table per subclass<br></p>
<p><strong>源码下载 http</strong><a href="http://download.csdn.net/source/226662http://download.csdn.net/source/226728" _fcksavedurl="http://download.csdn.net/source/226662"><font color=#800080><font color=#002c99>://download.csdn.net/source/226728</font></font></a><br>3．&nbsp;&nbsp;&nbsp;&nbsp; 表与类的一对多关系 Table per class hierarchy<br><strong>源码下载 http</strong><a href="http://download.csdn.net/source/226783" _fcksavedurl="http://download.csdn.net/source/226662"><font color=#800080><font color=#002c99>://download.csdn.net/source/226783</font></font></a></p>
<p>按照《深入潜出Hibernate》中介绍的，我们开始学习。</p>
<p>&nbsp;</p>
<p><strong>场景</strong>: 就一般的商品而言，在具备某些共性(如: 名称,厂商),也有不同的属性,如书有页数，dvd有dvd的编码格式.</p>
<p>&nbsp;</p>
<p><font color=#ff9900><strong>&lt;</strong><strong>一</strong><strong>&gt; table per concerte class</strong></font></p>
<p><font color=#00ccff><strong>(a)</strong> <strong>使用</strong><strong>xml</strong></font></p>
<p>Titem 有两个子类: Tbook , TDvd, 那么，所谓&#8220;表与子类之间的一对一的关系&#8221;，也就是每个子类对应一张数据库表。对应Tbook , TDvd</p>
<p>数据库的表我们设计如下</p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=247 colSpan=3>
            <p>表 T_bool</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p>id</p>
            </td>
            <td vAlign=top width=72>
            <p>Int</p>
            </td>
            <td vAlign=top width=72>
            <p>PK</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p>Name</p>
            </td>
            <td vAlign=top width=72>
            <p>Varchar(50)</p>
            </td>
            <td vAlign=top width=72>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p>Manufacturer</p>
            </td>
            <td vAlign=top width=72>
            <p>Varchar(50)</p>
            </td>
            <td vAlign=top width=72>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p>Pagecount</p>
            </td>
            <td vAlign=top width=72>
            <p>int</p>
            </td>
            <td vAlign=top width=72>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=256 colSpan=3>
            <p>表 T_dvd</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p>id</p>
            </td>
            <td vAlign=top width=81>
            <p>Int</p>
            </td>
            <td vAlign=top width=72>
            <p>PK</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p>Name</p>
            </td>
            <td vAlign=top width=81>
            <p>Varchar(50)</p>
            </td>
            <td vAlign=top width=72>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p>Manufacturer</p>
            </td>
            <td vAlign=top width=81>
            <p>Varchar(50)</p>
            </td>
            <td vAlign=top width=72>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p>Codetype</p>
            </td>
            <td vAlign=top width=81>
            <p>Varchar(30)</p>
            </td>
            <td vAlign=top width=72>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left>/**</p>
<p align=left>* 虚拟的表</p>
<p align=left>* TItem 已经知道的继承类为 AbstractTBook AbstractTDvd</p>
<p align=left>*/</p>
<p align=left><strong>public</strong> <strong>abstract</strong> <strong>class</strong> TItem <strong>implements</strong> Serializable {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>private</strong> Integer id; </p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>private</strong> String name;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>private</strong> String manufacturer;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> Integer getId() {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>return</strong> id;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> <strong>void</strong> setId(Integer id) {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>this</strong>.id = id;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> String getManufacturer() {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>return</strong> manufacturer;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> <strong>void</strong> setManufacturer(String manufacturer) {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>this</strong>.manufacturer = manufacturer;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> String getName() {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>return</strong> name;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> <strong>void</strong> setName(String name) {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>this</strong>.name = name;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p align=left><strong>public</strong> <strong>abstract</strong> <strong>class</strong> AbstractTDvd <strong>extends</strong> TItem {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>private</strong> String codetype;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> AbstractTDvd() {&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> String getCodetype() {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>return</strong> <strong>this</strong>.codetype;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> <strong>void</strong> setCodetype(String codetype) {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>this</strong>.codetype = codetype;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p align=left><strong>public</strong> <strong>abstract</strong> <strong>class</strong> AbstractTBook <strong>extends</strong> TItem {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>private</strong> Integer pagecount;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> AbstractTBook() {}</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> Integer getPagecount() {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>return</strong> <strong>this</strong>.pagecount;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> <strong>void</strong> setPagecount(Integer pagecount) {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>this</strong>.pagecount = pagecount;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p align=left><strong>public</strong> <strong>class</strong> TDvd <strong>extends</strong> AbstractTDvd&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> TDvd() {}</p>
<p>}</p>
<p align=left><strong>public</strong> <strong>class</strong> TBook <strong>extends</strong> AbstractTDvd&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> TBook() {}</p>
<p>}</p>
<p>&nbsp;</p>
<p><strong>Tbook.hbm.xml</strong></p>
<p align=left>&lt;?xml version="1.0" encoding="utf-8"?&gt;</p>
<p align=left>&lt;hibernate-mapping&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class name="com.persist.tablePerConcreteClass.TBook" table="t_book" &gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.Integer"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="id" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="sequence"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="sequence"&gt;t_table_id_seq&lt;/param&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="name" type="java.lang.String"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="name" length="50" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="manufacturer" type="java.lang.String"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="manufacturer" length="50" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="pagecount" type="java.lang.Integer"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="pagecount" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p>&nbsp;</p>
<p><strong>Tdvd.hbm.xml</strong></p>
<p align=left>&lt;?xml version="1.0" encoding="utf-8"?&gt;</p>
<p align=left>&lt;hibernate-mapping&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class name="com.persist.tablePerConcreteClass.TDvd" table="t_dvd" &gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.Integer"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="id" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="sequence"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="sequence"&gt;t_table_id_seq&lt;/param&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="name" type="java.lang.String"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="name" length="50" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="manufacturer" type="java.lang.String"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="manufacturer" length="50" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="codetype" type="java.lang.String"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="codetype" length="50" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p>&nbsp;</p>
<p><strong>Hibernate.cfg.xml</strong></p>
<p align=left>&lt;?xml version='1.0' encoding='UTF-8'?&gt;</p>
<p align=left>&lt;hibernate-configuration&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;session-factory&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="dialect"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.hibernate.dialect.PostgreSQLDialect</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.url"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc:postgresql://localhost:5432/postgres</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.username"&gt;pgsql&lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.password"&gt;pgsql&lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.driver_class"&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.postgresql.Driver</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="myeclipse.connection.profile"&gt;pgsql&lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="show_sql"&gt;true&lt;/property&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mapping resource="com/persist/tablePerConcreteClass/TBook.hbm.xml" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mapping resource="com/persist/tablePerConcreteClass/TDvd.hbm.xml" /&gt;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/session-factory&gt;</p>
<p>&lt;/hibernate-configuration&gt;</p>
<p><strong>测试用例</strong></p>
<p align=left><strong>public</strong> <strong>class</strong> TBookDAO <strong>extends</strong> BaseHibernateDAO {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> <strong>static</strong> <strong>void</strong> main(String args[]) {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>new</strong> TBookDAO().test();</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;<strong>public</strong> <strong>void</strong> test() {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session = <strong>this</strong>.getSession();</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = session.createQuery(" from com.persist.tablePerConcreteClass.TItem").list();</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it = list.iterator();</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>while</strong> (it.hasNext()) {</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TItem item = (TItem) it.next();</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.<em>out</em>.println(item.getName());</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p><font color=#00ccff><strong>(b)</strong> <strong>使用</strong><strong>hibernate</strong><strong>注解<br></strong></font><span>步骤</span><span>1</span><span>，</span> <span>修改</span><span>HibernateSessionFactory </span><span>中的</span><span>Configuration</span><span>为</span></p>
<p><span>AnnotationConfiguration configuration = new AnnotationConfiguration();</span></p>
<p><span>步骤</span><span>2</span><span>，修改</span><span>hibernate.cfg.xml</span><span>中的</span></p>
<p><span>&lt;mapping resource="com/persist/tablePerConcreteClass/TBook.hbm.xml" /&gt;</span></p>
<p><span>&lt;mapping resource="com/persist/tablePerConcreteClass/TDvd.hbm.xml" /&gt;</span></p>
<p><span>为</span></p>
<p><span>&lt;mapping class="com.persist.tablePerConcreteClass.TBook"/&gt;</span></p>
<p><span>&lt;mapping class="com.persist.tablePerConcreteClass.TDvd"/&gt;</span></p>
<p><span>步骤</span><span>3</span><span>，在</span><span>Titem, AbstractTBook, AbstractTBook</span><span>类上加注解</span></p>
<p><span>@MappedSuperclass</span></p>
<p><span>既</span><span>Titem</span></p>
<p align=left><span>@MappedSuperclass</span></p>
<p align=left><strong><span>public</span></strong><span> </span><strong><span>abstract</span></strong><span> </span><strong><span>class</span></strong><span> TItem </span><strong><span>implements</span></strong><span> Serializable {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>@Id</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>@Column</span><span>(name = </span><span>"id"</span><span>)</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>@SequenceGenerator</span><span>(name = </span><span>"t_table_id_seq"</span><span>, sequenceName = </span><span>"t_table_id_seq"</span><span>)</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>private</span></strong><span> Integer </span><span>id</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>@Column</span><span>(name = </span><span>"name"</span><span>)</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>private</span></strong><span> String </span><span>name</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>@Column</span><span>(name = </span><span>"manufacturer"</span><span>)</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>private</span></strong><span> String </span><span>manufacturer</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> Integer getId() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>return</span></strong><span> </span><span>id</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> setId(Integer id) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>this</span></strong><span>.</span><span>id</span><span> = id;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> String getManufacturer() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>return</span></strong><span> </span><span>manufacturer</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> setManufacturer(String manufacturer) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>this</span></strong><span>.</span><span>manufacturer</span><span> = manufacturer;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> String getName() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>return</span></strong><span> </span><span>name</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> setName(String name) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>this</span></strong><span>.</span><span>name</span><span> = name;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p><span>}</span></p>
<p><span>AbstractTDvd</span></p>
<p align=left><span>@<span>MappedSuperclass</span></span></p>
<p align=left><strong><span>public</span></strong><span> </span><strong><span>class</span></strong><span> AbstractTDvd </span><strong><span>extends</span></strong><span> TItem {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>@Column</span><span>(name = </span><span>"codetype"</span><span>)</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>private</span></strong><span> String </span><span>codetype</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> AbstractTDvd() { }</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> String getCodetype() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>return</span></strong><span> </span><strong><span>this</span></strong><span>.</span><span>codetype</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> setCodetype(String codetype) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>this</span></strong><span>.</span><span>codetype</span><span> = codetype;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p><span>}</span></p>
<p><span>AbstractTBook</span></p>
<p align=left><span>@MappedSuperclass</span></p>
<p align=left><strong><span>public</span></strong><span> </span><strong><span>class</span></strong><span> AbstractTBook </span><strong><span>extends</span></strong><span> TItem {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>@Column</span><span>(name = </span><span>"pagecount"</span><span>)</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>private</span></strong><span> Integer </span><span>pagecount</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> AbstractTBook() {}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> Integer getPagecount() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>return</span></strong><span> </span><strong><span>this</span></strong><span>.</span><span>pagecount</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}<span>&nbsp;&nbsp;&nbsp;</span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> <span>setPagecount</span>(Integer pagecount) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><strong><span>this</span></strong><span>.</span><span>pagecount</span><span> = pagecount;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p><span>}</span></p>
<p><span>步骤</span><span>4</span><span>，在</span><span>Tbook,TDvd</span><span>上加注解</span></p>
<p align=left><span>@Entity</span></p>
<p><span>@Table</span><span>(name = </span><span>"t_book"</span><span>)</span></p>
<p><span>和</span></p>
<p align=left><span>@Entity</span></p>
<p><span>@Table</span><span>(name = </span><span>"t_dvd"</span><span>)</span></p>
<p><span>调用的时候一样<br>&nbsp; </p>
<p><strong><span>&lt;</span></strong><strong><span>二</span></strong><strong><span>&gt;</span><span> Table per subclass</span></strong><strong></strong></p>
<p><span>将父类</span><span>Titem</span><span>单独映射到一张主表，而为</span><span>Tbook, TDvd</span><span>分别建立一张子表，子表和父表用外键来关联</span></p>
<p><span>数据库的表我们设计如下</span></p>
<p>
<table cellSpacing=0 cellPadding=0 width=583 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=583 colSpan=3>
            <p><span>表</span> <span>T_item</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=208>
            <p><span>id</span></p>
            </td>
            <td vAlign=top width=81>
            <p><span>Int </span></p>
            </td>
            <td vAlign=top width=294>
            <p><span>PK</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=208>
            <p><span>Name</span></p>
            </td>
            <td vAlign=top width=81>
            <p><span>Varchar(50)</span></p>
            </td>
            <td vAlign=top width=294>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=208>
            <p><span>Manufacturer</span></p>
            </td>
            <td vAlign=top width=81>
            <p><span>Varchar(50)</span></p>
            </td>
            <td vAlign=top width=294>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=583 colSpan=3>
            <p><span>CREATE TABLE t_item</span></p>
            <p><span>(</span></p>
            <p><span>&nbsp;id int4 NOT NULL DEFAULT nextval('t_table_id_seq'::regclass),</span></p>
            <p><span>&nbsp;name varchar(50),</span></p>
            <p><span>&nbsp;manufacturer varchar(50),</span></p>
            <p><span>&nbsp;CONSTRAINT t_item_pkey PRIMARY KEY (id)</span></p>
            <p><span>)</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 cellPadding=0 width=583 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=583 colSpan=3>
            <p><span>表</span> <span>T_bool</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=208>
            <p><span>id</span></p>
            </td>
            <td vAlign=top width=81>
            <p><span>Int </span></p>
            </td>
            <td vAlign=top width=294>
            <p><span>PK</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=208>
            <p><span>Pagecount</span></p>
            </td>
            <td vAlign=top width=81>
            <p><span>int</span></p>
            </td>
            <td vAlign=top width=294>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=583 colSpan=3>
            <p><span>CREATE TABLE t_book</span></p>
            <p><span>(</span></p>
            <p><span>&nbsp;id int4 NOT NULL,</span></p>
            <p><span>&nbsp;pagecount int4,</span></p>
            <p><span>&nbsp;CONSTRAINT t_book_pkey PRIMARY KEY (id),</span></p>
            <p><span>&nbsp;CONSTRAINT t_book_id_fkey FOREIGN KEY (id)</span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>REFERENCES t_item (id) MATCH SIMPLE</span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ON UPDATE NO ACTION ON DELETE NO ACTION</span></p>
            <p><span>)</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 cellPadding=0 width=583 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=583 colSpan=3>
            <p><span>表</span> <span>T_dvd</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p><span>id</span></p>
            </td>
            <td vAlign=top width=81>
            <p><span>Int </span></p>
            </td>
            <td vAlign=top width=399>
            <p><span>PK</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=103>
            <p><span>Codetype</span></p>
            </td>
            <td vAlign=top width=81>
            <p><span>Varchar(30)</span></p>
            </td>
            <td vAlign=top width=399>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=583 colSpan=3>
            <p><span>CREATE TABLE t_dvd</span></p>
            <p><span>(</span></p>
            <p><span>&nbsp;id int4 NOT NULL,</span></p>
            <p><span>&nbsp;codetype varchar(30),</span></p>
            <p><span>&nbsp;CONSTRAINT t_dvd_pkey PRIMARY KEY (id),</span></p>
            <p><span>&nbsp;CONSTRAINT t_dvd_id_fkey FOREIGN KEY (id)</span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;REFERENCES t_item (id) MATCH SIMPLE</span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ON UPDATE NO ACTION ON DELETE NO ACTION</span></p>
            <p><span>)</span></p>
            </td>
        </tr>
    </tbody>
</table>
</span></p>
&nbsp;
<p _fckxhtmljob="2"><strong _fckxhtmljob="2">只有1个xml,TItem.hbm.xml</strong><br _fckxhtmljob="2">&lt;hibernate-mapping&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp; &lt;class name="com.persist.tablePerConcreteClass.TItem" table="t_item"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.Integer"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="id" /&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="sequence"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="sequence"&gt;t_table_id_seq&lt;/param&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="name" type="java.lang.String"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="name" length="50" /&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="manufacturer" type="java.lang.String"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="manufacturer" length="50" /&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;joined-subclass name="com.persist.tablePerConcreteClass.TBook" table="t_book"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key column="id"&gt;&lt;/key&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="pagecount" column="pagecount"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/joined-subclass&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;joined-subclass name="com.persist.tablePerConcreteClass.TDvd" table="t_dvd"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key column="id"&gt;&lt;/key&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="codetype" column="codetype"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/joined-subclass&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br _fckxhtmljob="2">&lt;/hibernate-mapping&gt;<br _fckxhtmljob="2"><strong _fckxhtmljob="2"><u _fckxhtmljob="2">使用注解</u></strong><br _fckxhtmljob="2"><strong _fckxhtmljob="2">1.TItem不为抽象类,TItem的类注解为</strong><br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@Table(name = "t_item")<br _fckxhtmljob="2">@Inheritance(strategy=InheritanceType.JOINED)<br _fckxhtmljob="2"><strong _fckxhtmljob="2">2.AbstractTBook和AbstractTDvd的类注解为</strong><br _fckxhtmljob="2">@PrimaryKeyJoinColumn(name="id")<br _fckxhtmljob="2"><strong _fckxhtmljob="2">3.TBook和TDvd的注解为</strong><br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@Table(name = "t_book")<br _fckxhtmljob="2">和<br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@Table(name = "t_dvd")</p>
<p><strong><span>&lt;</span></strong><strong><span>三</span></strong><strong><span>&gt;</span><span> Table per class hierarchy</span></strong><strong></strong></p>
<p><span>CREATE TABLE t_item</span></p>
<p><span>(</span></p>
<p><span>&nbsp;id int4 NOT NULL DEFAULT nextval('t_table_id_seq'::regclass),</span></p>
<p><span>&nbsp;name varchar(50),</span></p>
<p><span>&nbsp;manufacturer varchar(50),</span></p>
<p><span>&nbsp;category varchar(30),</span></p>
<p><span>&nbsp;codetype varchar(30),</span></p>
<p><span>&nbsp;pagecount int4,</span></p>
<p><span>&nbsp;CONSTRAINT t_item_pkey PRIMARY KEY (id)</span></p>
<p><span>)</span></p>
<p _fckxhtmljob="2"><strong _fckxhtmljob="2">只有一个xml,TItem.hbm.xml</strong><br _fckxhtmljob="2">&lt;hibernate-mapping&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp; &lt;class name="com.persist.tablePerConcreteClass.TItem" table="t_item"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="java.lang.Integer"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="id" /&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="sequence"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;param name="sequence"&gt;t_table_id_seq&lt;/param&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;discriminator&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="category" length="10" /&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/discriminator&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="name" type="java.lang.String"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="name" length="50" /&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="manufacturer" type="java.lang.String"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="manufacturer" length="50" /&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;subclass name="com.persist.tablePerConcreteClass.TBook" discriminator-value="1"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="pagecount" column="pagecount"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/subclass&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;subclass name="com.persist.tablePerConcreteClass.TDvd" discriminator-value="2" &gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="codetype" column="codetype"&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/subclass&gt;<br _fckxhtmljob="2">&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br _fckxhtmljob="2">&lt;/hibernate-mapping&gt;<br _fckxhtmljob="2"><strong _fckxhtmljob="2"><u _fckxhtmljob="2">注解的修改为</u><br _fckxhtmljob="2">1.TItem的注解修改为</strong><br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@Table(name = "t_item")<br _fckxhtmljob="2">@Inheritance(strategy=InheritanceType.SINGLE_TABLE)<br _fckxhtmljob="2">@DiscriminatorColumn(name="category", discriminatorType=DiscriminatorType.STRING, length=30)<br _fckxhtmljob="2"><strong _fckxhtmljob="2">2.AbstractTBook, AbstractTDvd的注解修改为</strong><br _fckxhtmljob="2">@Inheritance<br _fckxhtmljob="2"><strong _fckxhtmljob="2">3.TBook,TDvd的注解修改为</strong><br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@DiscriminatorValue(value="2")</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-12 16:47 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/12/136193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>