﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Flyingis-随笔分类-Hibernate</title><link>http://www.blogjava.net/flyingis/category/4273.html</link><description>Talking and thinking freely !&lt;br&gt;
Flying in the world of Java and GIS !</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:21:20 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:21:20 GMT</pubDate><ttl>60</ttl><item><title>Hibernate的灵活与方便</title><link>http://www.blogjava.net/flyingis/archive/2006/01/14/28004.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sat, 14 Jan 2006 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2006/01/14/28004.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/28004.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2006/01/14/28004.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/28004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/28004.html</trackback:ping><description><![CDATA[<FONT size=2>&nbsp;&nbsp;&nbsp; 作者：<A href="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><A href="/flyingis/"></A><BR><BR>&nbsp;&nbsp;&nbsp; 许多软件设计的思维都源于生活的方方面面，可能存在某些设计思想并非受平时生活所启迪，但它们面临的情况却如此相象。软件设计原本就是生活的一部分，软件设计的“灵活”与“方便”(或“简便”)即是世界万物的一个共同点。<BR><BR>&nbsp;&nbsp;&nbsp; <A href="http://www.hibernate.org/"><FONT color=#000080>Hibernate</FONT></A>作为流行的企业应用和关系数据库之间的持久化中间件，受到越来越多的关注。虽然使用Hibernate可以使得项目易于维护，帮助开发人员更好地处理复杂关系模型，提供了很强的方便性，但却失去了JDBC原有的灵活性。如何在“灵活”与“方便”之间取舍、平衡显得重要起来。<BR><BR>&nbsp;&nbsp;&nbsp; 不久前<A href="/calvin/"><FONT color=#000080>江南白衣</FONT></A>的一篇文章<A id=viewpost1_TitleUrl href="/calvin/archive/2006/01/05/26791.html"><FONT color=#000080>ORM透明持久化方案面对的共同困境</FONT></A>道出了现在ORM不尽如人意的地方，除了网上，还有书本的前言等对Hibernate的众多赞美之词外，现在讨论它呆板、配置繁琐的声音也逐渐多了起来，最热闹的就是前段时间<A href="http://www.rubyonrails.com/"><FONT color=#000080>Ruby on Rails</FONT></A>引起J2EE阵营的骚动。个人对Java研究尚浅，对Hibernate有一些使用心得，下面所列出的不一定是Hibernate本身的缺陷，不足之处希望大家拍砖指出。<BR><BR>1.&nbsp; 提取表单中字典Value的不便。<BR>&nbsp;&nbsp;&nbsp; 字典一般由ID和NAME两个字段组成，其ID号存储于数据库其他表中，当查询这些表信息时，Hibernate以List或Set形式返回的结果，没有办法将ID号显示为对应的NAME。在JDBC中，可以直接通过Map来存储字典，通过map.getValue()来返回字典的值。<BR><BR>2.&nbsp; Hibernate内置映射类型复杂化<BR>&nbsp;&nbsp;&nbsp; 在开发过程中，时常会查找Hibernate映射类型--Java类型--标准SQL类型之间的关系。繁杂之处体现在两方面，一是各种数据库的数据类型和标准SQL之间会有一定的出入，二是Hibernate映射类型虽然大部分和Java类型相同，但也存在比较晦涩的地方，例如character类型对应Java的char / java.lang.Character / java.lang.String，text对应着Java的java.lang.String。<BR><BR>3.&nbsp; ID规定化生成<BR>&nbsp;&nbsp;&nbsp; Hibernate中内置标识符生成器给表单ID自动生成提供了方便，但却不能自定义各种ID形式。开发过程中，有时需要特定的ID号来区分各种字典，例如字典1的ID号为1A，2A……，字典2的ID号为1B，2B……，当这些ID号存储在表单中时，可以方便开发人员在数据库中查找各表单存储各类字典数据的情况，方便调试，但使用Hibernate生成器就失去了这种灵活性。<BR><BR>&nbsp;&nbsp;&nbsp; <A href="http://www.matrix.org.cn/resource/news/381_Hibernate.html"><FONT color=#000080>Hibernate的不足</FONT></A>网上已有很多讨论，以上只是个人增加的几点体会。即使这样，Hibernate仍是一款优秀的持久层插件，只是“灵活”的背后隐藏着“复杂”，“方便”的背后隐藏着“不便”，如何取舍与平衡，还是看实际需要吧。</FONT><img src ="http://www.blogjava.net/flyingis/aggbug/28004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2006-01-14 10:22 <a href="http://www.blogjava.net/flyingis/archive/2006/01/14/28004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate学习心得--性能优化</title><link>http://www.blogjava.net/flyingis/archive/2005/11/15/19809.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Tue, 15 Nov 2005 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2005/11/15/19809.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/19809.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2005/11/15/19809.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/19809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/19809.html</trackback:ping><description><![CDATA[<FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;作者：<A HREF="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; 在使用Hibernate进行查询的时候大家都会用到Hibernate缓存，其中Session缓存即一块内存空间，存放了相互关联的Java对象，这些位于Session缓存中的对象就是持久化对象，Session根据持久化对象的状态变化来同步更新数据库。这个Session缓存是Hibernate的一级缓存。此外，SessionFactory有一个内置缓存和一个外置缓存，即Hibernate的第二级缓存。而Hibernate正是由于这些缓存的存在，才使得其数据库操作效率提高，就是说，在提供了方便易操作的操作数据库数据的方式的同时保证了工作效率，但是不能因此而免去后顾之忧，需要在设计业务逻辑层的时候考虑使用最优的架构，节省有效的系统资源。在查询方面，Hibernate主要从以下几个方面来优化查询性能：<BR><BR>1.降低访问数据库的频率，减少select语句的数目。实现手段包括：<BR><BR>&nbsp;&nbsp;&nbsp; 使用迫切左外连接或迫切内连接检索策略。<BR>&nbsp;&nbsp;&nbsp; 对延迟检索或立即检索策略设置批量检索数目。<BR>&nbsp;&nbsp;&nbsp; 使用查询缓存。<BR><BR>2.避免多余加载程序不需要访问的数据。实现手段包括：<BR><BR>&nbsp;&nbsp;&nbsp; 使用延迟检索策略。<BR>&nbsp;&nbsp;&nbsp; 使用集合过滤。<BR><BR>3.避免报表查询数据占用缓存。实现手段为利用投影查询功能，查询出实体的部分属性。<BR><BR>4.减少select语句中的字段，从而降低访问数据库的数据量。实现手段为利用Query的iterate()方法。<BR></FONT><FONT size=2><BR>&nbsp;&nbsp;&nbsp; 在插入和更新数据时，要控制insert和update语句，合理设置映射属性来保证插入更新的性能，例如，当表中包含许多字段时，建议把dynamic-update属性和dynamic-update属性都设为true，这样在insert和update语句中就只包含需要插入或更新的字段，这可以节省数据库执行SQL语句的时间，从而提高应用的运行性能。</FONT> 
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 还有什么其它的提升性能的方式希望和大家一起讨论。</FONT></P><img src ="http://www.blogjava.net/flyingis/aggbug/19809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-11-15 10:22 <a href="http://www.blogjava.net/flyingis/archive/2005/11/15/19809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate学习心得--映射对象标识符</title><link>http://www.blogjava.net/flyingis/archive/2005/11/14/19658.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Mon, 14 Nov 2005 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2005/11/14/19658.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/19658.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2005/11/14/19658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/19658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/19658.html</trackback:ping><description><![CDATA[<FONT size=2>&nbsp;&nbsp;&nbsp; 作者：<A HREF="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR><BR>&nbsp;&nbsp;&nbsp; 在关系数据库中的主键可分为自然主键(具有业务含义)和代理主键(不具有业务含义)，其中代理主键可以适应不断变化的业务需求，因此更加流行。代理主键通常为整数类型，与此对应，在持久化类中野应该把OID定义为整数类型，Hibernate允许把OID定义为short、int和long类型，以及它们的包装类型。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;Hibernate提供了几种内置标识符生成器，每一种标识符生成器都有它的使用范围，应该根据所使用的数据库和Hibernate应用的软件架构来选择合适的标识符生成器。下面是几种常用数据库系统可使用的标识符生成器：<BR><BR>MYSQL:&nbsp;identity&nbsp;increment&nbsp;hilo&nbsp;native<BR>MS&nbsp;SQL&nbsp;Server:&nbsp;identity&nbsp;increment&nbsp;hilo&nbsp;native<BR>Oracle:&nbsp;sequence&nbsp;seqhilo&nbsp;hilo&nbsp;increment&nbsp;native<BR>夸平台开发:&nbsp;native<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;OID是为持久化层服务的，它不具备业务含义，而域对象位于业务逻辑层，用来描述业务模型。因此，在域对象中强行加入不具备业务含义的OID，可以看作是持久化层对业务逻辑层的一种渗透，但这种渗透是不可避免的，否则Hibernate就无法建立缓存中的对象与数据库中记录的对应关系。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;当然，映射中还包括自然主键的映射方案。对于从头设计的关系数据库模型，应该优先考虑使用代理主键。</FONT><img src ="http://www.blogjava.net/flyingis/aggbug/19658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-11-14 10:43 <a href="http://www.blogjava.net/flyingis/archive/2005/11/14/19658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate学习心得--Hibernate最简单的描述</title><link>http://www.blogjava.net/flyingis/archive/2005/11/13/19584.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sun, 13 Nov 2005 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2005/11/13/19584.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/19584.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2005/11/13/19584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/19584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/19584.html</trackback:ping><description><![CDATA[<FONT size=2>&nbsp;&nbsp;&nbsp; 作者：<A HREF="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR><BR>&nbsp;&nbsp;&nbsp; 在网上很多文章和论坛都在讨论Hibernate，初次接触Hibernate，当然需要知道它是什么，可以用来做什么。用简单的语言来描述，可以认为Hibernate是：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;它是连接Java应用程序和关系数据库的中间件。<BR>&nbsp;&nbsp;&nbsp;&nbsp;它对JDBC&nbsp;API进行了封装，负责Java对象的持久化。<BR>&nbsp;&nbsp;&nbsp;&nbsp;在分层的软件架构中它位于持久花层，封装了所有数据访问细节，使业务逻辑层可以专注于实现业务逻辑。<BR>&nbsp;&nbsp;&nbsp;&nbsp;它是一种ORM(Object-Relation&nbsp;Mapping)映射工具，能够建立面向对象的域模型和关系数据库模型之间的映射。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;在Java应用中使用Hibernate包含以下步骤：<BR><BR>1.创建Hibernate的配置文件。<BR>2.创建持久化类。<BR>3.创建对象-关系映射文件。<BR>4.通过Hibernate&nbsp;API编写访问数据库的代码。</FONT><img src ="http://www.blogjava.net/flyingis/aggbug/19584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-11-13 13:14 <a href="http://www.blogjava.net/flyingis/archive/2005/11/13/19584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 2 升级为Hibernate 3 的注意事项[转载]</title><link>http://www.blogjava.net/flyingis/archive/2005/11/12/19518.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sat, 12 Nov 2005 11:29:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2005/11/12/19518.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/19518.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2005/11/12/19518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/19518.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/19518.html</trackback:ping><description><![CDATA[<FONT size=2>目的，主要是那当前的项目练手，熟悉一下hibernate2和hibernate3的差别，给当前项目一点扩展的空间。<BR><BR>1.首先将hibernate2.jar替换为hibernate3.jar(hibernate-3.0.5)<BR>&nbsp;&nbsp;hibernate-tools.jar也替换成新的(从hibernate-tools-3.0.0.alpha4a找出来的)<BR><BR>2.将所有程序中的net.sf.hibernate替换为org.hibernate.<BR>&nbsp;<BR>3.但是有例外<BR>&nbsp;&nbsp;net.sf.hibernate.expression.Expression换为org.hibernate.criterion.Expression<BR>&nbsp;&nbsp;如果用eclipse,用ctrl+shift+o快捷键可以加快速度<IMG onclick="window.open('/images/smile.gif','_blank');" hspace=2 src="http://www.blogcn.com/images/smile.gif" onload="javascript:if(this.width>screen.width/2)this.width=screen.width/2" vspace=2 border=0><BR>&nbsp;<BR>4.在使用hql查询时将<BR>&nbsp;&nbsp;createSQLQuery(hql,"c",EZCampaignDTO.class);改为createSQLQuery(hql).addEntity("c",EZCampaignDTO.class);<BR>&nbsp;<BR>5.在批量插入时<BR>&nbsp;&nbsp;将原来的int&nbsp;size&nbsp;=&nbsp;((SessionFactoryImpl)(session.getSessionFactory())).getJdbcBatchSize()<BR>&nbsp;&nbsp;改为int&nbsp;size&nbsp;=&nbsp;((SessionFactoryImpl)(session.getSessionFactory())).getSettings().getJdbcBatchSize();<BR>&nbsp;<BR>6.在计算count时<BR>&nbsp;&nbsp;将原来的int&nbsp;size&nbsp;=&nbsp;((Integer)&nbsp;session.iterate(hql).next()).intValue();<BR>&nbsp;&nbsp;改为int&nbsp;size&nbsp;=&nbsp;((Integer)&nbsp;session.createQuery(hql).iterate().next()).intValue();<BR>其中hql="select&nbsp;count(*)&nbsp;from&nbsp;"&nbsp;+&nbsp;DAOVar.contactClass;<BR>&nbsp;<BR>7.还有就是把.hbm中的hibernate-mapping-2.0.dtd替换为hibernate-mapping-3.0.dtd<BR>&nbsp;&nbsp;Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;2.0替换为Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0<BR>&nbsp;<BR>8.hibernate.cfg.xml中<BR>&nbsp;&nbsp;Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;2.0替换为Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0<BR>&nbsp;&nbsp;&lt;property&nbsp;name="hibernate.dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt;<BR>&nbsp;<BR>9.hibernate.properties中类似<BR>&nbsp;<BR>10.cache-config.xml中<BR>&nbsp;&nbsp;&nbsp;&lt;provider&nbsp;className="net.sf.hibernate.cache.OSCacheProvider"/&gt;替换为<BR>&nbsp;&nbsp;&nbsp;&lt;provider&nbsp;className="org.hibernate.cache.OSCacheProvider"/&gt;<BR>&nbsp;<BR>11.classeshibernate.properties中<BR>&nbsp;&nbsp;&nbsp;hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider<BR>&nbsp;&nbsp;&nbsp;hibernate.dialect=org.hibernate.dialect.SQLServerDialect<BR>&nbsp;<BR>12.在自动外部模块部分有一个功能是根据模版自动生成.hbm文件在load,结果出来的.hbm中有问题:<BR>&nbsp;&nbsp;&nbsp;生成的&nbsp;&lt;composite-id&nbsp;unsaved-value="any"&nbsp;mapped="false"&gt;其中mapped="false"&nbsp;出错。找了半天才发现在网上的hibernate-mapping-3.0.dtd文件有支持mapped="false"这个属性。而本地的hebernate3.0.5中的hibernate-mapping-3.0.dtd文件没有这个属性。晕，hibernate也太不负责了吧。解决办法把hibernate-mapping-3.0.dtd&nbsp;copy到jboss\bin目录下然后，在template文件中&lt;!DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD//EN"&nbsp;"hibernate-mapping-3.0.dtd"&gt;，然后他会在jboss\bin目录下读取该文件。<BR>&nbsp;<BR>13.重新测试,还是咣铛，发现子类读父类数据时抛出异常：<BR>&nbsp;&nbsp;&nbsp;"org.hibernate.LazyInitializationException:&nbsp;could&nbsp;not&nbsp;initialize&nbsp;proxy"<BR>&nbsp;&nbsp;&nbsp;延迟抓取出的错，hb3对many-to-one的默认处理是lazy&nbsp;=&nbsp;"proxy"，没有搞懂到底怎么回事，把所有many-to-one,one-to-one都加上lazy="false"，再测试终于大功告成。<BR><BR>文章原作者Blog：</FONT><A href="http://blog.csdn.net/chinaewolf/" target=_blank><FONT size=2><IMG alt=::URL:: hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0></FONT><A href="http://blog.csdn.net/chinaewolf/" target=_blank><FONT size=2>http://blog.csdn.net/chinaewolf/</FONT></A><img src ="http://www.blogjava.net/flyingis/aggbug/19518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-11-12 19:29 <a href="http://www.blogjava.net/flyingis/archive/2005/11/12/19518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate学习心得--软件设计阶段的模型</title><link>http://www.blogjava.net/flyingis/archive/2005/11/12/19513.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sat, 12 Nov 2005 11:14:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2005/11/12/19513.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/19513.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2005/11/12/19513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/19513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/19513.html</trackback:ping><description><![CDATA[<P><FONT size=2>&nbsp;&nbsp;&nbsp; 作者：<A HREF="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR><BR>&nbsp;&nbsp;&nbsp; 在科学和工程技术领域，模型是一个很有用途的概念，它可以用来模拟一个真实的系统。在软件开发领域，模型用来表示真实世界的实体。在软件开发的不同阶段，需要为目标系统创建不同类型的模型。在分析阶段，需要创建概念模型。在设计阶段，需要创建域模型和数据模型。其中，域模型是面向对象的，数据模型是面向关系的，域模型和数据模型之间存在一种对象-关系映射。<BR><BR><B>概念模型</B><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;概念模型清楚地显示了问题域中的实体。不管是技术人员还是非技术人员都能看得懂改面模型，他们可以很容易地提出模型中存在的问题，帮助分析人员及早对模型进行修改。在软件设计域开发周期中，模型的变更需求提出得越晚，所耗费得开发成本就越大。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;概念模型描述了每个实体得概念和属性，以及实体之间的关系：一对一、一对多和多对多。在现实生活中都可以找到相应的例子，例如一只母鸡有很多小鸡是一对多关系，一位客户选购了很多商品，而这些商品也可以被许多客户选购，这是多对多关系。<BR><BR><B>关系数据模型</B><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;到目前为止，关系数据库仍然是使用最广泛的数据库，它存储的是关系数据。关系数据模型是在概念模型的基础上建立起来的，用于描述这些关系数据的静态结构，它由以下内容组成：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;一个或多个表<BR>&nbsp;&nbsp;&nbsp;&nbsp;表的所有索引<BR>&nbsp;&nbsp;&nbsp;&nbsp;视图<BR>&nbsp;&nbsp;&nbsp;&nbsp;触发器<BR>&nbsp;&nbsp;&nbsp;&nbsp;表与表之间的参照完整性<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;数据库Schema是对数据模型的实现。对于支持SQL的关系数据库，可以采用SQL&nbsp;DDL语言来创建数据库Schema。SQL&nbsp;DDL&nbsp;用于生成数据库中的物理实体，例如下面的创建CUSTOMERS表的&nbsp;SQL&nbsp;DDL：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;create&nbsp;table&nbsp;CUSTOMERS&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;int&nbsp;not&nbsp;null,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAME&nbsp;varchar(20),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AGE&nbsp;int,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primary&nbsp;key&nbsp;(ID)<BR>&nbsp;&nbsp;&nbsp;&nbsp;};<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;值得注意的是，数据库Schema有两种含义，一种是概念上的Schema，指的是一组DDL语句集，该语句集完整地描述了数据库的结构。还有一种是物理上的Schema，指的是数据库中的一个名字空间，它包含一组表、视图和存储过程等命名对象。物理Schema可以通过标准SQL语句来创建、更新和修改。例如以下SQL语句创建了两个物理Schema：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;create&nbsp;schema&nbsp;SCHEMA_A;<BR>&nbsp;&nbsp;&nbsp;&nbsp;create&nbsp;table&nbsp;SCHEMA_A.CUSTOMERS(ID&nbsp;int&nbsp;not&nbsp;null,……);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;create&nbsp;schema&nbsp;SCHEMA_B;<BR>&nbsp;&nbsp;&nbsp;&nbsp;create&nbsp;table&nbsp;SCHEMA_B.CUSTOMERS(ID&nbsp;int&nbsp;not&nbsp;null,……);<BR><BR><B>域模型</B><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;域模型由以下内容组成：具有状态和行为的域对象；域对象之间的关系。<BR><BR>域对象<BR><BR>1.实体域对象：代表人、地点、事物或概念。通常，可以把业务领域中的名词，例如客户、订单、商品，当然也包括前面提到过的母鸡，作为实体域对象；<BR>2.过程域对象：代表应用中的业务逻辑或流程。它通常依赖于实体域对象。<BR>3.事件域对象：代表应用中的一些事件，例如异常、警告或超时等。<BR><BR>域对象之间的关系<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;在域模型中，类之间存在四种关系。<BR><BR>1.关联(Association)<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;关联指的是类之间的引用关系，这是实体域对象之间最普遍的一种关系。关联可以分为一对一、一对多和多对多关联。<BR><BR>2.依赖(Dependency)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;依赖指的是类之间的访问关系。如果类A访问类B的属性或方法，或者说是A负责实例化B，那么可以说类A依赖类B。<BR><BR>3.聚集(Aggregation)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;聚集指的是整体与部分之间的关系，在实体域对象之间也很常见。例如，人与手就是聚集关系，在Person类中由一个hands集合，它存放被聚集的Hand对象：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;Person&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Set&nbsp;hands&nbsp;=&nbsp;new&nbsp;HashSet();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…………<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>4.一般化(Generalization)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;一般化指的是类之间的继承关系。<BR><BR>域对象的持久化概念<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;当实体域对象在内存中创建后，它们不可能永远存在。最后，他们要么从内存中清除，要么被持久化到数据存储库中。内存无法永久地保存数据，因此必须对实体域对象进行持久化。否则，如果对象没有被持久化，用户在应用运行时创建地订单信息将在应用结束运行后随之消失。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;当然，并不是所有地域对象都需要持久化，通常只有实体域对象才需要持久化，另外，有些实体域对象也不需要持久化。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;狭义的理解，“持久化”仅仅指把域对象永久保存到数据库中；广义的理解，“持久化”包括和数据库相关的各种操作。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp; <FONT color=#0000ff>参考书籍：孙卫琴 精通Hibernate Java对象持久化技术详解</FONT></FONT></P><img src ="http://www.blogjava.net/flyingis/aggbug/19513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-11-12 19:14 <a href="http://www.blogjava.net/flyingis/archive/2005/11/12/19513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>