<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/foolpid" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/foolpid" type="application/rss+xml"></fs:self_link><lastBuildDate>Wed, 13 May 2009 14:55:39 GMT</lastBuildDate><title>我的博客</title><description>金色的人生 荣耀而又辉煌</description><link>http://www.foolpid.net/</link><language>zh-CN</language><copyright>Copyright 2008 foolpid.net. Some Rights Reserved. [浙ICP备08104763号]</copyright><pubDate>Fri, 15 May 2009 10:02:40 GMT</pubDate><item><title>Hibernate学习笔记7——检索方式</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014588/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=56</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=56&amp;key=9e386fe9</trackback:ping><description>&lt;p&gt;1.Hibernate提供的检索方式：导航对象图检索方式、OID检索方式、HQL检索方式、QBC检索方式和本地SQL检索方式。&lt;br /&gt;导航对象图检索方式：根据已经加载的对象，导航到其他对象。如：getOrders().iterator()。&lt;br /&gt;OID检索方式：按照对象的OID来检索对象。Session的get()和load()提供了此功能。 &lt;br /&gt;HQL检索方式：Query接口是Hibernate提供的专门的HQL查询接口(&lt;em&gt;跨平台,关键字不区分大小写&lt;/em&gt;)。&lt;br /&gt;QBC检索方式：Query By Criteria(&lt;em&gt;跨平台&lt;/em&gt;)。&lt;br /&gt;本地SQL检索方式：使用本地数据库的SQL查询语句。 &lt;br /&gt;&lt;br /&gt;2.HQL和QBC支持多态查询，多态查询是指查询出当前类和所有子类的实例。&lt;br /&gt;from java.lang.Object&lt;br /&gt;多态查询对接口也是用，以下查询对所有实现Serializable接口的实例&lt;br /&gt;from java.io.Serializable &lt;br /&gt;&lt;br /&gt;3.Hibernate采用参数绑定机制，它的优点：&lt;br /&gt;a.非常安全，防止怀有恶意的用户非法调用数据库系统的存储过程。&lt;br /&gt;b.能够利用底层数据库预编译SQL语句的功能，提高查询数据的性能。预编译是指底层数据库系统只编译SQL语句一次，把编译出来的可执行代码保存在缓存中，如果多次执行相同形式的SQL语句，不需要重新编译，只要从缓存中获得可执行代码即可。&lt;br /&gt;绑定的形式：1)、按参数名字绑定 2)、按参数位置绑定&lt;br /&gt;绑定参数类型：&lt;br /&gt;1).setEntity()方法&lt;br /&gt;session.createQuery(&amp;quot;from Order o where o.customer=:customer&amp;quot;).setEntity(&amp;quot;customer&amp;quot;,customer).list(); &lt;br /&gt;2).setParameter()方法&lt;br /&gt;3).setProperties()方法&lt;br /&gt;Customer customer = new Customer();&lt;br /&gt;customer.setName(&amp;quot;foolpid&amp;quot;); &lt;br /&gt;customer.setAge(18);&lt;br /&gt;query = session.createQuery(&amp;quot;from Customer c where c.name=:name and c.age=:age&amp;quot;);&lt;br /&gt;query.setProperties(customer);&lt;br /&gt;&lt;em&gt;日期类型有多种，如果命名参数为日期类型，不能使用setProperties()方法来绑定。&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;4.查询条件&lt;br /&gt;HQL和QBC支持的各种运算&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;634&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;63&quot;&gt;运算类型&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;136&quot;&gt;HQL运算符&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;252&quot;&gt;QBC运算符&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;157&quot;&gt;含义&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot; rowspan=&quot;8&quot;&gt;比较运算&lt;/td&gt;            &lt;td&gt;=&lt;/td&gt;            &lt;td&gt;Expression.eq()&lt;/td&gt;            &lt;td&gt;等于&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;&amp;lt;&amp;gt;&lt;/td&gt;            &lt;td&gt;Expression.not(Expression.eq())&lt;/td&gt;            &lt;td&gt;不等于&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;&amp;gt;&lt;/td&gt;            &lt;td&gt;Expression.gt()&lt;/td&gt;            &lt;td&gt;大于&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;&amp;gt;=&lt;/td&gt;            &lt;td&gt;Expression.ge()&lt;/td&gt;            &lt;td&gt;大于等于&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;&amp;lt;&lt;/td&gt;            &lt;td&gt;Expression.lt()&lt;/td&gt;            &lt;td&gt;小于&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;&amp;lt;=&lt;/td&gt;            &lt;td&gt;Expression.le()&lt;/td&gt;            &lt;td&gt;小于等于&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;is null&lt;/td&gt;            &lt;td&gt;Expression.isNull()&lt;/td&gt;            &lt;td&gt;等于空值&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;is not null&lt;/td&gt;            &lt;td&gt;Expression.isNotNull()&lt;/td&gt;            &lt;td&gt;非空值&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot; rowspan=&quot;4&quot;&gt;范围运算&lt;/td&gt;            &lt;td&gt;in(列表)&lt;/td&gt;            &lt;td&gt;Expression.in()&lt;/td&gt;            &lt;td&gt;等于列表中的某一个值&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;not in(列表)&lt;/td&gt;            &lt;td&gt;Expression.not(Expression.in())&lt;/td&gt;            &lt;td&gt;不等于列表中的任意一个值&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;between 值1 and 值2&lt;/td&gt;            &lt;td&gt;Expression.between()&lt;/td&gt;            &lt;td&gt;大于等于值1并且小于等于值2&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td height=&quot;32&quot;&gt;not between 值1 and 值2&lt;/td&gt;            &lt;td&gt;Expression.not(Expression.between())&lt;/td&gt;            &lt;td&gt;大于等于值1或小于等于值2&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot; height=&quot;32&quot;&gt;字符串模式匹配&lt;/td&gt;            &lt;td&gt;like&lt;/td&gt;            &lt;td&gt;Expression.like()&lt;/td&gt;            &lt;td&gt;字符串模式匹配&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot; rowspan=&quot;3&quot;&gt;逻辑运算&lt;/td&gt;            &lt;td height=&quot;32&quot;&gt;and&lt;/td&gt;            &lt;td&gt;Expression.and()或者Expression.conjunction()&lt;/td&gt;            &lt;td&gt;逻辑与&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td height=&quot;32&quot;&gt;or&lt;/td&gt;            &lt;td&gt;Expression.or()或者Expression.disjunction()&lt;/td&gt;            &lt;td&gt;逻辑或&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td height=&quot;23&quot;&gt;not&lt;/td&gt;            &lt;td&gt;Expression.not()&lt;/td&gt;            &lt;td&gt;逻辑非&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;字符串模式中的通配符&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;636&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;82&quot;&gt;通配符名称&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;118&quot;&gt;通配符&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;416&quot;&gt;作用&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;百分号&lt;/td&gt;            &lt;td&gt;%&lt;/td&gt;            &lt;td&gt;匹配任意类型并且任意长度(可为0)的字符串，如果是中文，则需要两个百分号，即&amp;quot;%%&amp;quot;&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;下划线&lt;/td&gt;            &lt;td&gt;_&lt;/td&gt;            &lt;td&gt;匹配单个任意字符，常用来限制字符串表达式的长度&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MatchMode类包含的各个静态常量实例&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;637&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;155&quot;&gt;匹配模式&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;468&quot;&gt;举例&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;MatchMode.START&lt;/td&gt;            &lt;td&gt;Expression.like(&amp;quot;name&amp;quot;,&amp;quot;T&amp;quot;,MatchMode.START);姓名以&amp;quot;T&amp;quot;开头&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;MatchMode.END&lt;/td&gt;            &lt;td&gt;Expression.like(&amp;quot;name&amp;quot;,&amp;quot;T&amp;quot;,MatchMode.END);姓名以&amp;quot;T&amp;quot;结尾&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;MatchMode.ANYWHERE&lt;/td&gt;            &lt;td&gt;Expression.like(&amp;quot;name&amp;quot;,&amp;quot;T&amp;quot;,MatchMode.ANYWHERE);姓名中包含&amp;quot;T&amp;quot;&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;MatchMode.EXACT&lt;/td&gt;            &lt;td&gt;Expression.like(&amp;quot;name&amp;quot;,&amp;quot;Tom&amp;quot;,MatchMode.EXACT);姓名必须是&amp;quot;Tom&amp;quot;&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;br /&gt;HQL查询支持数学运算表达式，而QBC不支持。&lt;br /&gt;from o where o.price/4-100&amp;gt;50; &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;5.连接查询&lt;br /&gt;HQL与QBC支持的各种连接类型&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;642&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;109&quot;&gt;程序指定查询类型&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;223&quot;&gt;HQL语法&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;154&quot;&gt;QBC运算符&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;311&quot;&gt;使用范围&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;内连接&lt;/td&gt;            &lt;td&gt;inner join或join&lt;/td&gt;            &lt;td&gt;Criteria.createAlias()&lt;/td&gt;            &lt;td rowspan=&quot;6&quot;&gt;适用于有关联关系的持久化类，并且在映射文件中对这种关联关系作了映射&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;迫切内连接&lt;/td&gt;            &lt;td&gt;inner join fetch或者join fetch&lt;/td&gt;            &lt;td&gt;不支持&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;隐式内链接&lt;/td&gt;            &lt;td&gt;&amp;nbsp;&lt;/td&gt;            &lt;td&gt;不支持&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;左外连接&lt;/td&gt;            &lt;td&gt;left out join 或者left join&lt;/td&gt;            &lt;td&gt;不支持&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;迫切左外连接&lt;/td&gt;            &lt;td&gt;left out join fetch或者left join fetch&lt;/td&gt;            &lt;td&gt;FetchMode.EAGER&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;右外连接&lt;/td&gt;            &lt;td&gt;right out join 或者right join&lt;/td&gt;            &lt;td&gt;不支持&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;交叉连接&lt;/td&gt;            &lt;td&gt;Class A,Class B&lt;/td&gt;            &lt;td&gt;不支持&lt;/td&gt;            &lt;td&gt;适用于不存在关联关系的持久化类&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;a.迫切左外连接和迫切内连接不仅指定了连接查询方式，而且显示指定了关联级别的检索策略，而左外连接和内连接仅仅指定了连接查询方式，并没有指定关联级别的检索策略。&lt;br /&gt;&lt;/em&gt;b.迫切左外连接检索策略时，查询结果中可能会包含重复元素，可以通过一个HashSet来过滤重复元素：&lt;br /&gt;HashSet set = new HashSet(result); &lt;em&gt;&lt;br /&gt;c.左外连接获得的是代理，迫切左外连接直接获得了代理类的实例。内链接要求左右数据都存在的。&lt;br /&gt;&lt;/em&gt;d.隐式内链接就如o.customer.name=:name,只使用与多对一和一对一关联，不适合与一对多和多对多关联。&lt;em&gt;&lt;br /&gt;e.交叉连接也即是全连接，表A5条记录，表B7条记录，最后会生成35条记录。&lt;/em&gt;&lt;br /&gt;f.HQL语句总是忽略映射文件中设置的迫切左外连接检索策略，即使映射文件中设置了迫切左外连接检索策略，如果HQL语句中没有显示指定这种策略，那么HQL仍然采用立即检索策略。&lt;br /&gt;&lt;br /&gt;HQL在各种连接方式下的运行时行为&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;648&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;82&quot;&gt;连接方式&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;118&quot;&gt;对应的SQL查询语句&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;118&quot;&gt;Orders集合的检索策略&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;304&quot;&gt;查询结果集中的内容&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;默认情况&lt;/td&gt;            &lt;td&gt;查询单个Customer表&lt;/td&gt;            &lt;td&gt;延迟检索策略&lt;/td&gt;            &lt;td&gt;集合中包含Customer类型的元素；集合中无重复元素；Customer对象的orders集合没有被初始化&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;迫切左外连接&lt;/td&gt;            &lt;td&gt;左外连接查询Customer和Orders表&lt;/td&gt;            &lt;td&gt;迫切左外连接检索策略&lt;/td&gt;            &lt;td&gt;集合中包含Customer类型的元素；集合中可能有重复元素；Customer对象的orders集合被初始化&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;左外连接&lt;/td&gt;            &lt;td&gt;左外连接查询Customer和Orders表&lt;/td&gt;            &lt;td&gt;延迟检索策略&lt;/td&gt;            &lt;td&gt;集合中包含对象数组类型的元素，每个对象数组包含一对Customer对象和Order对象，不同的对象数组可能重复引用同一个Customer对象；Customer对象的Orders没有被初始化&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;内连接&lt;/td&gt;            &lt;td&gt;内连接查询Customer和Orders表&lt;/td&gt;            &lt;td&gt;延迟检索策略&lt;/td&gt;            &lt;td&gt;集合中包含对象数组类型的元素，每个对象数组包含一对Customer对象和Order对象，不同的对象数组可能重复引用同一个Customer对象；Customer对象的Orders没有被初始化&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;迫切内连接&lt;/td&gt;            &lt;td&gt;内连接查询Customer和Orders表&lt;/td&gt;            &lt;td&gt;迫切内连接检索策略&lt;/td&gt;            &lt;td&gt;集合中包含Customer类型的元素；集合中可能有重复元素；Customer对象的orders集合被初始化&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;右外连接&lt;/td&gt;            &lt;td&gt;右外连接查询Customer和Orders表&lt;/td&gt;            &lt;td&gt;延迟检索策略&lt;/td&gt;            &lt;td&gt;集合中包含对象数组类型的元素，每个对象数组包含一对Customer对象和Order对象，不同的对象数组可能重复引用同一个Customer对象；Customer对象的Orders没有被初始化&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6.聚集函数&lt;br /&gt;count()、min()、max()、sum()、avg()&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;7.集合过滤&lt;br /&gt;对于已经加载的Customer持久化对象，假定它的orders集合由于延迟检索策略而没有被初始化，那么调用customer.getOrders().iterator()方法就可以初始化，但存在两个不足：&lt;br /&gt;a).假定customer对象有1000个关联，但只需要其中几个，不需要加载其他数据&lt;br /&gt;b).不能对Order对象排序&lt;br /&gt;解决办法：&lt;br /&gt;1).通过HQL或QBC查询orders集合&lt;br /&gt;session.createQuery(&amp;quot;from Order o where o.customer=:customer and o.price&amp;gt;100 order by o.price&amp;quot;).setEntity(&amp;quot;customer&amp;quot;,customer).list();&lt;br /&gt;2).使用集合过滤&lt;br /&gt;List result = session.createFilter(customer.getOrders(),&amp;quot;where this.price&amp;gt;100 order by this.price&amp;quot;).list();&lt;br /&gt;Iterator it = result.iterator();&lt;br /&gt;while(it.hasNext()) {&lt;br /&gt;Order o = (Order)it.next(); &lt;br /&gt;......&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;集合过滤特点：&lt;br /&gt;a.它返回Query类型的实例&lt;br /&gt;b.它的第一个参数指定持久化对象的集合，这个集合是否已经被初始化并没有关系，但它所属的对象必须处于持久化状态。&lt;br /&gt;c.它的第二个参数指定过滤条件 &lt;br /&gt;d.不管持久化对象的集合是否已经被持久化，Query的list()方法都会执行SQL语句查询，到数据库中检索Order对象。 &lt;br /&gt;e.如果Customer对象的orders集合已经被初始化，Query的list()方法不会创建order对象，仅仅返回已经存在的Order对象的引用。&lt;br /&gt;f.如果Customer对象的orders集合没有被初始化，Query的list()方法会创建Order对象，但不会初始化Customer对象的orders集合。&lt;br /&gt;&lt;br /&gt;集合过滤其他用途：&lt;br /&gt;1).为Customer对象的orders 集合分页&lt;br /&gt;session.createFilter(customer.getOrders(),&amp;quot;order by this.price asc&amp;quot;).setFirstResult(10).setMaxResults(50).list();&lt;br /&gt;2).检索Customer对象的orders集合中Order对象的订单编号&lt;br /&gt;session.createFilter(customer.getOrders(),&amp;quot;select this.orderNumber&amp;quot;).list();&lt;br /&gt;3).检索数据库中与Customer对象的orders集合中Order对象的价格相同的所有Order对象&lt;br /&gt;session.createFilter(customer.getOrders().&amp;quot;select other from Order other where other.price = this.price&amp;quot;).list();&lt;br /&gt;4).检索Order对象的lineItems集合中LineItem对象的Item：&lt;br /&gt;session.createFilter(order.getLineItems(),&amp;quot;select this.item&amp;quot;).list();&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;8.如果自查询语句返回多条记录，可以用一下关键字来量化&lt;br /&gt;all：表示子查询语句返回的所有记录&lt;br /&gt;any：表示子查询语句返回的任意一条记录&lt;br /&gt;some：与any等价&lt;br /&gt;in：与any等价&lt;br /&gt;exists：表示子查询语句至少返回一条记录&lt;br /&gt;//返回所有订单的价格都小于100的客户&lt;br /&gt;from Customer c where 100&amp;gt;all(select o.price from c.orders o) &lt;br /&gt;//返回有一条定的那的价格小于100的客户&lt;br /&gt;from Customer c where 100&amp;gt;any(select o.price from c.orders o) &lt;br /&gt;//至少返回有一条订单的客户&lt;br /&gt;from Customer c where exists(from c.orders) &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;HQL提供了一组操作集合的函数或者属性：&lt;br /&gt;size()函数或size属性：获得集合中元素的数目&lt;br /&gt;minIndex()函数或minIndex属性：对于建立索引的集合，获得最小的索引&lt;br /&gt;maxIndex()函数或maxIndex属性：对于建立索引的集合，获得最大的索引&lt;br /&gt;minElement()函数或minElement属性：对于包含基本类型元素的集合，获得集合中取值最小的元素&lt;br /&gt;maxElement()函数或maxElement属性：对于包含基本类型元素的集合，获得集合中取值最大的元素&lt;br /&gt;elements()函数：获得集合中所有元素&lt;/strong&gt;&lt;br /&gt;eg：&lt;br /&gt;from Customer c where c.orders.&lt;strong&gt;size&lt;/strong&gt;&amp;gt;0&lt;br /&gt;from Customer c where &lt;strong&gt;size&lt;/strong&gt;(c.orders)&amp;gt;0 &lt;br /&gt;from Customer c where :order in elements(c.orders) &lt;br /&gt;&lt;br /&gt;9.本地SQL查询&lt;br /&gt;String sql = &amp;quot;select {c.*},{o.*} from CUSTOMERS c inner join ORDERS o where c.ID=o.CUSTOMER_ID&amp;quot;;&lt;br /&gt;Query query = session.createSQLQuery(sql,new String[]{&amp;quot;c&amp;quot;,&amp;quot;o&amp;quot;},new Class[]{Customer.class,Order.class}); &lt;br /&gt;&lt;br /&gt;10.查询性能优化&lt;br /&gt;1).降低访问数据库的频率，减少select语句的数目&lt;br /&gt;a.使用迫切左外连接或迫切内连接检索策略&lt;br /&gt;b.对延迟检索或立即检索策略设置批量检索数目&lt;br /&gt;c.使用查询缓存(如果查询结果中包含实体，二级缓存中会存放实体的OID，对于投影查询，二级缓存中存放所有的数据值)&lt;br /&gt;2).避免多余加载程序不需要访问的数据&lt;br /&gt;a.使用延迟检索策略&lt;br /&gt;b.使用集合过滤&lt;br /&gt;3).避免包庇啊哦查询数据占用缓存，实现手段为投影查询功能，查询出实体的部分属性&lt;br /&gt;4).减少select语句的字段，从而降低访问数据库的数据量，实现手段为利用Query的iterate()方法。&lt;br /&gt;&lt;br /&gt;11.试比较HQL与QBC的优缺点&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;636&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;82&quot;&gt;通配符名称&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;270&quot;&gt;HQL检索方式&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;264&quot;&gt;QBC检索方式&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;可读性&lt;/td&gt;            &lt;td&gt;优点：和SQL查询语言比较接近，比如容易读懂&lt;/td&gt;            &lt;td&gt;缺点：QBC把查询语句肢解为一组Criterion实例，可读性差&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;功能&lt;/td&gt;            &lt;td&gt;优点：功能最强大，支持各种各样的查询&lt;/td&gt;            &lt;td&gt;缺点：没有HQL的功能强大，例如不支持报表查询和子查询，而且对连接查询也做了很多限制&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;查询语句形式&lt;/td&gt;            &lt;td&gt;缺点：应用程序必须提供基于字符串形式的HQL查询语句&lt;/td&gt;            &lt;td&gt;优点：QBC检索方式封装了基于字符串形式的查询语句，提供了更加面向对象的接口&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;何时被解析&lt;/td&gt;            &lt;td&gt;缺点：HQL查询语句具有在运行时才会被解析&lt;/td&gt;            &lt;td&gt;优点：QBC在编译时就能被编译，因此更加容易排错&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;可扩展性&lt;/td&gt;            &lt;td&gt;缺点：不具有扩展性&lt;/td&gt;            &lt;td&gt;优点：允许用户扩展Criterion接口&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;对动态查询语句的支持&lt;/td&gt;            &lt;td&gt;缺点：尽管支持生成动态查询语句，但是编程很麻烦&lt;/td&gt;            &lt;td&gt;优点：适合于生成动态查询语句&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/217014588/foolpid/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/foolpid/~7159750/217014588/5268593/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot;/&gt;</description><category>Hibernate</category><pubDate>Wed, 13 May 2009 22:55:39 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/56.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/56.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/56.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014588/5268593</fs:itemid></item><item><title>Hibernate学习笔记6——检索策略</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014589/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=55</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=55&amp;key=1e4e88e2</trackback:ping><description>&lt;p&gt;1.Hibernate的检索策略简介&lt;br /&gt;&lt;br /&gt;类级别和关联级别可选的检索策略及默认的检索策略&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;655&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;128&quot;&gt;检索策略的作用域&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;115&quot;&gt;可选的检索策略&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;181&quot;&gt;默认的检索策略&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;205&quot;&gt;运行时行为受影响的Session的检索方法&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;类级别&lt;/td&gt;            &lt;td&gt;立即检索&lt;br /&gt;            延迟检索&lt;/td&gt;            &lt;td&gt;立即检索&lt;/td&gt;            &lt;td&gt;仅影响load()方法&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot; rowspan=&quot;2&quot;&gt;关联级别&lt;/td&gt;            &lt;td rowspan=&quot;2&quot;&gt;立即检索&lt;br /&gt;            延迟检索&lt;br /&gt;            迫切左外连接检索&lt;/td&gt;            &lt;td&gt;多对一和一对一为外连接检索&lt;/td&gt;            &lt;td rowspan=&quot;2&quot;&gt;影响load()、get()和find()方法&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;一对多和多对多为立即检索&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3种检索策略的运行机制&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;655&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;111&quot;&gt;检索策略的类型&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;175&quot;&gt;类级别&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;349&quot;&gt;关联级别&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;立即检索&lt;/td&gt;            &lt;td&gt;立即加载检索方法指定的对象&lt;/td&gt;            &lt;td&gt;立即加载与检索方法指定的对象关联的对象。可以设定批量检索数量&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;延迟检索&lt;/td&gt;            &lt;td&gt;延迟加载检索方法指定的对象&lt;/td&gt;            &lt;td&gt;延迟加载与检索方法指定的对象关联的对象。可以设定批量检索数量&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;迫切左外连接检索&lt;/td&gt;            &lt;td&gt;不使用&lt;/td&gt;            &lt;td&gt;通过左外连接加载与检索方法指定的对象关联的对象&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;映射文件中用于设定检索策略的几个属性&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;655&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;71&quot;&gt;属性&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;117&quot;&gt;可选值&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;168&quot;&gt;默认值&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;273&quot;&gt;描述&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;lazy&lt;/td&gt;            &lt;td&gt;true或false&lt;/td&gt;            &lt;td&gt;false&lt;/td&gt;            &lt;td&gt;如果为true，表示使用延迟检索策略。在&amp;lt;class&amp;gt;和&amp;lt;set&amp;gt;元素中包含此属性&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;outer-join&lt;/td&gt;            &lt;td&gt;auto、true或false&lt;/td&gt;            &lt;td&gt;在&amp;lt;many-to-one&amp;gt;和&amp;lt;one-to-one&amp;gt;元素中为auto，在&amp;lt;set&amp;gt;元素中为false&lt;/td&gt;            &lt;td&gt;如果为true，表示使用迫切左外连接的检索策略。在&amp;lt;many-to-one&amp;gt;、&amp;lt;one-to-one&amp;gt;和&amp;lt;set&amp;gt;元素中包含此属性&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;batch-size&lt;/td&gt;            &lt;td&gt;正数值&lt;/td&gt;            &lt;td&gt;1&lt;/td&gt;            &lt;td&gt;设定批量检索的数量。如果设定此项，合理的取值在3~10之间。仅适用于关联级别的立即检索和延迟检索。&lt;strong&gt;在&amp;lt;class&amp;gt;和&amp;lt;set&amp;gt;元素中包含此属性&lt;/strong&gt;&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;br /&gt;延迟检索策略能避免多余加载应用程序不需要访问的关联对象，迫切左外连接检索策略则充分利用了SQL的外连接查询功能，能够减少select语句的数目。&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;在多数情况下，如果程序代码没有显式设定检索策略，则采用映射文件中配置的检索策略。但也有例外，HQL检索方式会忽略映射文件配置的迫切左外连接检索策略。&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;1).在&amp;lt;class&amp;gt;元素中设置lazy的属性为true，如果加载Customer对象在数据库中不存在时，Session的load()方法不会抛出异常，只有当运行customer.getName()方法时才会抛出LazyInitializer的异常。&lt;br /&gt;2).Customer代理类的实例在Session范围内才能被初始化。以下程序也会抛出LazyIntializer的异常。&lt;br /&gt;tx = session.beginTransaction();&lt;br /&gt;customer = (Customer)session.load(Customer.class,new Long(1)); &lt;br /&gt;tx.commit();&lt;br /&gt;session.close();&lt;br /&gt;&lt;em&gt;customer.getName();//这句话会抛出异常&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;3). Hibernate.initialize(customer.getOrders());只有在Session范围内才能被初始化。&lt;br /&gt;4).不管Customer.hbm.xml文件的&amp;lt;class&amp;gt;元素的lazy属性是true还是false，&lt;em&gt;&lt;strong&gt;Session的get()和find()方法在Customer类级别总是使用立即检索策略&lt;/strong&gt;&lt;/em&gt;。get()方法永远不会返回Customer代理类实例，这是与load()方法的不同之处。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.一对多和多对多关联的检索策略&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;655&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;107&quot;&gt;lazy属性&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;98&quot;&gt;outer-join属性&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;430&quot;&gt;检索策略&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;false&lt;/td&gt;            &lt;td&gt;false&lt;/td&gt;            &lt;td&gt;采用立即检索策略，这是默认的检索策略，当使用Hibernate的二级缓存时，可以考虑使用立即检索。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;false&lt;/td&gt;            &lt;td&gt;true&lt;/td&gt;            &lt;td&gt;采用迫切左外连接检索。在Hibernate2.x版本，在映射文件中如果有对个&amp;lt;set&amp;gt;元素，只允许一个&amp;lt;set&amp;gt;元素的outer-join属性为true&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;true&lt;/td&gt;            &lt;td&gt;false&lt;/td&gt;            &lt;td&gt;采用延迟策略，这是有线考虑使用的检索策略&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;true&lt;/td&gt;            &lt;td&gt;true&lt;/td&gt;            &lt;td&gt;没有任何意义&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.多对一和一对一关联的检索策略&lt;br /&gt;&lt;br /&gt;设置多对一关联的检索策略&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;655&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;186&quot;&gt;Order的&amp;lt;many-to-one&amp;gt;元素的out-join属性&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;213&quot;&gt;Customer的&amp;lt;class&amp;gt;元素的lazy属性&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;236&quot;&gt;检索Order对象时关联的Customer对象使用的检索策略&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;auto&lt;/td&gt;            &lt;td&gt;true&lt;/td&gt;            &lt;td&gt;延迟检索&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;auto&lt;/td&gt;            &lt;td&gt;false&lt;/td&gt;            &lt;td&gt;迫切左外连接检索&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;true&lt;/td&gt;            &lt;td&gt;true&lt;/td&gt;            &lt;td&gt;迫切左外连接检索&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;true&lt;/td&gt;            &lt;td&gt;false&lt;/td&gt;            &lt;td&gt;迫切左外连接检索&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;false&lt;/td&gt;            &lt;td&gt;true&lt;/td&gt;            &lt;td&gt;延迟检索&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;false&lt;/td&gt;            &lt;td&gt;false&lt;/td&gt;            &lt;td&gt;立即检索&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果select语句中的外连接表的数目太多，会影响检索性能，此时可通过Hibernate配置文件中的hibernate.max_fetch_depth属性来控制外连接的深度。&lt;br /&gt;&lt;br /&gt;对于一对一关联，如果使用延迟加载策略，必须把&amp;lt;one-to-one&amp;gt;元素的constrained属性设置为true。&lt;br /&gt;&amp;lt;one-to-one name=&amp;quot;customer&amp;quot; class=&amp;quot;mypack.Customer&amp;quot; &lt;strong&gt;constrained=&amp;quot;true&amp;quot; &lt;/strong&gt;/&amp;gt; &lt;br /&gt;&lt;br /&gt;4.三种检索策略优缺点&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;655&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;99&quot;&gt;检索策略&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;156&quot;&gt;优点&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;168&quot;&gt;缺点&lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;206&quot;&gt;优先考虑的场合&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;立即检索&lt;/td&gt;            &lt;td&gt;对应用程序完全透明，不管对象处于持久化状态，还是游离状态，应用程序都可以方便地从一个对象导航到它关联的对象&lt;/td&gt;            &lt;td&gt;(1).select语句数目多&lt;br /&gt;            (2).可能会加载应用程序不需要访问的对象，白白浪费许多内存空间&lt;/td&gt;            &lt;td&gt;(1).类级别&lt;br /&gt;            (2).应用程序需要立即访问的对象&lt;br /&gt;            (3).使用了二级缓存&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;延迟检索&lt;/td&gt;            &lt;td&gt;由应用程序决定需要加载哪些对象，可以避免多余的select语句，以及避免加载应用程序不需要访问的对象。因此能提高检索性能，并且能节省内存空间&lt;/td&gt;            &lt;td&gt;应用程序如果希望访问游离状态的代理类实例，必须保证它在持久化状态时已经被初始化&lt;/td&gt;            &lt;td&gt;(1).一对多或在多对多关联&lt;br /&gt;            (2).应用程序不需要立即访问或者根本不会访问的对象&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;迫切左外连接检索&lt;/td&gt;            &lt;td&gt;(1).对应用程序完全透明，不管对象处理持久化状态还是游离状态，应用程序都可以方便地从一个对象导航到它关联的对象&lt;br /&gt;            (2).使用了外连接，select语句数目少&lt;/td&gt;            &lt;td&gt;(1).可能会加载应用程序不需要访问的对象，白白浪费了许多内存空间&lt;br /&gt;            (2).复杂的数据库表连接会影响检索性能&lt;/td&gt;            &lt;td&gt;(1).多对一或者一对一关联&lt;br /&gt;            (2).应用程序需要立即访问的对象&lt;br /&gt;            (3).数据库系统具有良好的表连接性能&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/217014589/foolpid/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/foolpid/~7159750/217014589/5268593/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot;/&gt;</description><category>Hibernate</category><pubDate>Tue, 12 May 2009 22:31:09 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/55.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/55.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/55.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014589/5268593</fs:itemid></item><item><title>Eclipse常用插件列表</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014590/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=54</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=54&amp;key=30dd6bff</trackback:ping><description>&lt;p&gt;1.源代码管理svn插件&lt;br /&gt;&lt;br /&gt;Update site：http://subclipse.tigris.org/update_1.4.x&lt;br /&gt;&lt;br /&gt;默认使用JavaHL接口，如果使用中没有问题的话，最好别切换：&lt;br /&gt;&lt;br /&gt;&lt;img height=&quot;49&quot; alt=&quot;&quot; width=&quot;239&quot; src=&quot;/upload/2009/5/svn_tools.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.反编译Jodeclipse与JadClipse插件&lt;br /&gt;&lt;br /&gt;Jodeclipse是Jode的Eclipse插件，JadClipse是Jad的Eclipse插件，它们都是非常好的反编译插件。&lt;br /&gt;&lt;br /&gt;Jodeclipse安装方法 &lt;br /&gt;（1）从如下地址下载： &lt;br /&gt;http://sourceforge.net/projects/jodeeclipse &lt;br /&gt;把下载下来的文件jodeplugin_1.0.5.zip直接解压到eclipse的plugins目录下。 &lt;br /&gt;&lt;br /&gt;（2）启动eclipse，help -&amp;gt; Software Updates-&amp;gt; Find and Install... -&amp;gt; Search for new features to install,单击&amp;quot;New Remote Site...&amp;quot; 在URL栏输入 http://www.technoetic.com/eclipse/update然后下一步，就可以看到&amp;ldquo;jode decompiler plugin *.*&amp;rdquo;，选上安装就可以了。安装好后可以看到Window -&amp;gt; Preferences...-&amp;gt; Java -&amp;gt; Jode Decompiler选项卡，okay，安装成功了。 &lt;br /&gt;&lt;br /&gt;JadClipse安装方法(&lt;a target=&quot;_blank&quot; href=&quot;http://www.foolpid.net/upload/2009/5/jad_jadclipse.rar&quot;&gt;直接下载&lt;/a&gt;)&lt;br /&gt;(1).下载&lt;span lang=&quot;EN-US&quot; xml:lang=&quot;EN-US&quot;&gt;Jad&lt;/span&gt;反编译工具，然后建议将jad.exe文件复制到%JAVA_HOME%\BIN目录下面（不过可以将jad.exe随便放到哪，只要记住路径就好，下面要用到）。 &lt;br /&gt;(2).下载jadclipse_3.3.0.jar（http://prdownloads.sourceforge.net/jadclipse/net.sf.jadclipse_3.3.0.jar?download）并解压到eclipse的plugins目录下。&lt;br /&gt;(3).启动eclipse，打开：Window-&amp;gt;Preferences-&amp;gt;Java-&amp;gt;JadClipse.设置反编译工具jad的全路径名Path to decompiler，比如：%JAVA_HOME%\bin\jad.exe&lt;br /&gt;&lt;br /&gt;共同配置：如果没有默认,可以在Window-&amp;gt; Preferences... -&amp;gt; General -&amp;gt; Editors -&amp;gt; File Associations找到&amp;quot;*.class&amp;quot;在&amp;quot;Associated editors&amp;quot;里面可以看到&amp;quot;Jode class file viewer&amp;quot;选中它再单击Default按钮.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.代码段折叠Cold Folding插件（比eclipse自带的更多） &lt;br /&gt;&lt;br /&gt;Update site：http://eclipse.realjenius.com/update-site&lt;br /&gt;&lt;br /&gt;安装完成后，打开Window-&amp;gt; Preferences... -&amp;gt; Java -&amp;gt; Editor -&amp;gt; Folding下设置。&lt;br /&gt;&lt;br /&gt;step1.&lt;br /&gt;&lt;img height=&quot;368&quot; alt=&quot;&quot; width=&quot;577&quot; src=&quot;/upload/2009/5/cold_folding_1.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;step2.&lt;br /&gt;&lt;img height=&quot;362&quot; alt=&quot;&quot; width=&quot;568&quot; src=&quot;/upload/2009/5/cold_folding_2.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;step3.&lt;br /&gt;&lt;img height=&quot;153&quot; alt=&quot;&quot; width=&quot;572&quot; src=&quot;/upload/2009/5/cold_folding_3.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;4.域模型中使用的toString、equals和compareTo插件&lt;br /&gt;&lt;br /&gt;插件的官方网址 &lt;a href=&quot;http://www.jiayun.org/mediawiki/entry/Commons4E&quot;&gt;http://www.jiayun.org/mediawiki/entry/Commons4E&lt;/a&gt;&lt;br /&gt;Update site：&lt;a title=&quot;http://www.jiayun.org/commons4e/updatesite31/&quot; rel=&quot;nofollow&quot; href=&quot;http://www.jiayun.org/commons4e/updatesite31/&quot;&gt;http://www.jiayun.org/commons4e/updatesite31&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;插件安装完成后，创建一个类文件，在编辑器按右键，在弹出的菜单上会看到Commons4E lang这一项,如下图:&lt;br /&gt;&lt;br /&gt;&lt;img height=&quot;211&quot; alt=&quot;&quot; width=&quot;610&quot; src=&quot;/upload/2009/5/common4e_1.jpeg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;5.findbugs&lt;br /&gt;&lt;br /&gt;Update site：http://findbugs.cs.umd.edu/eclipse-daily&lt;br /&gt;&lt;br /&gt;安装完成后点击右键即可使用：&lt;br /&gt;&lt;img height=&quot;84&quot; alt=&quot;&quot; width=&quot;441&quot; src=&quot;/upload/2009/5/find_bugs_1.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;查处来的错误提示，双击一下就能找到bug对应的地方了。&lt;br /&gt;&lt;br /&gt;&lt;img height=&quot;174&quot; alt=&quot;&quot; width=&quot;712&quot; src=&quot;/upload/2009/5/find_bugs_2.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description><category>Java Web</category><pubDate>Wed, 06 May 2009 22:49:32 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/54.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/54.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/54.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014590/5268593</fs:itemid></item><item><title>Hibernate学习笔记5——对象关系映射</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014591/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=53</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=53&amp;key=d3b95268</trackback:ping><description>&lt;p&gt;一、映射组成关系&lt;br /&gt;&lt;br /&gt;1.聚集关系：在域模型中，部分类的对象的生命周期依赖于整体类的对象的生命周期，当整体消失时，部分也就随之消失。这种整体与部分的关系为&lt;strong&gt;聚集关系&lt;/strong&gt;。例如：计算机系统就是一个聚集体，它由主机、键盘、鼠标等组成。&lt;br /&gt;表现形式-&amp;gt;&lt;strong&gt;空心菱形箭头&lt;/strong&gt;表示。&lt;br /&gt;&lt;br /&gt;2.组成关系：在有些情况下，部分类的对象可以被多个整体类的对象共享，比如电视机和录像机共用一个遥控器。或者一个部分类的对象只能属于一个整体类的特定对象，例如人和手是整体和部分的关系。如果部分只能属于特定的整体，这种聚集关系也称为&lt;strong&gt;组成关系&lt;/strong&gt;。表现形式-&amp;gt;&lt;strong&gt;实心菱形箭头&lt;/strong&gt;表示。 &lt;br /&gt;&lt;br /&gt;3.组成关系在hbm文件中的写法&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;572&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;public class Customer implements Serializable{&lt;br /&gt;            private Address homeAddress;&lt;br /&gt;            //get、set方法省略 &lt;br /&gt;            }&lt;br /&gt;            public class Address implements Serializable{&lt;br /&gt;            private Customer customer; &lt;br /&gt;            private String province;&lt;br /&gt;            private String city;&lt;br /&gt;            private String street;&lt;br /&gt;            private String zipcode; &lt;br /&gt;            //get、set方法省略&lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            //hbm文件配置信息：&lt;br /&gt;            &amp;lt;component name=&amp;quot;homeAddress&amp;quot; class=&amp;quot;mypack.Address&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;parent name=&amp;quot;customer&amp;quot; /&amp;gt; //指定Address所属的整体类&lt;br /&gt;            &amp;lt;property name=&amp;quot;street&amp;quot; type=&amp;quot;string&amp;quot; column=&amp;quot;HOME_STREET&amp;quot; /&amp;gt; &lt;br /&gt;            &amp;lt;property name=&amp;quot;city&amp;quot; type=&amp;quot;string&amp;quot; column=&amp;quot;HOME_CITY&amp;quot; /&amp;gt; &lt;br /&gt;            &amp;lt;property name=&amp;quot;province&amp;quot; type=&amp;quot;string&amp;quot; column=&amp;quot;HOME_PROVINCE&amp;quot; /&amp;gt; &lt;br /&gt;            &amp;lt;property name=&amp;quot;zipcode&amp;quot; type=&amp;quot;string&amp;quot; column=&amp;quot;HOME_ZIPCODE&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/component&amp;gt; &lt;br /&gt;            &amp;nbsp;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4.值(Value)类型与实体(Entity)类型&lt;br /&gt;值类型与实体类型的最重要的区别是值类型没有OID，不能被单独持久化，它的生命周期依赖于所属的持久化类的对象的生命周期，组件类型就是一种值类型；而实体类型有OID，可以被单独持久化。&lt;br /&gt;在通过Configuration类的addClass()方法加载映射文件时，只需要加载Customer.class类，而不需要单独加载Address.class组件类。&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;Configuration config = new Configuration();&lt;br /&gt;            &lt;strong&gt;config.addClass(Customer.class); &lt;/strong&gt;&lt;br /&gt;            sessionFactory = config.buildSessionFactory();&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;二、Hibernate的内置映射类型&lt;br /&gt;&lt;br /&gt;1.Hibernate映射类型分为两种：内置映射类型和客户化映射类型。内置映射类型负责把一些常见的Java类型映射到相应的SQL类型。&lt;br /&gt;&lt;br /&gt;2.Java基本类型的Hibernate映射类型&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;580&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;79&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Hibernate映射类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;255&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Java类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;90&quot;&gt;            &lt;div align=&quot;center&quot;&gt;标准SQL类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;130&quot;&gt;            &lt;div align=&quot;center&quot;&gt;大小和取值范围&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;integer或int&lt;/td&gt;            &lt;td&gt;int或java.lang.Integer&lt;/td&gt;            &lt;td&gt;INTEGER&lt;/td&gt;            &lt;td&gt;4字节，-2^31-2^31-1&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;long&lt;/td&gt;            &lt;td&gt;long或java.lang.Long&lt;/td&gt;            &lt;td&gt;BIGINT&lt;/td&gt;            &lt;td&gt;8字节，-2^63-2^63-1&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;short&lt;/td&gt;            &lt;td&gt;short或者java.lang.Short&lt;/td&gt;            &lt;td&gt;SMALLINT&lt;/td&gt;            &lt;td&gt;2字节，-2^15-2^15-1&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;byte&lt;/td&gt;            &lt;td&gt;byte或者java.lang.Byte&lt;/td&gt;            &lt;td&gt;TINYINT&lt;/td&gt;            &lt;td&gt;1字节，-2^7-2^7-1&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;float&lt;/td&gt;            &lt;td&gt;float或者java.lang.Float&lt;/td&gt;            &lt;td&gt;FLOAT&lt;/td&gt;            &lt;td&gt;4字节，单精度浮点数&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;double&lt;/td&gt;            &lt;td&gt;double或者java.lang.Double&lt;/td&gt;            &lt;td&gt;DOUBLE&lt;/td&gt;            &lt;td&gt;8字节，双精度浮点数&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;big_decimal&lt;/td&gt;            &lt;td&gt;java.math.BigDecimal&lt;/td&gt;            &lt;td&gt;NUMERIC&lt;/td&gt;            &lt;td&gt;NUMERIC(8,2),表示共8位，其中小数部分占2位&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;character&lt;/td&gt;            &lt;td&gt;char或者java.lang.Character,java.lang.String&lt;/td&gt;            &lt;td&gt;CHAR(1)&lt;/td&gt;            &lt;td&gt;定长字符&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;string&lt;/td&gt;            &lt;td&gt;java.lang.String&lt;/td&gt;            &lt;td&gt;VARCHAR&lt;/td&gt;            &lt;td&gt;变长字符串&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;boolean&lt;/td&gt;            &lt;td&gt;boolean或者java.lang.Boolean&lt;/td&gt;            &lt;td&gt;BIT&lt;/td&gt;            &lt;td&gt;布尔类型&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;yes_no&lt;/td&gt;            &lt;td&gt;boolean或者java.lang.Boolean&lt;/td&gt;            &lt;td&gt;CHAR(1)('Y'或者'N')&lt;/td&gt;            &lt;td&gt;布尔类型&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot; height=&quot;38&quot;&gt;true_false&lt;/td&gt;            &lt;td&gt;boolean或者java.lang.Boolean&lt;/td&gt;            &lt;td&gt;CHAR(1)('T'或者'F')&lt;/td&gt;            &lt;td&gt;布尔类型&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.Java时间和日期类型的Hibernate映射类型&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;572&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;91&quot;&gt;            &lt;div align=&quot;center&quot;&gt;映射类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;170&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Java类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;92&quot;&gt;            &lt;div align=&quot;center&quot;&gt;标准SQ L类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;193&quot;&gt;            &lt;div align=&quot;center&quot;&gt;描述&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;date&lt;/td&gt;            &lt;td&gt;java.util.Date或java.sql.Date&lt;/td&gt;            &lt;td&gt;DATE&lt;/td&gt;            &lt;td&gt;代表日期，形式：YYYY-MM-DD&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;time&lt;/td&gt;            &lt;td&gt;            &lt;p&gt;java.util.Date或java.sql.Time&lt;/p&gt;            &lt;/td&gt;            &lt;td&gt;TIME&lt;/td&gt;            &lt;td&gt;代表时间，形式为：HH:MM:SS&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;timestamp&lt;/td&gt;            &lt;td&gt;java.util.Date或java.sql.Timestamp&lt;/td&gt;            &lt;td&gt;TIMESTAMP&lt;/td&gt;            &lt;td&gt;代表日期和时间，形式：YYYYMMDDHHMMSS&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;calendar&lt;/td&gt;            &lt;td&gt;java.util.Calendar&lt;/td&gt;            &lt;td&gt;TIMESTAMP&lt;/td&gt;            &lt;td&gt;同上&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;calendar_date&lt;/td&gt;            &lt;td&gt;java.util.Calendar&lt;/td&gt;            &lt;td&gt;DATE&lt;/td&gt;            &lt;td&gt;代表日期，形式：YYYY-MM-DD&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4.Java大对象类型Hibernate映射类型&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;571&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;84&quot;&gt;            &lt;div align=&quot;center&quot;&gt;映射类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;192&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Java类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;124&quot;&gt;            &lt;div align=&quot;center&quot;&gt;标准SQL类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;70&quot;&gt;            &lt;div align=&quot;center&quot;&gt;MySQL类型&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;69&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Oracle类型&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;binary&lt;/td&gt;            &lt;td&gt;byte[]&lt;/td&gt;            &lt;td&gt;VARBINARY(或BLOB)&lt;/td&gt;            &lt;td&gt;BLOB&lt;/td&gt;            &lt;td&gt;BLOB&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;text&lt;/td&gt;            &lt;td&gt;            &lt;p&gt;java.lang.String&lt;/p&gt;            &lt;/td&gt;            &lt;td&gt;CLOB&lt;/td&gt;            &lt;td&gt;TEXT&lt;/td&gt;            &lt;td&gt;CLOB&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;serializable&lt;/td&gt;            &lt;td&gt;实现java.io.Serializable接口的任意一个java类&lt;/td&gt;            &lt;td&gt;VARBINARY(或BLOB)&lt;/td&gt;            &lt;td&gt;BLOB&lt;/td&gt;            &lt;td&gt;BLOB&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;clob&lt;/td&gt;            &lt;td&gt;java.sql.Clob&lt;/td&gt;            &lt;td&gt;CLOB&lt;/td&gt;            &lt;td&gt;TEXT&lt;/td&gt;            &lt;td&gt;CLOB&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;blob&lt;/td&gt;            &lt;td&gt;java.sql.Blob&lt;/td&gt;            &lt;td&gt;BLOB&lt;/td&gt;            &lt;td&gt;BLOB&lt;/td&gt;            &lt;td&gt;BLOB&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;尽管java.sql.Blob和java.sql.Clob是处理Java大对象的有效方式，但它们受到以下两点限制：&lt;br /&gt;1).如果在持久化类中定义一个&lt;strong&gt;java.sql.Blob或java.sql.Clob&lt;/strong&gt;类型的属性，&lt;strong&gt;只有一个数据库事务中&lt;/strong&gt;，Blob或Clob的实例才有效。&lt;br /&gt;2).有些数据库系统的JDBC驱动程序不支持java.sql.Blob或java.sql.Clob。&lt;br /&gt;&lt;br /&gt;5.使用Hibernate内置映射类型图&lt;br /&gt;&lt;img height=&quot;395&quot; alt=&quot;&quot; width=&quot;442&quot; src=&quot;/upload/2009/5/orm_mapping.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;三、客户化映射类型&lt;br /&gt;&lt;br /&gt;Hibernate还允许用户实现UserType或CompositeUserType接口，来灵活地定制客户化映射类型。&lt;br /&gt;&lt;br /&gt;1.实现UserType实例&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;578&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; width=&quot;570&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;public class AddressUserType implements UserType{&lt;br /&gt;            &lt;br /&gt;            /**设置和Address类的四个属性province、city、street和zipcode对应的字段的SQL类型，它们均为VARCHAR类型*/&lt;br /&gt;            private static final int[] SQL_TYPES={Types.VARCAHR,Types.VARCAHR,Types.VARCAHR,Types.VARCAHR}; &lt;br /&gt;            &lt;br /&gt;            public int[] sqlTypes(){return SQL_TYPES}; &lt;br /&gt;            &lt;br /&gt;            /**设置AddressUserType所映射的Java类：Address类*/&lt;br /&gt;            public Class returnedClass(){ return Address.class;} &lt;br /&gt;            &lt;br /&gt;            /**指明Address类是不可变类*/&lt;br /&gt;            public boolean isMutable(){return false;} &lt;br /&gt;            &lt;br /&gt;            /**返回Address对象的快照，由于Address类是不可变类，因此直接将参数代表的Address对象返回*/&lt;br /&gt;            public Object deepCopy(Object value){return value;}&lt;br /&gt;            &lt;br /&gt;            /**比较一个Address对象是否和它的快照相同*/&lt;br /&gt;            public boolean equals(Object x,Object y){ &lt;br /&gt;            if(x==y) return true;&lt;br /&gt;            if(x==null||y==null) return false;&lt;br /&gt;            return x.equals(y); &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            /**从JDBC ResultSet中读取province、city、street和zipcode，然后构造一个Address对象*/&lt;br /&gt;            public Object nullSafeGet(ResultSet resultSet,String[] names, Object owner)throws HibernateException,SQLException{ &lt;br /&gt;            &lt;br /&gt;            if(resultSet.wasNull()) return null; &lt;br /&gt;            String province = resultSet.getString(names[0]); &lt;br /&gt;            String city = resultSet.getString(names[1]); &lt;br /&gt;            String street = resultSet.getString(names[2]); &lt;br /&gt;            String zipcode = resultSet.getString(names[3]); &lt;br /&gt;            return new Address(province,city,street,zipcode); &lt;br /&gt;            &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            /**把Address对象的属性添加到JDBC PreparedStatement中*/&lt;br /&gt;            public void nullSafeSet(PreparedStatement statement,Object value,int index)throws HibernateException,SQLException{ &lt;br /&gt;            &lt;br /&gt;            if(value==null){&lt;br /&gt;            statement.setNull(index,Types.VARCHAR);&lt;br /&gt;            statement.setNull(index+1,Types.VARCHAR);&lt;br /&gt;            statement.setNull(index+2,Types.VARCHAR);&lt;br /&gt;            statement.setNull(index+3,Types.VARCHAR);&lt;br /&gt;            }else{&lt;br /&gt;            Address address = (Address)vlaue;&lt;br /&gt;            satement.setString(index,address.getProvince());&lt;br /&gt;            satement.setString(index+1,address.getCity());&lt;br /&gt;            satement.setString(index+2,address.getStreet());&lt;br /&gt;            satement.setString(index+3,address.getZipcode()); &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            //hbm文件配置信息修改为如下：&lt;br /&gt;            &amp;lt;property name=&amp;quot;homeAddress&amp;quot; class=&amp;quot;mypack.AddressUserType&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;column length=&amp;quot;15&amp;quot; name=&amp;quot;HOME_STREET&amp;quot; /&amp;gt; &lt;br /&gt;            &amp;lt;column length=&amp;quot;15&amp;quot; name=&amp;quot;HOME_CITY&amp;quot; /&amp;gt; &lt;br /&gt;            &amp;lt;column length=&amp;quot;15&amp;quot; name=&amp;quot;HOME_PROVINCE&amp;quot; /&amp;gt; &lt;br /&gt;            &amp;lt;column length=&amp;quot;15&amp;quot; name=&amp;quot;HOME_ZIPCODE&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/property&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &amp;nbsp;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.CompositeUserType实例&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;579&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; width=&quot;571&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;public class Customer{&lt;br /&gt;            private Name name; &lt;br /&gt;            //get、set方法省略&lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            public class Name implements Serializable{&lt;br /&gt;            private String firstname;&lt;br /&gt;            private String lastname;&lt;br /&gt;            //get、set、equals、hashCode和toString方法均省略 &lt;br /&gt;            &lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            public class AddressUserType implements UserType{&lt;br /&gt;            &lt;br /&gt;            /**返回Name类的所有属性的名字*/&lt;br /&gt;            public String[] getPropertyNames(){&lt;br /&gt;            return new String[]{&amp;quot;firstname&amp;quot;,&amp;quot;lastname&amp;quot;}; &lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            /**返回Name类的所有属性的Hiberante映射类型*/&lt;br /&gt;            public Type[] getPropertyTypes(){&lt;br /&gt;            return new Type{Hibernate.STRING,Hibernate.STRING}; &lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            /**获得Name对象的某个属性的值，参数component代表Name对象，参数property代表属性在Name对象中的位置*/&lt;br /&gt;            public Object getPropertyValue(Object component,int property){ &lt;br /&gt;            Name name = (Name)component;&lt;br /&gt;            String result;&lt;br /&gt;            switch(property){&lt;br /&gt;            case 0: result = name.getFirstname();break;&lt;br /&gt;            case 1: result = name.getLastname();break;&lt;br /&gt;            default:throw new IllegalArgumentException(&amp;quot;unknown property:&amp;quot;+property); &lt;br /&gt;            } &lt;br /&gt;            return result; &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            /**设置Name对象的某个属性的值，参数component代表Name对象，参数property代表属性在Name对象中的位置，参数value代表属性值*/&lt;br /&gt;            public void setPropertyValue(Object component,int property,Object value){ &lt;br /&gt;            Name name = (Name)component;&lt;br /&gt;            String nameValue = (String)value;&lt;br /&gt;            switch(property){&lt;br /&gt;            case 0: name.setFirstname(nameValue); break;&lt;br /&gt;            case 1: name.setLastname(nameValue);break;&lt;br /&gt;            default: throw new IllegalArgumentException(&amp;quot;unknown property:&amp;quot;+property); &lt;br /&gt;            }&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            /**设置NameCompositeUserType所映射的Java类：Name类*/&lt;br /&gt;            public Class returnedClas(){&lt;br /&gt;            return Name.class; &lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            /**指明Name类是可变类*/&lt;br /&gt;            public boolean isMutable(){return true;} &lt;br /&gt;            &lt;br /&gt;            /**比较一个Name对象是否和它的快照相同*/&lt;br /&gt;            public boolean equals(Object x,Object y){ &lt;br /&gt;            if(x==y) return true;&lt;br /&gt;            if(x==null||y==null) return false;&lt;br /&gt;            return x.equals(y); &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            /**创建Name对象的快照，由于Name类是可变类，因此必须把Name对象的属性复制到一个新的Name实例中*/&lt;br /&gt;            public Object deepCopy(Object value){&lt;br /&gt;            if(value==null) return null; &lt;br /&gt;            Name name = (Name)value;&lt;br /&gt;            return new Name(name.getFirstname(),name.getLastname()); &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            /**从JDBC ResultSet中读取firstname和lastname，然后构造一个Name对象*/&lt;br /&gt;            public Object nullSafeGet(ResultSet resultSet,String[] names, Object owner)throws HibernateException,SQLException{ &lt;br /&gt;            &lt;br /&gt;            if(resultSet.wasNull()) return null; &lt;br /&gt;            String firstname = resultSet.getString(names[0]); &lt;br /&gt;            String lastname = resultSet.getString(names[1]); &lt;br /&gt;            return new Name(firstname,lastname); &lt;br /&gt;            &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            /**把Name对象的属性添加到JDBC PreparedStatement中*/&lt;br /&gt;            public void nullSafeSet(PreparedStatement statement,Object value,int index)throws HibernateException,SQLException{ &lt;br /&gt;            if(value==null){&lt;br /&gt;            statement.setNull(index,Types.VARCHAR);&lt;br /&gt;            }else{&lt;br /&gt;            Name name = (Name)vlaue;&lt;br /&gt;            satement.setString(index,name.getFirstname());&lt;br /&gt;            satement.setString(index+1,name.getLastname()); &lt;br /&gt;            } &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            /**根据缓存中的序列化的Name对象，重新构建一个Name对象，参数cached代表缓存中的序列化的Name对象*/&lt;br /&gt;            public Object assemble(Serializable cached,SessionImplementor session,Object owner){&lt;br /&gt;            return deepCopy(cached); &lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            /**创建一个序列化的Name对象，Hibernate将把它保存到缓存中*/&lt;br /&gt;            public Serializable disassemble(Object value,SessionImplementor session){&lt;br /&gt;            return (Serializable)deepCopy(value); &lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            } &lt;br /&gt;            &lt;br /&gt;            //hbm文件配置信息修改为如下：&lt;br /&gt;            &amp;lt;property name=&amp;quot;name&amp;quot; class=&amp;quot;mypack.NameCompositeUserType&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;column length=&amp;quot;15&amp;quot; name=&amp;quot;FIRSTNAME&amp;quot; /&amp;gt; &lt;br /&gt;            &amp;lt;column length=&amp;quot;15&amp;quot; name=&amp;quot;LASTNAME&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/property&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &amp;nbsp;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4.CompositeUserType不仅能完成和UserType相同的功能，而且还提供了Hibernate查询语言的支持，在以上程序中，使用customer.homeAddress.province时会报错，但使用customer.name.firstname就不会。&lt;br /&gt;在创建客户化映射类型时，deepCopy()方法用于生成持久化对象的属性的快照。当Hibernate清理缓存中的持久化对象时，会比较对象的属性以相应的属性是否相同，如果不同，就按照更新后的属性值来同步更新数据库。对于可变类型，deepCopy()方法返回属性值的拷贝，对于不可变类型，deepCopy()方法直接返回属性值。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description><category>Hibernate</category><pubDate>Fri, 01 May 2009 17:02:34 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/53.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/53.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/53.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014591/5268593</fs:itemid></item><item><title>Hibernate学习笔记4——对象映射与持久化</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014592/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=52</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=52&amp;key=b6e9937a</trackback:ping><description>&lt;p&gt;一、Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系，对象的OID和数据库表中主键对应。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Hibernate提供的内置标识符生成器：&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;144&quot;&gt;            &lt;div align=&quot;center&quot;&gt;标识符生成器&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;300&quot;&gt;            &lt;div align=&quot;center&quot;&gt;描述&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;increment&lt;/td&gt;            &lt;td&gt;适用于代理主键。由Hibernate自动以递增的方式生成标识符，每次增量为1&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;identity&lt;/td&gt;            &lt;td&gt;适用于代理主键。由底层数据库生成标识符。前提条件是底层数据库支持自动增长字段类型&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;sequence&lt;/td&gt;            &lt;td&gt;适用于代理主键。Hibernate根据底层数据库的序列来生成标识符。前提条件是底层数据库支持序列&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;hilo&lt;/td&gt;            &lt;td&gt;适用于代理主键。Hibernate根据high/low算法来生成标识符。Hibernate把特定表的字段作为&amp;quot;high&amp;quot;值。在默认情况下hibernate_unique_key表的next_hi字段。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;native&lt;/td&gt;            &lt;td&gt;适用于代理主键。根据底层数据库对自动生成标识符支持能力，来选择identity、sequence或hilo&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;uuid.hex&lt;/td&gt;            &lt;td&gt;适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。UUID算法能够在网络环境中生成惟一的字符串标识符。这种标识符生成策略并不流行，因为字符串类型的主键比整型的主键占用更多的数据库空间。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;assigned&lt;/td&gt;            &lt;td&gt;适用于自然主键。由Java应用程序负责生成标识符，为了能让Java应用程序设置OID，不能把setId()方法声明为private类型。应该尽量避免使用自然主键。&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;常用数据库系统可使用的标识符生成器：&lt;br /&gt;&lt;strong&gt;&amp;middot;MySQL&lt;/strong&gt;:identity、increment、hilo、native&lt;br /&gt;&lt;strong&gt;&amp;middot;MS SQL Server&lt;/strong&gt;：identity、increment、hilo、native&lt;br /&gt;&lt;strong&gt;&amp;middot;Oracle&lt;/strong&gt;：sequence、seqhilo、increment、hilo、native&lt;br /&gt;&lt;strong&gt;&amp;middot;跨平台开发&lt;/strong&gt;：native&lt;br /&gt;&lt;br /&gt;注：&lt;br /&gt;1.increment标识符生成器仅仅在只有单个Hibernate应用进程访问数据库的情况下才能有效工作，因此在集群环境下不推荐使用；它不依赖于底层数据库系统，因此适合于所有的数据库系统。&lt;br /&gt;2.hilo标识符生成器不依赖于底层数据库系统，因此适用于所有的数据库系统；hilo算法生成的标识符只能在一个数据库中保证惟一。&lt;br /&gt;3.native根据底层数据库系统的类型自动选择合适的标识符生成器，因此适用于跨数据库平台开发。&lt;br /&gt;&lt;br /&gt;二、映射关联关系&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;多对一&lt;/strong&gt;&amp;lt;many-to-one&gt;包括以下属性&lt;br /&gt;&lt;strong&gt;&amp;middot;name&lt;/strong&gt;：设定待映射的持久化类的属性名&lt;br /&gt;&lt;strong&gt;&amp;middot;column&lt;/strong&gt;：设定和持久化类的属性对应的表的外键&lt;br /&gt;&lt;strong&gt;&amp;middot;class&lt;/strong&gt;：设定持久化类的属性的类型&lt;br /&gt;&lt;strong&gt;&amp;middot;not-null&lt;/strong&gt;：设定是否允许为null，默认是false&lt;br /&gt;&lt;strong&gt;&amp;middot;cascade&lt;/strong&gt;级联关系，默认为&amp;ldquo;none&amp;rdquo;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&amp;lt;many-to-one name=&amp;quot;customer&amp;quot; column=&amp;quot;customer_id&amp;quot; class=&amp;quot;myPackage.Customer&amp;quot; not-null=true /&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;一对多&lt;/strong&gt;关联关系&lt;br /&gt;&lt;strong&gt;&amp;middot;&amp;lt;set&gt;&lt;/strong&gt;元素表明Customer类的orders属性为java.util.Set集合类型&lt;br /&gt;&lt;strong&gt;&amp;middot;&amp;lt;one-to-many&gt;&lt;/strong&gt;子元素表明orders集合中存放的是一组Order对象&lt;br /&gt;&lt;strong&gt;&amp;middot;&amp;lt;key&gt;&lt;/strong&gt;子元素表明ORDERS表通过外键CUSTOMER_ID参照CUSTOMERS表&lt;br /&gt;&lt;strong&gt;&amp;middot;cascade&lt;/strong&gt;表明当保存或更新Customer对象时，会级联的操作。&lt;br /&gt;&lt;strong&gt;&amp;middot;not-null&lt;/strong&gt;：设定是否允许为null，默认是false&lt;br /&gt;&lt;strong&gt;&amp;middot;inverse&lt;/strong&gt;：默认为false。在映射一对多的双向关联时，把&amp;quot;one&amp;quot;的inverse属性设置为&amp;quot;true&amp;quot;可以提高应用性能。&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&amp;lt;set name=&amp;quot;orders&amp;quot; cascade=&amp;quot;save-update&amp;quot;&gt;&lt;br /&gt;&amp;lt;key column=&amp;quot;CUSTOMER_ID&amp;quot; /&gt;&lt;br /&gt;&amp;lt;one-to-many class=&amp;quot;myPackage.Order&amp;quot;  /&gt; &lt;br /&gt;&amp;lt;/set&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;144&quot;&gt;            &lt;div align=&quot;center&quot;&gt;cascade属性&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;300&quot;&gt;            &lt;div align=&quot;center&quot;&gt;描述&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;none&lt;/td&gt;            &lt;td&gt;在保存、更新或删除对象时，忽略其他关联的对象。它是cascade的默认值&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;save-update&lt;/td&gt;            &lt;td&gt;当通过Session的save()、update()以及saveOrUpdate()方法来保存或更新当前对象时，级联保存所有关联的新建的临时对象，并且级联更新所有关联的游离对象。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;delete&lt;/td&gt;            &lt;td&gt;当通过Session的delete()方法删除当前对象时，级联删除所有关联的对象&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;all&lt;/td&gt;            &lt;td&gt;包含save-update以及delete的行为。此外，对当前对象执行evict()或lock()操作时，也会对所有关联的持久化对象执行evict()或lock()操作。&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;delete-orphan&lt;/td&gt;            &lt;td&gt;删除所有和当前对象解除关联关系的对象&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;all-delete-orphan&lt;/td&gt;            &lt;td&gt;包含all和delete-orphan的行为&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;三、操纵持久化对象&lt;br /&gt;&lt;br /&gt;Session接口是Hibernate向应用程序提供的操纵数据库的最主要接口，它提供了基本的保存、更新、删除和查询方法。Session具有一个缓存，位于缓存中的对象出于持久化状态，它和数据库中相应记录对应，Session能够在某些时间点，按照缓存中持久化对象的属性变化来同步更新数据库，这一过程被称为清理缓存。 &lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Session缓存的三大作用：&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;1).减少访问数据库的频率。&lt;br /&gt;2).保证缓存中的对象和数据库中的相关记录保持同步。&lt;br /&gt;3).当缓存中的持久化对象之间存在循环关联关系时，Session保证不出现访问对象图的死循环，以及由死循环引起的JVM堆栈溢出异常。&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Session清理缓存时&lt;/strong&gt;&lt;/em&gt;，按照一下顺序执行SQL语句:&lt;br /&gt;&lt;strong&gt;&amp;middot;&lt;/strong&gt;按照应用程序调用session.save()方法的先后顺序，执行所有对实体进行插入的insert语句&lt;br /&gt;&lt;strong&gt;&amp;middot;&lt;/strong&gt;执行所有对实体进行更新的update语句&lt;br /&gt;&lt;strong&gt;&amp;middot;&lt;/strong&gt;执行所有对集合进行删除的delete语句&lt;br /&gt;&lt;strong&gt;&amp;middot;&lt;/strong&gt;执行所有对集合元素进行删除、更新或者插入的SQL语句&lt;br /&gt;&lt;strong&gt;&amp;middot;&lt;/strong&gt;执行所有对集合进行插入的insert语句&lt;br /&gt;&lt;strong&gt;&amp;middot;&lt;/strong&gt;按照应用程序调用session.delete()方法的先后顺序，执行所有对实体进行删除的delete语句&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Session清理缓存的时间点：&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;&amp;middot;&lt;/strong&gt;当应用程序调用Transaction的commit()方法的时候，commit()方法会先清理缓存，然后再向数据库提交事务&lt;br /&gt;&lt;strong&gt;&amp;middot;&lt;/strong&gt;当应用程序调用Session的find()或者iterate()时，如果缓存中持久化对象的属性发生了变化，就会先清理缓存，以保证查询结果能反应持久化对象的最新状态&lt;br /&gt;&lt;strong&gt;&amp;middot;&lt;/strong&gt;当应用程序显示调用Session的flush()方法的时候&lt;br /&gt;&lt;br /&gt;Session的setFlushMode()方法用于设定清理缓存的时间点。FlushMode类定义了三种不同的清理模式：FlushMode.AUTO、FlushMode.COMMIT和FlushMode.NEVER。&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;清理缓存的模式&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Session的查询方法&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Session的commit()方法&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Session的flush()方法&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;FlushMode.AUTO&lt;/td&gt;            &lt;td&gt;清理&lt;/td&gt;            &lt;td&gt;清理&lt;/td&gt;            &lt;td&gt;清理&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;FlushMode.COMMIT&lt;/td&gt;            &lt;td&gt;不清理&lt;/td&gt;            &lt;td&gt;清理&lt;/td&gt;            &lt;td&gt;清理&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;FlushMode.NEVER&lt;/td&gt;            &lt;td&gt;不清理&lt;/td&gt;            &lt;td&gt;不清理&lt;/td&gt;            &lt;td&gt;清理&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;四、对象的状态&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;middot;临时状态(transient)&lt;/strong&gt;:刚刚用new语句创建，还没有被持久化，不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。&lt;br /&gt;&lt;strong&gt;&amp;middot;持久化状态(psersistent)&lt;/strong&gt;:已经被持久化，加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。&lt;br /&gt;&lt;strong&gt;&amp;middot;游离状态(detached)&lt;/strong&gt;:已经被持久化，但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。和临时对象的区别是它由持久化对象转变过来，因此可能在数据库中还存在对应的记录，而临时对象在数据库中没有对应的记录。&lt;br /&gt;&lt;br /&gt;&lt;img height=&quot;275&quot; alt=&quot;&quot; width=&quot;470&quot; src=&quot;/upload/2009/4/java_object_status.JPG&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;五、Session的保存、更新、删除和查询方法&lt;br /&gt;&lt;br /&gt;1.保存&lt;br /&gt;session的save()方法并不立即执行SQL insert语句，只有当Session的清理缓存时才会执行SQL insert语句。如果在save()方法之后，又修改了持久化对象的属性，这会使Session在其管理缓存时，额为执行SQL update语句。&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;Customer c = new Customer();&lt;br /&gt;            session.save(c);//预执行insert语句&lt;br /&gt;            c.setName(&amp;quot;Tom&amp;quot;);&lt;br /&gt;            session.save(c);//预执行update语句(&lt;strong&gt;多余&lt;/strong&gt;)&lt;br /&gt;            tx.commit(); //真正执行上面两条语句&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.更新&lt;br /&gt;Session只有在清理缓存时才执行update语句，并且在执行时才会把Customer对象当前的属性值组装到update语句中，因此及时程序多次修改了Customer属性，在清理缓存时只会执行一次update语句。&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;c.setName(&amp;quot;Tom&amp;quot;);&lt;br /&gt;            session.update(c);&lt;br /&gt;            c.setName(&amp;quot;Jim&amp;quot;);&lt;br /&gt;            session.update(c);&lt;br /&gt;            tx.commit(); //最后只有一条语句执行，update语句放在一起或者最后一个效果&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;注：&lt;br /&gt;a). 当update()方法关联一个游离对象时如果在Session的缓存中已经存在相同OID的持久化对象，会抛出异常。&lt;br /&gt;b). 当update()方法关联一个游离对象时，如果在数据库中不存在相应的记录，也会抛出异常。&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;3.保存或更新&lt;br /&gt;&lt;br /&gt;saveOrUpdate()方法包含了save()和update()方法，如果满足一下情况之一，&lt;em&gt;Hibernate就把它当作临时对象：&lt;br /&gt;&amp;middot;Java对象的OID取值为null&lt;br /&gt;&amp;middot;Java对象具有version属性并且取值为null&lt;br /&gt;&amp;middot;在映射文件中为&amp;lt;id&gt;元素设置了unsaved-value属性，并且OID取值与unsaved-value属性值匹配&lt;br /&gt;&amp;middot;在映射文件中为version属性设置了unsaved-value属性，并且version属性值与unsaved-value属性值匹配&lt;br /&gt;&amp;middot;自定义Hibernate的Interceptor实现类，并且Interceptor的isUnsaved()方法返回Boolean.TRUE.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;4.查询&lt;br /&gt;Session的load()和get()方法都能根据给定的OID从数据库中加载一个持久化对象，这两个方法的区别在于：当数据库中不存在与OID对应的记录时，load()方法抛出ObjectNotFoundException异常，而get()方法返回null。&lt;br /&gt;&lt;br /&gt;5.删除&lt;br /&gt;&lt;em&gt;delete()方法用于从数据库中删除与Java对象对应的记录。&lt;br /&gt;如果传入的参数是持久化对象，Session就计划执行一个delete语句。&lt;br /&gt;如果传入的参数是游离对象，先使游离对象被Session关联，使它变为持久化对象，然后执行一个delete语句。&lt;br /&gt;Session只有在清理缓存的时候才会执行delete语句。&lt;br /&gt;只有当调用Session的close方法时，才会从Session的缓存中删除持久化对象。&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;六、与触发器协同工作&lt;br /&gt;&lt;br /&gt;触发器在接收到特定的事件时被激发，执行实现定义好的一组数据库操作。能激发触发器运行的时间可以分为以下几种：&lt;br /&gt;&lt;em&gt;&amp;middot;&lt;/em&gt;插入记录事件，即执行insert语句&lt;br /&gt;&lt;em&gt;&amp;middot;&lt;/em&gt;更新记录事件，即执行update语句&lt;br /&gt;&lt;em&gt;&amp;middot;&lt;/em&gt;删除记录事件，即执行delete语句&lt;br /&gt;&lt;br /&gt;当Hibernate与数据库中的触发器协同工作时，会造成两类问题：&lt;br /&gt;&lt;em&gt;&amp;middot;&lt;/em&gt;触发器使Session的缓存中的数据与数据库不一致&lt;br /&gt;&lt;em&gt;&amp;middot;&lt;/em&gt;Session的update()方法盲目地激发触发器。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;tx = session.beginTransaction();&lt;br /&gt;            session.save(customer);&lt;br /&gt;            System.out.println(customer.getRegisteredTime()); &lt;br /&gt;            tx.commit();&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上代码在获得用户注册时间为null，当运行save()方法时，Session仅仅计划执行一个insert语句，但不会立即执行它。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;tx = session.beginTransaction();&lt;br /&gt;            session.save(customer);&lt;br /&gt;            &lt;strong&gt;session.flush();&lt;br /&gt;            session.refresh(customer);&lt;/strong&gt;&lt;br /&gt;            System.out.println(customer.getRegisteredTime()); &lt;br /&gt;            tx.commit();&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.flush()方法会清理缓存，立即执行由save()方法计划的insert语句，refresh()方法重新从数据库中加载刚刚被保存的Customer对象。这两个方法迫使Session的缓存和数据库同步。&lt;br /&gt;&lt;br /&gt;2.Session无法判断游离对象的属性是否和数据库保持一致，为了保险起见，不管游离对象的属性是否发生过变化，都会执行update语句，而update语句会激发数据库中相应的触发器。这条update语句显然是多余的，为了避免这一情况，可以在映射文件的&amp;lt;class&gt;元素中设置select-before-update属性，例如：&lt;br /&gt;&amp;lt;class name=&amp;quot;mypack.Customer&amp;quot; table=&amp;quot;CUSTOMERS&amp;quot; &lt;strong&gt;select-before-update=&amp;quot;true&amp;quot;&lt;/strong&gt;&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/class&gt; &lt;br /&gt;&lt;br /&gt;七、拦截器&lt;br /&gt;&lt;br /&gt;数据库触发器常常用力啊生成审计日志，并且具有很好的性能，缺点是不支持跨数据库平台。&lt;br /&gt;Hibernate的拦截器也能生成审计日志，它不依赖与数据库平台。&lt;br /&gt;为了能够激发烂机器，必须使拦截器与Session关联。Interceptor对象有两种存放方式：&lt;br /&gt;SessionFactory.openSession(Inteceptor):为每个Session实例分配一个Interceptor实例，这个实例放着Session范围内。&lt;br /&gt;Configuration.setInterceptor(Inteceptor):为SessionFactory实例分配一个Interceptor实例，这个实例存放在SessionFactory范围内，被所有的Session实例共享。&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description><category>Hibernate</category><pubDate>Tue, 28 Apr 2009 22:35:04 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/52.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/52.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/52.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014592/5268593</fs:itemid></item><item><title>Oracle时间操作函数</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014593/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=51</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=51&amp;key=250a9b00</trackback:ping><description>&lt;p&gt;一、oracle的&lt;strong&gt;to_char&lt;/strong&gt;函数和例子：&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; bordercolordark=&quot;#ffffff&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td width=&quot;51&quot; align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Parameter&lt;/div&gt;            &lt;/td&gt;            &lt;td width=&quot;281&quot; align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;Explanation&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;YEAR&lt;/td&gt;            &lt;td&gt;Year, spelled out&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;YYYY&lt;/td&gt;            &lt;td&gt;4-digit year&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;YYY&lt;br /&gt;            YY&lt;br /&gt;            Y&lt;/td&gt;            &lt;td&gt;Last 3, 2, or 1 digit(s) of year.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;IYY&lt;br /&gt;            IY&lt;br /&gt;            I&lt;/td&gt;            &lt;td&gt;Last 3, 2, or 1 digit(s) of ISO year.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;IYYY&lt;/td&gt;            &lt;td&gt;4-digit year based on the ISO standard&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;Q&lt;/td&gt;            &lt;td&gt;Quarter of year (1, 2, 3, 4; JAN-MAR = 1).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;MM&lt;/td&gt;            &lt;td&gt;Month (01-12; JAN = 01).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;MON&lt;/td&gt;            &lt;td&gt;Abbreviated name of month.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;MONTH&lt;/td&gt;            &lt;td&gt;Name of month, padded with blanks to length of 9 characters.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;RM&lt;/td&gt;            &lt;td&gt;Roman numeral month (I-XII; JAN = I).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;WW&lt;/td&gt;            &lt;td&gt;Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;W&lt;/td&gt;            &lt;td&gt;Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;IW&lt;/td&gt;            &lt;td&gt;Week of year (1-52 or 1-53) based on the ISO standard.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;D&lt;/td&gt;            &lt;td&gt;Day of week (1-7).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;DAY&lt;/td&gt;            &lt;td&gt;Name of day.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;DD&lt;/td&gt;            &lt;td&gt;Day of month (1-31).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;DDD&lt;/td&gt;            &lt;td&gt;Day of year (1-366).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;DY&lt;/td&gt;            &lt;td&gt;Abbreviated name of day.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;J&lt;/td&gt;            &lt;td&gt;Julian day; the number of days since January 1, 4712 BC.&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;HH&lt;/td&gt;            &lt;td&gt;Hour of day (1-12).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;HH12&lt;/td&gt;            &lt;td&gt;Hour of day (1-12).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;HH24&lt;/td&gt;            &lt;td&gt;Hour of day (0-23).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;MI&lt;/td&gt;            &lt;td&gt;Minute (0-59).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;SS&lt;/td&gt;            &lt;td&gt;Second (0-59).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;SSSSS&lt;/td&gt;            &lt;td&gt;Seconds past midnight (0-86399).&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;FF&lt;/td&gt;            &lt;td&gt;Fractional seconds.&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以下是 &lt;strong&gt;to_char&lt;/strong&gt;函数的实例&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; bordercolordark=&quot;#ffffff&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td width=&quot;51&quot; align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;函数&lt;/div&gt;            &lt;/td&gt;            &lt;td width=&quot;281&quot; align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;转换后的值&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td width=&quot;253&quot;&gt;to_char(sysdate, 'yyyy/mm/dd');&lt;/td&gt;            &lt;td&gt;would return '2003/07/09'&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;to_char(sysdate, 'Month DD, YYYY');&lt;/td&gt;            &lt;td&gt;would return 'July 09, 2003'&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;to_char(sysdate, 'FMMonth DD, YYYY');&lt;/td&gt;            &lt;td&gt;would return 'July 9, 2003'&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;to_char(sysdate, 'MON DDth, YYYY');&lt;/td&gt;            &lt;td&gt;would return 'JUL 09TH, 2003'&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;to_char(sysdate, 'FMMON DDth, YYYY');&lt;/td&gt;            &lt;td&gt;would return 'JUL 9TH, 2003'&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;to_char(sysdate, 'FMMon ddth, YYYY');&lt;/td&gt;            &lt;td&gt;would return 'Jul 9th, 2003'&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果不要出现在月签名不要出现0，则在前面加FM（09就变成了9）：&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; border=&quot;1&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; bordercolordark=&quot;#ffffff&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td width=&quot;51&quot; align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;函数&lt;/div&gt;            &lt;/td&gt;            &lt;td width=&quot;281&quot; align=&quot;center&quot;&gt;            &lt;div align=&quot;center&quot;&gt;转换后的值&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td width=&quot;253&quot;&gt;to_char(sysdate, 'FMMonth DD, YYYY');&lt;/td&gt;            &lt;td&gt;would return 'July 9, 2003'&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;to_char(sysdate, 'FMMON DDth, YYYY');&lt;/td&gt;            &lt;td&gt;would return 'JUL 9TH, 2003'&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td&gt;to_char(sysdate, 'FMMon ddth, YYYY');&lt;/td&gt;            &lt;td&gt;would return 'Jul 9th, 2003'&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;二、常用时间函数&lt;/p&gt;&lt;p&gt;1.&lt;strong&gt;trunc&lt;/strong&gt;(sysdate,'Q') 本季度第一天&lt;/p&gt;&lt;p&gt;SQL&amp;gt; select trunc(sysdate,'Q') from dual;&lt;/p&gt;&lt;p&gt;TRUNC(SYSDATE,'Q')&lt;br /&gt;------------------&lt;br /&gt;2007-4-1&lt;/p&gt;&lt;p&gt;2.trunc(sysdate,'D') 本周的第一天(周日)&lt;/p&gt;&lt;p&gt;SQL&amp;gt; select trunc(sysdate,'D')from dual;&lt;/p&gt;&lt;p&gt;TRUNC(SYSDATE,'D')&lt;br /&gt;------------------&lt;br /&gt;2007-5-27&lt;/p&gt;&lt;p&gt;3.&lt;strong&gt;last_day&lt;/strong&gt;(sysdate) 本月最后一天&lt;/p&gt;&lt;p&gt;SQL&amp;gt; select last_day(sysdate) from dual;&lt;/p&gt;&lt;p&gt;LAST_DAY(SYSDATE)&lt;br /&gt;-----------------&lt;br /&gt;2007-5-31 15:20:3&lt;/p&gt;&lt;p&gt;4.&lt;strong&gt;add_months&lt;/strong&gt;(sysdate,2) 日期sysdate后推2个月&lt;/p&gt;&lt;p&gt;SQL&amp;gt; select add_months(sysdate,2) from dual;&lt;/p&gt;&lt;p&gt;ADD_MONTHS(SYSDATE,2)&lt;br /&gt;---------------------&lt;br /&gt;2007-7-29 15:21:14&lt;/p&gt;&lt;p&gt;5.&lt;strong&gt;next_day&lt;/strong&gt;(sysdate,2) 日期sysdate之后的第一周中,第2(指定星期的第几天)是什么日期&lt;/p&gt;&lt;p&gt;SQL&amp;gt; select next_day(sysdate,2) from dual;&lt;/p&gt;&lt;p&gt;NEXT_DAY(SYSDATE,2)&lt;br /&gt;-------------------&lt;br /&gt;2007-6-4 15:22:10&lt;/p&gt;&lt;p&gt;6.&lt;strong&gt;Months_between&lt;/strong&gt;(f,s) 日期f和s间相差月数&lt;/p&gt;&lt;p&gt;SQL&amp;gt; select months_between(sysdate,to_date('2007-04-12','yyyy-mm-dd'))from dual;&lt;/p&gt;&lt;p&gt;MONTHS_BETWEEN(SYSDATE,TO_DATE('2007-04-12','yyyy-mm-dd'))&lt;br /&gt;-----------------------------------------------------------&lt;br /&gt;1.56909908900836&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;7.得到SYSDATE+5所在的月份&lt;/p&gt;&lt;p&gt;SQL&amp;gt; SELECT to_char(SYSDATE+5,'mon','nls_date_language=american') FROM dual;&lt;/p&gt;&lt;p&gt;TO_CHAR(SYSDATE+5,'MON','NLS_DATE_LANGUAGE=american')&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;jun&lt;/p&gt;&lt;p&gt;8.&lt;strong&gt;current_date()&lt;/strong&gt;返回当前会话时区中的当前日期 。&lt;/p&gt;&lt;p&gt;9.select dbtimezone from dual;&lt;/p&gt;&lt;p&gt;10.extract()找出日期或间隔值的字段值&lt;/p&gt;&lt;p&gt;SQL&amp;gt; select extract(month from sysdate) &amp;quot;This Month&amp;quot; from dual;&lt;/p&gt;&lt;p&gt;This Month&lt;br /&gt;----------&lt;br /&gt;5&lt;br /&gt;SQL&amp;gt; select extract(year from sysdate) &amp;quot;This year&amp;quot; from dual;&lt;/p&gt;&lt;p&gt;This year&lt;br /&gt;----------&lt;br /&gt;2007&lt;br /&gt;SQL&amp;gt; select extract(month from add_months(sysdate,2)) &amp;quot; Month&amp;quot; from dual;&lt;/p&gt;&lt;p&gt;Month&lt;br /&gt;----------&lt;br /&gt;7&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;==================================================================&lt;/p&gt;&lt;p&gt;三、一些实践后的用法：&lt;/p&gt;&lt;p&gt;1.上月末天：&lt;br /&gt;select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from dual；&lt;/p&gt;&lt;p&gt;2.上月今天&lt;br /&gt;SQL&amp;gt; select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;&lt;/p&gt;&lt;p&gt;3.上月首天&lt;br /&gt;SQL&amp;gt; select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;&lt;/p&gt;&lt;p&gt;4.要找到某月中所有周五的具体日期&lt;/p&gt;&lt;p&gt;SELECT to_char(b.a,'YY-MM-DD')&lt;br /&gt;FROM ( SELECT trunc(SYSDATE,'mm')+ROWNUM-1 a&lt;br /&gt;FROM dba_objects where rownum &amp;lt; 32 ) b&lt;br /&gt;WHERE to_char(b.a,'day')='星期五';&lt;br /&gt;如果把where to_char(t.d, 'MM') = to_char(sysdate, 'MM')改成sysdate-90，即为查找当前月份的前三个月中的每周五的日期。&lt;br /&gt;&lt;br /&gt;5.得到系统当前月及以后的日期&lt;br /&gt;select trunc(sysdate, 'MM')+ROWNUM-1 FROM dba_objects ;&lt;br /&gt;&lt;br /&gt;&lt;font face=&quot;Verdana&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;font face=&quot;Verdana&quot;&gt;加法&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;select sysdate,add_months(sysdate,12) from dual;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--加1年&lt;br /&gt;&amp;nbsp;select sysdate,add_months(sysdate,1) from dual;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--加1月&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual;&amp;nbsp;&amp;nbsp;&amp;nbsp;--加1星期&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual;&amp;nbsp;&amp;nbsp;&amp;nbsp;--加1天&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual;&amp;nbsp;&amp;nbsp;--加1小时&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;&amp;nbsp;&amp;nbsp;--加1分钟&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; &amp;nbsp;--加1秒&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;减法&lt;br /&gt;&lt;/span&gt;&lt;font face=&quot;Verdana&quot;&gt;&amp;nbsp;select sysdate,add_months(sysdate,-12) from dual;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--减1年&lt;br /&gt;&amp;nbsp;select sysdate,add_months(sysdate,-1) from dual;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--减1月&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate-7,'yyyy-mm-dd HH24:MI:SS') from dual;&amp;nbsp;&amp;nbsp;&amp;nbsp;--减1星期&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate-1,'yyyy-mm-dd HH24:MI:SS') from dual;&amp;nbsp;&amp;nbsp;&amp;nbsp;--减1天&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate-1/24,'yyyy-mm-dd HH24:MI:SS') from dual;&amp;nbsp;&amp;nbsp;--减1小时&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate-1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;&amp;nbsp;&amp;nbsp;--减1分钟&lt;br /&gt;&amp;nbsp;select sysdate,to_char(sysdate-1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; &amp;nbsp;--减1秒&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;-----------------------------------&lt;br /&gt;&lt;br /&gt;&lt;em&gt;to_date 字符串类型转为换日期类型&lt;br /&gt;字符串中的相应位置上的字符,必须符合时间范围的限制 &lt;/em&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description><category>DataBase</category><pubDate>Sat, 25 Apr 2009 21:05:06 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/20090425748.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/20090425748.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/20090425748.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014593/5268593</fs:itemid></item><item><title>JAXB 2.0 API is being loaded……</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014594/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=50</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=50&amp;key=85484435</trackback:ping><description>&lt;p&gt;错误提示：&lt;br /&gt;Caused by: java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/E:/workSpace/T82A/WebRoot/WEB-INF/lib/cxf/jaxb-impl-2.1.7.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.1 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)&lt;br /&gt;&lt;br /&gt;修正：&lt;br /&gt;在%JAVA_HOME%\jre\lib\下新建endorsed文件夹，放入jaxb-api.jar即可&lt;/p&gt;</description><category>Java Web</category><pubDate>Wed, 22 Apr 2009 21:03:13 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/20090422688.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/20090422688.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/20090422688.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014594/5268593</fs:itemid></item><item><title>Hibernate学习笔记3——对象-关系映射</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014595/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=49</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=49&amp;key=ed8fcdb8</trackback:ping><description>&lt;p&gt;1.JAVA文件、映射文件和数据库关系转换图&lt;br /&gt;&lt;br /&gt;&lt;img height=&quot;195&quot; alt=&quot;&quot; width=&quot;379&quot; src=&quot;http://www.foolpid.net/upload/2009/4/hbm2java_hbm2ddl.JPG&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;middot;hbm2java&lt;/strong&gt;：根据映射文件自动生成Java源文件&lt;br /&gt;&lt;strong&gt;&amp;middot;hbm2ddl&lt;/strong&gt;：根据映射文件自动生成数据库Schema&lt;br /&gt;&lt;strong&gt;&amp;middot;XDoclet&lt;/strong&gt;：根据带有XDoclet标记的Java源文件生成映射文件&lt;br /&gt;&lt;strong&gt;&amp;middot;Middlegen&lt;/strong&gt;：根据数据库Schema自动生成映射文件 &lt;br /&gt;&lt;br /&gt;2.Hibernate的hbm2java工具自动使持久化类实现java.io.Serializable接口。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;lt;meta&amp;gt;元素的属性&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;51&quot;&gt;            &lt;div align=&quot;center&quot;&gt;属性&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;281&quot;&gt;            &lt;div align=&quot;center&quot;&gt;描述&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;class-description&lt;/td&gt;            &lt;td&gt;指定描述类的JavaDoc&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;field-description&lt;/td&gt;            &lt;td&gt;指定描述类的属性的JavaDoc&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;interface&lt;/td&gt;            &lt;td&gt;如果为true，表示生成接口，默认为false&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;implements&lt;/td&gt;            &lt;td&gt;指定类所实现的接口&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;extends&lt;/td&gt;            &lt;td&gt;指定类继承的父类名&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;generated-class&lt;/td&gt;            &lt;td&gt;重新指定生成的类名&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;scope-class&lt;/td&gt;            &lt;td&gt;指定类的修饰符，默认为public&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;scope-set&lt;/td&gt;            &lt;td&gt;指定set方法的修饰符，默认为public&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;scope-get&lt;/td&gt;            &lt;td&gt;指定get方法的修饰符，默认为public&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;scope-field&lt;/td&gt;            &lt;td&gt;指定类的属性的修饰符，默认为private&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;use-in-toString&lt;/td&gt;            &lt;td&gt;如果为true，表示在toString()方法中包含此属性&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;gen-property&lt;/td&gt;            &lt;td&gt;如果是false，不会在Java类中生成此属性，默认为true&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;finder-method&lt;/td&gt;            &lt;td&gt;指定find方法名&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&amp;lt;column&amp;gt;元素的属性&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;51&quot;&gt;            &lt;div align=&quot;center&quot;&gt;属性&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;281&quot;&gt;            &lt;div align=&quot;center&quot;&gt;描述&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;name&lt;/td&gt;            &lt;td&gt;设定字段的名字&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;length&lt;/td&gt;            &lt;td&gt;设定字段的长度&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;not-null&lt;/td&gt;            &lt;td&gt;如果为true，指明该字段不允许为null，默认为false&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;unique&lt;/td&gt;            &lt;td&gt;如果为true，指明该字段具有唯一约束，默认为false&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;index&lt;/td&gt;            &lt;td&gt;给一个或多个字段建立索引&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;unique-key&lt;/td&gt;            &lt;td&gt;为多个字段设定唯一约束&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;foreign-key&lt;/td&gt;            &lt;td&gt;为外键约束命名&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;sql-type&lt;/td&gt;            &lt;td&gt;设定字段的SQL类型&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;check&lt;/td&gt;            &lt;td&gt;设定SQL检查约束&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;注：check约束不会影响Hibernate的运行时行为。如：Customers表的age字段建立了大于10的约束，但保存Customer对象时，不会检查age属性是否大于10。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.Java有8种基本类型:byte、short、char、int、long、float、double和boolean.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8种包装类型：Byte、Short、Character、Integer、Long、Float、Double和Boolean。 &lt;br /&gt;&lt;br /&gt;4.&lt;strong&gt;access默认为property&lt;/strong&gt;,设置Hibernate访问持久化类属性的策略为field时就不需要调用get和set方法。&lt;br /&gt;&amp;lt;property name=&amp;quot;sex&amp;quot; &lt;strong&gt;access=&amp;quot;field&amp;quot;&lt;/strong&gt;&amp;gt;&lt;br /&gt;&amp;lt;column name=&amp;quot;SEX&amp;quot; not-null=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt; &lt;br /&gt;&lt;br /&gt;5.insert和update语句的映射属性&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;51&quot;&gt;            &lt;div align=&quot;center&quot;&gt;属性&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;281&quot;&gt;            &lt;div align=&quot;center&quot;&gt;描述&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;&amp;lt;property&amp;gt;元素的insert属性&lt;/td&gt;            &lt;td&gt;如果为false，在insert语句种不包含该字段，表示该字段永远不能被插入，默认为true&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;&amp;lt;property&amp;gt;元素的update属性&lt;/td&gt;            &lt;td&gt;如果为false，update语句种不包含该字段，表示该字段永远不能被更新，默认为true&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;&amp;lt;class&amp;gt;元素的mutable属性&lt;/td&gt;            &lt;td&gt;如果为false，等价于所有的&amp;lt;property&amp;gt;元素的update属性为false，整个实例不能被更新，默认为true&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;&amp;lt;property&amp;gt;元素的dynamic-insert属性&lt;/td&gt;            &lt;td&gt;如果为true，表示当保存一个对象时，会动态生成insert语句，只有这个字段取值不为null，才会把它包含到insert语句中。默认为false&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;&amp;lt;property&amp;gt;元素的dynamic-update属性&lt;/td&gt;            &lt;td&gt;如果为true，表示当更新一个对象时，会动态生成update语句，只有这个字段取值有变化，才会把它包含到update语句中。默认为false&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;&amp;lt;class&amp;gt;元素的dynamic-insert属性&lt;/td&gt;            &lt;td&gt;如果为true，等价于所有的&amp;lt;property&amp;gt;元素的dynamic-insert属性为true，表示当保存一个对象时，会动态生成insert语句，insert语句中仅包含所有取值不为null的字段。默认为false&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;&amp;lt;class&amp;gt;元素的dynamic-update属性&lt;/td&gt;            &lt;td&gt;如果为true，等价于所有的&amp;lt;property&amp;gt;元素的dynamic-update属性为true，表示当保存一个对象时，会动态生成update语句，update语句中仅包含所需要更新的字段。默认为false&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6.&lt;strong&gt;标识符&lt;/strong&gt;是指用于为数据库表、视图、字段或索引等命名的字符串，常规标识符不包含空格，也不包含特殊字符，因此&lt;strong&gt;无需使用引用符号&lt;/strong&gt;。&lt;br /&gt;如果数据表名或字段中包含空格，或者包含特殊字符，那么可以使用引用标识符。形式为：'IDENTIFIER NAME'。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description><category>Hibernate</category><pubDate>Mon, 13 Apr 2009 22:10:15 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/20090413876.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/20090413876.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/20090413876.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014595/5268593</fs:itemid></item><item><title>ant常用命令</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014596/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=48</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=48&amp;key=077a4b25</trackback:ping><description>&lt;p&gt;1.基本的build.xml文件&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;            &amp;lt;project name=&amp;quot;ant文件&amp;quot; default=&amp;quot;prepare&amp;quot; basedir=&amp;quot;.&amp;quot;&amp;gt; &lt;br /&gt;            &lt;br /&gt;            &amp;lt;!--路径定义--&amp;gt;&lt;br /&gt;            &amp;lt;property name=&amp;quot;src.root&amp;quot; location=&amp;quot;${basedir}/src&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;property name=&amp;quot;class.root&amp;quot; location=&amp;quot;${basedir}/WEB-INF/classes&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;property name=&amp;quot;lib.dir&amp;quot; location=&amp;quot;${basedir}/WEB-INF/lib&amp;quot; /&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &amp;lt;!--三种方式classpath设置--&amp;gt;&lt;br /&gt;            &amp;lt;path id=&amp;quot;classpath.je5&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;fileset dir=&amp;quot;F:\javaCC\warkspace\EE_5&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;include name=&amp;quot;*.jar&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/fileset&amp;gt;&lt;br /&gt;            &amp;lt;/path&amp;gt;&lt;br /&gt;            &amp;lt;&lt;strong&gt;path&lt;/strong&gt; id=&amp;quot;classpath.lib&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;!--Include our own Classes--&amp;gt;&lt;br /&gt;            &amp;lt;&lt;strong&gt;pathelement&lt;/strong&gt; location=&amp;quot;${class.root}&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;!--Include jars in the project library directory--&amp;gt;&lt;br /&gt;            &amp;lt;fileset dir=&amp;quot;${lib.dir}&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;include name=&amp;quot;*.jar&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/fileset&amp;gt;&lt;br /&gt;            &amp;lt;!--Include other jars--&amp;gt;&lt;br /&gt;            &amp;lt;path refid = &amp;quot;classpath.je5&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/path&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &amp;lt;target name=&amp;quot;prepare&amp;quot; description=&amp;quot;删除class.root路径后新建，并将src.root下的资源文件和xml文件拷入&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;echo&amp;gt;prepare:&amp;lt;/echo&amp;gt;&lt;br /&gt;            &amp;lt;!--删除目录后新建--&amp;gt;&lt;br /&gt;            &amp;lt;&lt;strong&gt;delete&lt;/strong&gt; dir=&amp;quot;${class.root}&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;&lt;strong&gt;mkdir&lt;/strong&gt; dir=&amp;quot;${class.root}&amp;quot;&amp;gt; &lt;br /&gt;            &lt;br /&gt;            &amp;lt;!--拷贝资源文件到目录中--&amp;gt;&lt;br /&gt;            &amp;lt;&lt;strong&gt;copy todir&lt;/strong&gt;=&amp;quot;${class.root}&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;fileset dir=&amp;quot;${src.root}&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;include name=&amp;quot;**/*.properties&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;include name=&amp;quot;**/*.xml&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/fileset&amp;gt;&lt;br /&gt;            &amp;lt;/copy&amp;gt; &lt;br /&gt;            &amp;lt;/target&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &amp;lt;target name=&amp;quot;compile&amp;quot; depends=&amp;quot;prepare&amp;quot; description=&amp;quot;编译src目录下的java文件，依赖于prepare&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;echo&amp;gt;compile:&amp;lt;/echo&amp;gt;&lt;br /&gt;            &amp;lt;&lt;strong&gt;javac&lt;/strong&gt; srcdir=&amp;quot;${src.root}&amp;quot; destdir=&amp;quot;${class.root}&amp;quot; debug=&amp;quot;on&amp;quot; optimize=&amp;quot;off&amp;quot; deprecation=&amp;quot;on&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;classpath refid=&amp;quot;${classpath.lib}&amp;quot;/&amp;gt; &lt;br /&gt;            &amp;lt;/javac&amp;gt; &lt;br /&gt;            &amp;lt;/target&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &amp;lt;target name=&amp;quot;run&amp;quot; depends=&amp;quot;compile&amp;quot; description=&amp;quot;直接运行mypack包下的MyService程序&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;echo&amp;gt;compile:&amp;lt;/echo&amp;gt;&lt;br /&gt;            &amp;lt;&lt;strong&gt;java&lt;/strong&gt; classname=&amp;quot;mypack.MyService&amp;quot; fork=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;classpath refid=&amp;quot;${classpath.lib}&amp;quot;/&amp;gt; &lt;br /&gt;            &amp;lt;/java&amp;gt; &lt;br /&gt;            &amp;lt;/target&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &amp;lt;/project&amp;gt;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.在hibernate2下使用hbm2java，通过hbm.xml文件生成java代码。&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;&lt;br /&gt;            &amp;lt;target name=&amp;quot;codeGen&amp;quot; description=&amp;quot;通过src.root的*.hbm.xml和配置文件codegen.cfg.xml生成java代码，依赖与前面提到的prepare&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;echo&amp;gt;codeGen:&amp;lt;/echo&amp;gt;&lt;br /&gt;            &amp;lt;!--告诉ant使用Hibernate的code生成工具--&amp;gt;&lt;br /&gt;            &amp;lt;taskdef name=&amp;quot;hbm2java&amp;quot; classname=&amp;quot;net.sf.hibernate.tool.hbm2java.Hbm2JavaTask&amp;quot; classpathref=&amp;quot;${classpath.lib}&amp;quot;/&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &amp;lt;!--使用hbm2java工具--&amp;gt;&lt;br /&gt;            &lt;strong&gt;&amp;lt;hbm2java output=&amp;quot;${src.root}&amp;quot; config=&amp;quot;${class.root}/codegen.cfg.xml&amp;quot;&amp;gt;&lt;/strong&gt;&lt;br /&gt;            &amp;lt;fileset dir=&amp;quot;${src.root}&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;include name=&amp;quot;**/*.hbm.xml&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/fileset&amp;gt;&lt;br /&gt;            &amp;lt;/hbm2java&amp;gt; &lt;br /&gt;            &amp;lt;/target&amp;gt;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;codegen.cfg.xml的定义：&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;&amp;lt;codegen&amp;gt;&lt;br /&gt;            &amp;lt;generate renderer=&amp;quot;net.sf.hibernate.tool.hbm2java.BasicRenderer&amp;quot;/&amp;gt; &lt;br /&gt;            &amp;lt;generate renderer=&amp;quot;net.sf.hibernate.tool.hbm2java.FinderRenderer&amp;quot; suffix=&amp;quot;Finder&amp;quot; package=&amp;quot;mypack&amp;quot;/&amp;gt; &lt;br /&gt;            &amp;lt;/codegen&amp;gt;&lt;br /&gt;            &amp;nbsp;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;generate&amp;gt;子元素设定具体的代码生成器，BasicRender生成器用于生成持久化类的源文件，FinderRender生成器用于生成相关的查询类的源文件。可以设定前缀或后缀。&lt;br /&gt;&lt;br /&gt;利用hbm2ddl工具生成数据块Schema，数据库的脚本文件存放在schema子目录下。文件名为schema.sql.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td class=&quot;code&quot; align=&quot;left&quot; bgcolor=&quot;#e6e6e6&quot;&gt;            &lt;p&gt;&lt;br /&gt;            &amp;lt;target name=&amp;quot;schema&amp;quot; description=&amp;quot;通过src.root的*.hbm.xml和配置文件hibernate.properties生成数据库sql语句&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;echo&amp;gt;schema:&amp;lt;/echo&amp;gt;&lt;br /&gt;            &amp;lt;!--告诉ant使用Hibernate的code生成工具--&amp;gt;&lt;br /&gt;            &amp;lt;taskdef name=&amp;quot;schemaexport&amp;quot; classname=&amp;quot;net.sf.hibernate.tool.hbm2ddl.SchemaExportTask&amp;quot; classpathref=&amp;quot;${classpath.lib}&amp;quot;/&amp;gt;&lt;br /&gt;            &lt;br /&gt;            &amp;lt;!--使用hbm2java工具--&amp;gt;&lt;br /&gt;            &lt;strong&gt;&amp;lt;schemaexport output=&amp;quot;schema/schema.sql&amp;quot; properties=&amp;quot;${class.root}/hibernate.properties&amp;quot; quiet=&amp;quot;no&amp;quot; text=&amp;quot;no&amp;quot; drop=&amp;quot;no&amp;quot;&amp;gt;&lt;/strong&gt;&lt;br /&gt;            &amp;lt;fileset dir=&amp;quot;${src.root}&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;include name=&amp;quot;**/*.hbm.xml&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/fileset&amp;gt;&lt;br /&gt;            &amp;lt;/schemaexport&amp;gt; &lt;br /&gt;            &amp;lt;/target&amp;gt;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;hbm2ddl工具的命令选项：&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;51&quot;&gt;            &lt;div align=&quot;center&quot;&gt;属性&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;281&quot;&gt;            &lt;div align=&quot;center&quot;&gt;描述&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;quiet&lt;/td&gt;            &lt;td&gt;如果为yes，表示不把DDL脚本输出到控制台&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;drop&lt;/td&gt;            &lt;td&gt;如果为yes，只执行删除数据库中表的操作，但不创建新的表&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;text&lt;/td&gt;            &lt;td&gt;如果为yes，只会生成ddl脚本文件，但不会在数据库中执行DDL脚本&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;output&lt;/td&gt;            &lt;td&gt;指定存放ddl脚本的文件&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;config&lt;/td&gt;            &lt;td&gt;设定基于XML格式的配置文件，hbm2ddl工具从这个配置文件中读取数据库配置信息&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;properties&lt;/td&gt;            &lt;td&gt;设定基于java属性文件格式的配置文件，hbm2ddl工具从这个配置文件中读取数据库配置信息&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;format&lt;/td&gt;            &lt;td&gt;设定DDL脚本中sql语句的格式&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td align=&quot;center&quot;&gt;delimiter&lt;/td&gt;            &lt;td&gt;为DDL脚本设置行结束符&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description><category>Java Web</category><pubDate>Mon, 13 Apr 2009 20:21:44 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/20090413757.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/20090413757.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/20090413757.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014596/5268593</fs:itemid></item><item><title>Hibernate学习笔记2——Hibernate入门</title><link>http://item.feedsky.com/~feedsky/foolpid/~7159750/217014597/5268593/1/item.html</link><wfw:comment>http://www.foolpid.net/</wfw:comment><wfw:commentRss>http://www.foolpid.net/feed.asp?cmt=47</wfw:commentRss><trackback:ping>http://www.foolpid.net/cmd.asp?act=tb&amp;id=47&amp;key=ea3a8ab8</trackback:ping><description>&lt;p&gt;Hibernate是Java应用和关系数据块之间的桥梁，它负责Java对象和关系数据块之间的映射。Hibernate内封装了通过JDBC访问数据块的操作，向上层应用提供面向对象的数据访问API。在JAVA应用中使用Hibernate的步骤如下：&lt;br /&gt;1).创建Hibernate配置文件&lt;br /&gt;2).创建持久化类&lt;br /&gt;3).创建对象-关系映射文件&lt;br /&gt;4).通过Hibernate API编写访问数据块的代码。&lt;br /&gt;&lt;br /&gt;一、&lt;strong&gt;创建Hibernate的配置文件&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Hibernate的配置文件格式有两种：一种是XML格式的文件，还有一种是JAVA属性文件，默认命名为hibernate.properties.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing=&quot;0&quot; bordercolordark=&quot;#ffffff&quot; cellpadding=&quot;2&quot; align=&quot;left&quot; bordercolorlight=&quot;#000000&quot; border=&quot;1&quot;&gt;    &lt;tbody&gt;        &lt;tr bgcolor=&quot;#cccccc&quot;&gt;            &lt;td align=&quot;center&quot; width=&quot;51&quot;&gt;            &lt;div align=&quot;center&quot;&gt;属性&lt;/div&gt;            &lt;/td&gt;            &lt;td align=&quot;center&quot; width=&quot;281&quot;&gt;            &lt;div align=&quot;center&quot;&gt;描述&lt;/div&gt;            &lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td style=&quot;text-align: left&quot;&gt;hibernate.dialect&lt;/td&gt;            &lt;td style=&quot;text-align: left&quot;&gt;指定数据库使用的SQL方言&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td style=&quot;text-align: left&quot;&gt;hibernate.connection.driver_class&lt;/td&gt;            &lt;td style=&quot;text-align: left&quot;&gt;指定数据库的驱动程序&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td style=&quot;text-align: left&quot;&gt;hibernate.connection.url&lt;/td&gt;            &lt;td style=&quot;text-align: left&quot;&gt;指定连接数据库的URL&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td style=&quot;text-align: left&quot;&gt;hibernate.connection.username&lt;/td&gt;            &lt;td style=&quot;text-align: left&quot;&gt;指定连接数据块的用户名&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td style=&quot;text-align: left&quot;&gt;hibernate.connection.password&lt;/td&gt;            &lt;td style=&quot;text-align: left&quot;&gt;指定连接数据块的密码&lt;/td&gt;        &lt;/tr&gt;        &lt;tr&gt;            &lt;td style=&quot;text-align: left&quot;&gt;hibernate.show_sql&lt;/td&gt;            &lt;td style=&quot;text-align: left&quot;&gt;如果为true，表示在程序运行时，会在控制台输出SQL语句，默认为false&lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;二、&lt;strong&gt;创建持久化类&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;持久化类符合JavaBean的规范，&lt;em&gt;包含一些属性，以及与之对应getXXX()和setXXX()方法&lt;/em&gt;。&amp;quot;get&amp;quot;和&amp;quot;set&amp;quot;后面紧跟属性的名字，并且属性名的首字母大写，如果持久化类的属性为boolean类型，那么它的get方法既可以用&amp;quot;get&amp;quot;作为前缀，也可以用&amp;quot;is&amp;quot;作为前缀。&lt;br /&gt;Hibernate并不要求持久化类必须实现java.io.Serializable接口，但对于&lt;em&gt;分布式结构的Java应用&lt;/em&gt;，当Java对象在不同的进程节点传输时，所属的类必须实现Serializable接口。此外，如果希望对&lt;em&gt;HttpSession中存放的Java对象进行持久化&lt;/em&gt;，那个这个Java对象所属的类也&lt;em&gt;必须实现Serializable接口&lt;/em&gt;。&lt;br /&gt;Hibernate要求持久化类&lt;em&gt;必须实现一个不带参数的默认构造函数&lt;/em&gt;，在程序运行时，Hibernate运用Java反射机制，调用java.lang.reflect.Constructor.newInstance()方法来构造持久化类的实例。Hibernate在运行时为持久化类创建动态代理，要求持久化的&lt;em&gt;默认构造函数方法访问级别必须是public或protected类型&lt;/em&gt;，不能是default或private类型。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;三、创建数据库Schema&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;数据块的创建可以直接用数据模型生成sql来执行，或者通过hbm文件生成sql语句（hbm2ddl工具）。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;四、通过Hibernate API操作数据块&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;1).创建一个Configuration类的实例，Configuration类的构造方法把默认文件路径下的hibernate.properties或hibernate.cfg.xml配置文件中的配置信息读入到内存。&lt;br /&gt;Configuration config = new Configuration();&lt;br /&gt;&lt;br /&gt;2).调用Configuration类的addClass(Customer.class)方法。&lt;br /&gt;config.addClass(Customer.class); &lt;br /&gt;该方法把默认文件路径下的Customer.hbm.xml文件中的映射信息读入到内存中。&lt;br /&gt;对于第1、2步，使用Annotations的话可以这样写：&lt;br /&gt;Configuration config = new AnnotationConfiguration().configure();&lt;br /&gt;&lt;br /&gt;3).调用Configuration类的buildSessionFactory()方法获得SessionFactory。&lt;br /&gt;sessionFactory = config.buildSessionFactory();&lt;br /&gt;该方法创建一个SessionFactory实例，并把Configuration对象包含的所有配置信息拷贝到SessionFactory对象的缓存中。&lt;br /&gt;当SessionFactory实例创建后，该对象步和Configuration对象关联。因此再修改Configuration对象包含的配置信息不会对SessionFactory对象有任何影响。 &lt;br /&gt;&lt;br /&gt;&lt;em&gt;SessionFactory的缓存可分为两类：内置缓存和外置缓存。SessionFactory的内置缓存中存放了Hibernate配置信息和映射元数据信息等；外置缓存是一个可配置的缓存插件，在默认情况下，SessionFactory不会启用这个缓存插件。外置缓存能存放大量数据库的拷贝，外置缓存的物理介质可以是内存或者硬盘。&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;4).初始化过程结束后，就可以调用SessionFactory实例的openSession方法来获得Session实例，然后操纵数据库的各种操作：&lt;br /&gt;&lt;strong&gt;&amp;middot;save()&lt;/strong&gt;方法：把Java对象保持数据库中&lt;br /&gt;&lt;strong&gt;&amp;middot;update()&lt;/strong&gt;方法：更新数据库中的Java对象&lt;br /&gt;&lt;strong&gt;&amp;middot;delete()&lt;/strong&gt;方法：把Java对象从数据库中删除&lt;br /&gt;&lt;strong&gt;&amp;middot;load()&lt;/strong&gt;方法：从数据库中加载Java对象&lt;br /&gt;&lt;strong&gt;&amp;middot;find()&lt;/strong&gt;方法：从数据库中查找Java对象&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description><category>Hibernate</category><pubDate>Wed, 08 Apr 2009 22:07:47 +0800</pubDate><author>jjr2001425@126.com (jjr)</author><comments>http://www.foolpid.net/post/20090408846.html#comment</comments><guid isPermaLink="false">http://www.foolpid.net/post/20090408846.html</guid><dc:creator>jjr2001425@126.com (jjr)</dc:creator><fs:srclink>http://www.foolpid.net/post/20090408846.html</fs:srclink><fs:srcfeed>http://www.foolpid.net/rss.xml</fs:srcfeed><fs:itemid>feedsky/foolpid/~7159750/217014597/5268593</fs:itemid></item></channel></rss>
