??xml version="1.0" encoding="utf-8" standalone="yes"?>在线亚洲97se亚洲综合在线,亚洲AV伊人久久青青草原,日韩亚洲精品福利http://m.tkk7.com/microlab4321/category/24783.html适时ȝ是一U很好的彌补Ҏ(gu)!zh-cnFri, 21 Sep 2007 06:46:07 GMTFri, 21 Sep 2007 06:46:07 GMT60Hibernate学习(fn)W记(6)之集合映?/title><link>http://m.tkk7.com/microlab4321/articles/147084.html</link><dc:creator>冬天的猪</dc:creator><author>冬天的猪</author><pubDate>Fri, 21 Sep 2007 05:36:00 GMT</pubDate><guid>http://m.tkk7.com/microlab4321/articles/147084.html</guid><wfw:comment>http://m.tkk7.com/microlab4321/comments/147084.html</wfw:comment><comments>http://m.tkk7.com/microlab4321/articles/147084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/microlab4321/comments/commentRss/147084.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/microlab4321/services/trackbacks/147084.html</trackback:ping><description><![CDATA[<span style="font-size: 18pt"><strong>集合映射</strong></span><br /> 一.<strong>映射Set<br /> </strong>     Set是一个集合接口,它的Ҏ(gu)和数学上的集合有点cMQSet中存攄是对象的引用Q承自Collection借口.<br /> Ҏ(gu):(x)    1:不允许存N复元素?br />             2:元素是无序?br />             3:主要有HashSet,LinkedHashSet,TreeSet 3个实现Set接口的具体类?br />      (1).<strong>HashSet</strong>按照特定的Hash法存取对象Q效率较高,存取对象的速度快?br />      (2).<strong>LinkedHashSet</strong>是HashSet的子c,它用链表数据结构存取,与HashSet不同之处在于LinkHashSet中的元素h固定的顺?br />      (3).TreeSet是一个具有排序功能的集合Q实CSorted接口Q在加入对象Ӟ按照集合中的对象q行了排序。但加入用户自定义时Q如Studentc,则Studentc需要实现Comparable接口排序?br /> <br /> <strong>?映射List</strong><br />    List是一个集合接口,他承自Collection接口QList中存攄是对象的引用<br />  Ҏ(gu)?    1.List中可以存N复元素?br />               2.List中的元素是一个有序的集合Q可以通过索引讉KList中的元素?br />               3.List主要有ArryList和LinkedList实现Set接口的具体类?nbsp; <br />        (1).<strong>ArryList</strong>是一个可变的数组Q它h快速读取对象的Ҏ(gu),但是如果删除或者插入对象则效率较底Q因为每ơ位|i插入一个对象时Q从位置i+1到最后都要移一个位|;而每ơ删除位|i上的一个对象,从位|i+1到最后则要前UM个位|?br />       (2).<strong>LinkedList</strong>在内部采用链表的形式存储数据Q因此在删除和插入对象时?x)有较高的效率。如果经帔R要在List中插入和删除数据Q徏议用LinkList;如果List中的对象很少Q徏议用ArrayList<br /> <br /> <strong>?映射Bag</strong><br />      Bagq不是Java中的接口Q它是Hibernate提供的集合,Bag中可以有重复的元素,但是Bag中的元素q没有排序。如果有大量的重复数据,<Bag>标签的效率比较低Q它在更新数据时采用的是先删除要更新的数据,然后插入数据。?lt;ibag>可以避免q种情况?br /> <br /> <strong>?映射Map</strong><br />      Map是java中的接口Q它是一U重要的集合Q它使用Key/value的方式存储数? <img src ="http://m.tkk7.com/microlab4321/aggbug/147084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/microlab4321/" target="_blank">冬天的猪</a> 2007-09-21 13:36 <a href="http://m.tkk7.com/microlab4321/articles/147084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]Hibernate 参数讄一览表 http://m.tkk7.com/microlab4321/articles/142256.html冬天的猪冬天的猪Mon, 03 Sep 2007 04:36:00 GMThttp://m.tkk7.com/microlab4321/articles/142256.htmlhttp://m.tkk7.com/microlab4321/comments/142256.htmlhttp://m.tkk7.com/microlab4321/articles/142256.html#Feedback0http://m.tkk7.com/microlab4321/comments/commentRss/142256.htmlhttp://m.tkk7.com/microlab4321/services/trackbacks/142256.htmlHibernate 参数讄一览表


属性名 用?
取?/span>eg.取?/span>取?/span>取?/span>取?/span>取?/span> ?tt class="literal">取?/span> 的取gؓ(f)取?/span>取?/span>取?/span>取?/span>取?/span>

?nbsp;3.4.  Hibernate JDBC和连?connection)属?

属性名 用?
取?/span> ?tt class="literal">eg.eg.取?/span>取?/span>取?/span>取?/span>取?/span>取?/span>取?/span><propertyName> JDBC属?tt class="literal"><propertyName> 属?tt class="literal">

?nbsp;3.5.  Hibernate~存属?

属性名 用?
取?/span>取?/span>取?/span>取?/span>取?/span>取?/span>取?/span>

?nbsp;3.6.  Hibernate事务属?

属性名 用?
取?/span>取?/span>取?/span>取?/span>取?/span>

?nbsp;3.7.  其他属?

属性名 用?
eg.取?/span>取?/span>取?/span>取?/span>

3.4.1.  SQL方言

你应当LZ的数据库?tt class="literal">

?nbsp;3.8.  Hibernate SQL方言 (

RDBMS 方言
DB2 ?nbsp;3.9.  Hibernate日志cd

cd 功能
?nbsp;3.10. JTA TransactionManagers

Transaction工厂c? 应用E序服务?
JBoss
Weblogic
WebSphere
WebSphere 6
Orion
Resin
JOTM
JOnAS
JRun4
Borland ES



冬天的猪 2007-09-03 12:36 发表评论
]]>(?谈hibernate性能优化的几点徏?http://m.tkk7.com/microlab4321/articles/137559.html冬天的猪冬天的猪Fri, 17 Aug 2007 07:41:00 GMThttp://m.tkk7.com/microlab4321/articles/137559.htmlhttp://m.tkk7.com/microlab4321/comments/137559.htmlhttp://m.tkk7.com/microlab4321/articles/137559.html#Feedback0http://m.tkk7.com/microlab4321/comments/commentRss/137559.htmlhttp://m.tkk7.com/microlab4321/services/trackbacks/137559.html    卛_hibernate配制文g中进行配Ӟ(x)
 
 1 <property name="hibernateProperties">
 2             <props>
 3                 <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
 4                 <prop key="hibernate.show_sql">false</prop>
 5                 <!-- Create/update the database tables automatically when the JVM starts up
 6                     <prop key="hibernate.hbm2ddl.auto">update</prop> -->
 7                 <!-- Turn batching off for better error messages under PostgreSQL 
 8                     <prop key="hibernate.jdbc.batch_size">100</prop> -->
 9                 <prop key="hibernate.jdbc.batch_size">50</prop>
10             </props>
11         </property>
Fetch Size讄大Q读数据库的ơ数少Q速度快QFetch Size小Q读数据库的ơ数多Q速度慢?br>2、如果是大的系l,生成htm文g。加快页面提升速度?br>3、不要把所有的责Q推在hibernate上,对代码进行重构,减少Ҏ(gu)据库的操作,量避免在数据库查询时用in操作Q以?qing)避免递归查询操作Q代码质量、系l设计的合理性决定系l性能的高低?br>4?nbsp;对大数据量查询时Q慎用list()或者iterator()q回查询l果Q?
     Q?Q? 使用List()q回l果ӞHibernate?x)所有查询结果初始化为持久化对象Q结果集较大Ӟ?x)占用很多的处理旉?
     Q?Q? 而用iterator()q回l果Ӟ在每ơ调用iterator.next()q回对象q用对象时QHibernate才调用查询将对应的对象初始化Q对于大数据量时Q每调用一ơ查询都?x)花费较多的旉。当l果集较大,但是含有较大量相同的数据Q或者结果集不是全部都会(x)使用Ӟ使用iterator()才有优势?br>5、在一对多、多对一的关pMQ用gq加载机Ӟ?x)不少的对象在使用时方会(x)初始化Q这样可使得节省内存I间以及(qing)减少数据库的负荷Q而且若PO中的集合没有被用时Q就可减互数据库的交互从而减处理时间?
6、对含有兌的POQ持久化对象Q时Q若default-cascade="all"或?“save-update”Q新增POӞh意对PO中的集合的赋值操作,因ؓ(f)有可能得多执行一ơupdate操作?nbsp;
7?对于大数据量新增、修攏V删除操作或者是对大数据量的查询Q与数据库的交互ơ数是决定处理时间的最重要因素Q减交互的ơ数是提升效率的最好途径Q所以在开发过E中Q请show_sql讄为trueQ深入了解Hibernate的处理过E,试不同的方式,可以使得效率提升。尽可能Ҏ(gu)个页面的昄Q对数据库的操作减少?00----150条以内。越越好?br>以上是在q行struts+hibernate+springq行目开发中Q对hibernate性能优化的几点心得?

冬天的猪 2007-08-17 15:41 发表评论
]]>
Hibernate学习(fn)心得--性能优化http://m.tkk7.com/microlab4321/articles/137046.html冬天的猪冬天的猪Wed, 15 Aug 2007 13:16:00 GMThttp://m.tkk7.com/microlab4321/articles/137046.htmlhttp://m.tkk7.com/microlab4321/comments/137046.htmlhttp://m.tkk7.com/microlab4321/articles/137046.html#Feedback0http://m.tkk7.com/microlab4321/comments/commentRss/137046.htmlhttp://m.tkk7.com/microlab4321/services/trackbacks/137046.html文章:http://m.tkk7.com/flyingis/archive/2005/11/15/19809.aspx
作者:(x)
Flyingis
    
    在用Hibernateq行查询的时候大安?x)用到Hibernate~存Q其中Session~存即一块内存空_(d)存放了相互关联的Java对象Q这些位于Session~存中的对象是持久化对象,SessionҎ(gu)持久化对象的状态变化来同步更新数据库。这个Session~存是Hibernate的一U缓存。此外,SessionFactory有一个内|缓存和一个外|缓存,即Hibernate的第二~存。而Hibernate正是׃q些~存的存在,才得其数据库操作效率提高,是_(d)在提供了方便易操作的操作数据库数据的方式的同时保证了工作效率Q但是不能因此而免d之忧,需要在设计业务逻辑层的时候考虑使用最优的架构Q节省有效的pȝ资源。在查询斚wQHibernate主要从以下几个方面来优化查询性能Q?br>
1.降低讉K数据库的频率Q减select语句的数目。实现手D包括:(x)

    使用q切左外q接或迫切内q接索策略?br>    对gq检索或立即索策略设|批量检索数目?br>    使用查询~存?br>
2.避免多余加蝲E序不需要访问的数据。实现手D包括:(x)

    使用延迟索策略?br>    使用集合qo(h)?br>
3.避免报表查询数据占用~存。实现手Dؓ(f)利用投媄查询功能Q查询出实体的部分属性?br>
4.减少select语句中的字段Q从而降低访问数据库的数据量。实现手Dؓ(f)利用Query的iterate()Ҏ(gu)?br>
    在插入和更新数据Ӟ要控制insert和update语句Q合理设|映属性来保证插入更新的性能Q例如,当表中包含许多字D|Q徏议把dynamic-update属性和dynamic-update属性都设ؓ(f)trueQ这样在insert和update语句中就只包含需要插入或更新的字D,q可以节省数据库执行SQL语句的时_(d)从而提高应用的q行性能?/font>

    q有什么其它的提升性能的方式希望和大家一赯论?/font>



冬天的猪 2007-08-15 21:16 发表评论
]]>Hibernate实践 http://m.tkk7.com/microlab4321/articles/137045.html冬天的猪冬天的猪Wed, 15 Aug 2007 13:14:00 GMThttp://m.tkk7.com/microlab4321/articles/137045.htmlhttp://m.tkk7.com/microlab4321/comments/137045.htmlhttp://m.tkk7.com/microlab4321/articles/137045.html#Feedback0http://m.tkk7.com/microlab4321/comments/commentRss/137045.htmlhttp://m.tkk7.com/microlab4321/services/trackbacks/137045.html文章:http://m.tkk7.com/BlueDavy/archive/2006/03/27/37582.html
一.
            
?/strong>

在实际项目中使用Hibernate有两q多了,在两q多的实践过E中既体验到?span>Hibernate带来?span>N多好处,同时也碰C的问题Q特写此文章做个ȝQ记录自己在Hibernate实践中的一些经验,希望对于C?span>Hibernate的朋友能有个帮助Q避免走q多的弯路?/span>

阅读本文前徏议至拥?span>Hibernate的一些基本知识,因ؓ(f)本文不会(x)去详l介l相关的基本知识Q最好就是先?span>Hibernate开发了一?span>HelloWorldQ?span>^_^?/span>

Ҏ(gu)自己所l历的项目中使用Hibernate所涉及(qing)的范_(d)本文从开发环境、开发、设计、性能、测试以?qing)推荐的相关书籍斚wq行讲述Q本文档不?x)讲的非常细_(d)只是Ҏ(gu)自己在实跉|的经验提Z些徏议,关于l致以及(qing)具体的部分请参阅?span>Hibernate Reference》或推荐的相关书c章节?/span>

此文档的PDF版本请到此下载:(x)

http://m.tkk7.com/Files/BlueDavy/Hibernate 实践.rar

本文允许转蝲Q但转蝲时请注明作者以?qing)来源?/span>

作者:(x)BlueDavy

来源Q?span>m.tkk7.com/BlueDavy

?              开发环?/strong>

Hibernate 开发环境的搭徏非常的简单,不过Z提高ZHibernate开发的效率Q通常都需要用一些辅助工P?span>xdoclet?span>middlegen{?/span>

Hibernate已经装提供了很单的q行持久的方法,但在实际目的用中基本q是要提供一些通用的代码,以便在进行持久的相关操作的时候能够更加的方便?/span>

2.1. lib

2.1.1.        Hibernate lib

Hibernate 相关?/span> lib 自然是开发环境中首要的问题,q部分可以从 Hibernate 的官方网站进行下载,在其官方|站中同时提供了对于 Hibernate 所必须依赖?/span> lib 以及(qing)其他可?/span> lib 的介l?/span>

2.2. xdoclet

Hibernate 作ؓ(f)ORM工具Q从名字上就能看出它需要一个从O à R ?span>Mapping的描qͼ而这个描q就是在使用Hibernate时常见的hbm.xmlQ在没有工具支持的情况下Q需要在~写持久层对象的同时手写q个文gQ甚Zѝ?/span>

?span>jdk 5.0未推Z前,xdoclet支持的在javadoc中编写注释生成相关配|文件的方式大受Ƣ迎Q减了~写hibernate映射文g的复杂性,手写一个完整的hibernate映射文g出错几率比较的高Q再加上手写Ҏ(gu)造成~写出来的风格相差很大,因此Q基?span>xdoclet来生?span>hbm.xml的方式被大量的采用,Zxdoclet来编写能够基于我们在持久层对象上~写?span>javadoc来生?span>hbm.xml文gQ非常的方便?/span>

2.2.1.        Hibernate template

如果没记错的话,大概?/span> 04 q的时?/span> javaeye 上有位同仁整理了一个这L(fng) template 文gQ?/span> ^_^ Q非常感谢,我一直都在用着Q呵c(din)?/span>

q个文g的方便就是把它导?/span> eclipse 后,?/span> javadoc 中我们可以直接写 hibid Q然后按 eclipse 的代码辅助键 (alt+/) 来生成整?/span> hibernate.id 的相关的格式Q呵呵,免得在写 hibernate.id q些东西的时候过于麻烦, ^_^ Q这?/span> template 文g我稍微做了修改,可在q里下蝲Q?/span>

http://m.tkk7.com/Files/BlueDavy/templates-eclipse-tags.rar

当然Q你也可以选择直接?/span> xdoclet 提供?/span> template 文gQ不q?/span> xdoclet 官方|站上好像只提供了可直接导入 idea 的模板文件?/span>

关于注释上的 hibernate.id q些东西具体请参?/span> xdoclet 官方|站的说明?/span>

如果你的目采用的是 jdk 5 Q那么就可以直接使用 hibernate annotation 了,那就更ؓ(f)方便?/span>

2.2.2.        Ant task build

Eclipse 里没有集?/span> xdoclet 的插Ӟ你也可以d装一?/span> jboss ide 的插Ӟ里面?/span> xdoclet 的插Ӟ反正我是觉得太麻烦了?/span>

在项目中我仍焉?/span> ant task 的方式来生成 hbm.xml Q?/span> target 如下所C:(x)

<path id="app.classpath">

<pathelement path="${java.class.path}"/>

<fileset dir="${xdoclib.dir}">

<include name="*.jar"/>

</fileset>

</path>

<target name="hbm" description=" 生成映射文g ">

<tstamp>

<format property="TODAY" pattern="yy-MM-dd"/>

</tstamp>

<taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask" classpathref="app.classpath"/>

<hibernatedoclet destdir="src/java" force="true" verbose="true" excludedtags="@version,@author,@todo">

<fileset dir="src/java">  

<include name="**/po/**/*.java"/>

</fileset>

<hibernate version ="3.0"/>

</hibernatedoclet>

</target>

q个文gh据项目情况以?qing)环境稍做修改?/span> ^_^ Q其中需要通过 properties 文g指明 xdocletlib.dir Q类?/span> xdocletlib.dir=c:\xdocletlib Q里面放|?/span> xdoclet 的相?/span> jar 文g?/span>

在搭建好了这L(fng)环境后,可以在直接?/span> eclipse 中运?/span> ant 文g中的q个 target 来生?/span> hbm.xml ?/span>

2.3. Hibernate3 Tools

如果采用Hibernate 3Q则可以直接下蝲Hibernate 3 Tools?span>Eclipse PluginQ那可以类似在PL/SQL里执?span>sql一样在eclipse里执?span>hqlQ?span>^_^

2.4. HibernateUtil

Z方便目?span>Hibernate的用,一般来说都?x)提?span>HibernateUtilq样的类Q这个类的作用主要是创徏sessionFactory和管?span>sessionQ在Hibernate 3以前采用的是在这里徏?span>ThreadLocal来存?span>sessionQ在Hibernate 3以后则可以直接?span>SessionFactory.getCurrentSession来获?span>sessionQ?span>session的获取方式则可通过?span>hibernate.cfg.xml中执?span>current_session_context_class的属性来军_是采?span>thread?span>jta或自定义的方式来产生session?/span>

2.5. CommonDao

在持久层部分目前采用的较多的仍然?span>dao模式Q?span>Hibernate作ؓ(f)ORM工具已经提供?span>CRUD的封装,cd可以使用session.save()Q?span>session.persist()q样单的方式来完?span>CRUD的操作,但在实际的项目中q是需要提供一个通用?span>DaoQ来化对于事务、异常处理以?span>session的操作,同时提供一些项目中需要的相关操作?/span>

?              开?/strong>

在完成了Hibernate的开发环境的搭徏后,可以基?span>Hibernateq行持久层的开发了Q对于持久层开发来_(d)?x)涉及(qing)到实体的编写、实体的l护以及(qing)实体的查询三个部分?/span>

3.1. 实体的编?/span>

Hibernate 的一个明昄优点是在于可透明化的对对象进行持久,q也意味着持久对象Ҏ(gu)׃需要依赖Q何的东西Q可以采?span>POJO的方式来~写Q在Hibernate 3以上版本q提供了对于Map?span>XML的方式的持久的支持,更方便了,在项目中Q更多采用的仍然?span>POJO的方式?/span>

在实体的~写上应该说不会(x)有什么问题,只要仔细查看xdoclet关于hibernatedoclet部分的说明即可完成?/span>

q块需要学?fn)的主要是普通的值类型注释的~写?span>id字段注释的编写、关联注释的~写Q这些部?span>xdoclet均提供了较详l的说明?/span>

3.2. 实体的维?/span>

3.2.1.        新增 / ~辑 / 删除

新增 / ~辑 / 删除是持久操作中最怋用的l护性操作,Z Hibernate 做这L(fng)l护比采用 sql 的方式简单多了,通过上面 CommonDao Q就可以直接完成 dao.save ?/span> dao.update ?/span> dao.delete 的操作,而且?/span> Hibernate 3 也支持了扚w?/span> insert ?/span> update ?/span> delete ?/span>

q个部分中需要注意的?/span> Hibernate 对于对象的三U状态的定义Q?/span>

u       Transient

很容易理解,是从未?/span> session 发生q关pȝ对象Q?/span> ^_^ Q例如在代码中直?/span> User user=new User() Q这样Ş成的 user 对象Q就UCؓ(f) Transient 对象了?/span>

u       Detached

同样很容易理解,是?/span> session 发生q关pȝ对象Q但 session 已经关闭了的情况下存在的对象Q例如:(x)

User user=new User();

user.setName(“bluedavy”);

session.save(user);

session.close();

?/span> session.close() 后这个时候的 user 对象处?/span> Detached 状态之中了Q如果想这个对象变?/span> Persistent 状态,可以通过 session.merge ?/span> session.saveOrUpdate() {方式来实现?/span>

Detached 状态的对象在实际的应用中最帔R用,从概念上我们可以q么理解Q处?/span> Detached 状态的对象可以看做是一?/span> DTO Q而不?/span> PO Q这从很大程度上方便了 PO 在实际项目中的用了?/span>

u       Persistent

Persistent 状态就是指?/span> Session 发生了关pȝ对象Qƈ且此?/span> session 未关闭,举例如下Q?/span>

User user=new User();

user.setName(“bluedavy”);

session.save(user);

user.getName();

?/span> session.save ?/span> user 处?/span> Persistent 状态,此时如果通过 session Ҏ(gu) user ?/span> id 去获?/span> user 对象Q则可发现获取的对象和之前的 user 是同一个对象,q是 session 一U缓存所L(fng)作用了,当然Q也可以强制的刷?/span> session 的一U缓存,?/span> session 从数据库中重新获取,只需要在获取前执?/span> session.evict(user) ?/span> session.clear() ?/span>

3.2.2.        兌l护

兌l护?/span> Hibernate 中表现出来可能会(x)让熟(zhn)?/span> sql 的h有些的不熟,但其实以对象的观点去看是?x)觉得很正常的?/span>

?/span> Hibernate 的关联维护中Q最重要的是 inverse ?/span> cascade 两个概念?/span>

u       inverse

inverse 从词义上看过d能不是那么容易理解,其实它的意思就是由谁来控制兌关系的自动维护,?/span> inverse=true 意味着当前对象是不能自动维护关联关p,?/span> inverse=false 意味着当前对象可自动维护关联关p,q是举例来说Q?/span>

假设 Org ?/span> User 一对多兌Q?/span>

?/span> org ?/span> getUsers ?/span> inverse=false 的情况:(x)

org.getUsers().add(user);

dao.save(org);

q样执行后将?x)看到数据库?/span> user q条记录中的 orgId 已经被设|上M?/span>

?/span> inverse=true 的情况下Q执行上面的代码Q会(x)发现在数据库?/span> user q条记录中的 orgId 没有被设|上厅R?/span>

^_^ Q?/span> inverse 的作用这样可能看的不是很明显Q在下面的一对多中会(x)加以描述?/span>

u       cascade

cascade 的概念和数据库的 cascade 概念是基本一致的Q?/span> cascade 的意思Ş象的来说是当当前对象执行某操作的情况下Q其兌的对象也执行 cascade 讄的同L(fng)操作?/span>

例如?/span> org.getUsers ?/span> cascade 讄?/span> delete Ӟ当删?/span> org Ӟ相应?/span> users 也同栯删除了,但这个时候要注意Q?/span> org.getUsers q个集合是被删除?/span> user 的集合,也就是说如果q个时候数据库中新增加了一?/span> user l?/span> org Q那么这?/span> user 是不?x)被删除的?/span>

cascade 的属性Dl见?/span> Hibernate reference 》?/span>

3.2.2.1.           一对一

一对一的关联维护在实际目中用不多,一对一?span>Hibernate中可采用两种方式来构成,一U是主键兌Q一U是外键兌?/span>

一对一的用推荐用主键关联,具体配置Ҏ(gu)请参见?span>Hibernate Reference》?/span>

3.2.2.2.           一对多/多对一

一对多/多对一的关联维护在实际目中用是比较多的Q在Hibernate中可采用多种方式来配|一对多的关联,如采?span>Set?span>List?span>Bag?span>Map{,具体在?span>Hibernate Reference》中都有详细说明?/span>

在这里我惌的一点就是关?span>inverse的设|,在一对多的情况下一端的inverse设ؓ(f)trueQ而由多端去自动维护关联关p,Z么这样做其实挺容易理解的Q假?span>org?span>userZ对多的关联,org.getUsers?span>inverse讄?span>falseQ?span>org.getUsers().add(user);dao.update(org);?span>update的时?span>org所兌的所?span>user?span>orgId都会(x)更新一ơ,可想而知q个效率Q而如果改为在多端l护(多端讄?span>inverse=false)Q则是这P(x)user.setOrg(org);dao.update(user);?span>update的时候就仅仅是更?span>userq一条记录而已?/span>

另外一点就是合理的讄cascadeQ这个要Ҏ(gu)需求来实际军_?/span>

3.2.2.3.           多对?/strong>

多对多的兌l护在实际项目中其实也是比较多的Q尽在?span>Hibernate Reference》中认ؓ(f)多对多的情况其实很多时候都是设计造成的?/span>

多对多的兌也同样可以采?span>Set?span>List{多U方式来配置Q具体在?span>Hibernate Reference》中也有详细的说明?/span>

多对多的兌l护上没有什么需要多说的Q在实践q程中来看这块不?x)出什么太多问题,唯一需要注意的是合理设|?span>cascadeQ这个要Ҏ(gu)目的实际情况而定?/span>

3.3. 实体的查?/span>

Hibernate 提供了多U方式来支持实体的查询,如对于原有熟(zhn)?span>sql的h可以l箋使用sqlQ符合对象语a的对象查询语?span>(HQL)以及(qing)条g查询API(Criteria)?/span>

在熟l?span>hql?span>criteria的情况下Q我怿你会(x)觉得Hibernate的查询方式会(x)比采?span>sql的方式更加简ѝ?/span>

3.3.1.        W合对象语言的查询语?/span>

Hibernate 提供了一U符合对象语a的查询语句,UCؓ(f) HQL Q这U语句的好处是能够避免?/span> sql 的情况下依赖数据库特征的情况出现Q同时它带来的最大的好处是我们能够Ҏ(gu) OO 的习(fn)惯去q行实体的查询?/span>

对于 HQL 没有什么多讲的Q如果熟(zhn)?/span> sql 的h应该也是能够很快学?/span> HQL Q而如果不熟?zhn)?/span> sql 的h那也没关p, HQL 的上手是非常Ҏ(gu)的,具体请参考?/span> Hibernate Reference 》?/span>

3.3.2.        占位W式的查?/span>

占位W式的查?/span> ( 是采用 ? 替换查询语句中的变量 ) 是在采用 sql 的情况下l常使用的一U查询方式,也是查询时推荐用的一U方式?/span>

Hibernate 中的查询参数主要有两U类型:(x)值类型和实体cdQ值类型就是指一个切实的?/span> ( ?/span> String ?/span> int ?/span> List q些 ) Q实体类型就是一个具体的实体Q如~写?/span> User ?/span> Organization {,值类型的查询和普?/span> sql 几乎一P而实体类型的查询׃C Hibernate 的强, ^_^ Q可以v到简?/span> sql 的作用,q且使得查询语句更加Ҏ(gu)理解?/span>

3.3.2.1.           值类?/strong>

3.3.2.1.1.      单?/span>

举例如下Q?/span>

from User u where u.name=:username and u.yearold=:yearold

q就是一个常见的单值的占位W式的查询,通过q样的方式就可以把值注入到参数中:(x)

query.setParameter(“username”,”bluedavy”);

query.setParameter(“yearold”,25);

同样Q?/span> hibernate 也支持和 sql 完全相同?/span> ? 的方式,那么上面的语句以?qing)注入参数的方式变ZQ?/span>

from User u where u.name=? and u.yearold=?

query.setParameter(0,”bluedavy”);

query.setParameter(1,25);

推荐使用W一U,那样参数的意义更Ҏ(gu)被理解?/span>

3.3.2.1.2.      in 查询

in 查询也是l常被用到的一U查询,?/span> Hibernate 中表现出来会(x)E有不同Q不q如果按照对象观点去看就很容易理解了Q例如下面这句:(x)

from User u where u.name in (:usernameList)

?/span> Hibernate 中通过q样的方式将值注入到q个参数中:(x)

List list=new ArrayList();

list.add(“jerry”);

list.add(“bluedavy”);

query.setParameterList(“usernameList”,list);

?/span> sql 中通常是组装一个由 , q接的值来构成 in 中的参数|而在 Hibernate 中则依照对象转化为采?/span> list 了, ^_^ Q是不是更方便些?/span>

3.3.2.2.           实体cd

?span>Hibernate中关联采用的都是对象形式Q表现对外就是隐藏了数据库的外键的部分,q也对?fn)惯使?span>sql查询的h带来一个问题,因ؓ(f)无法再操作外键字D,那么在涉?qing)到兌的实体的查询时应该怎么做呢Q我把它分ؓ(f)单实体和实体集合两种情况来说说?/span>

3.3.2.2.1.      单实?/span>

单实体的查询对应?/span> sql 情况通常是在一对多的情况下通过多端查询同时l合一端的一些过滤条Ӟ?/span> sql 中通常采用 join 的方式来实现q个Q而在 Hibernate 中要实现q点更Ҏ(gu)了,举例如下Q?/span>

User ?/span> Organization 是一对多Q现在要查询属于l织机构名称?/span> ”Blogjava” 以及(qing)用户q龄大于 20 的用P(x)

from User u where u.org.name=:orgname and u.yearold>:yearold

query.setParameter(“orgname”,”Blogjava”);

query.setParameter(“yearold”,20);

可以看到q样的查询语句比 sql 更简单多了,同时也更Ҏ(gu)理解多了?/span>

3.3.2.2.2.      实体集合

实体集合qo(h)形式的查询在实际的项目中也经怼(x)到Q仍然用上面的例子,但改为通过 Organization L询:(x)

from Organization org where org.name=:orgname and org.users.yearold>:yearold

是不是比 sql 单多了,而且更容易理解呢Q?/span> ^_^

q个时候对象化查询语句的优势就体现出来了,而不用陷?/span> sql 的那U关pd的通过外键q行查询的方式?/span>

3.3.3.        NamedQuery

NamedQuery 的意思就是指?/span> PO 的映文件中定义关于 PO 的查询语句,而在应用中指需要直接调用此查询语句的别名即可,q个好处非常明显Q得所有的查询语句可以l一的进行管理,同样Q我们可以在 PO 中通过 javadoc 的方式进行定义,q就更方便了Q?/span> ^_^

操作 NamedQuery 的方法和普?/span> hql 的方法基本一P(x)

session.getNamedQuery(queryname);

其中?/span> queryname 是我们定义的查询语句的别名Q一?/span> namedQuery 的语句的CZ如下Q?/span>

< query name = "validate" ><![CDATA[

from User u where u.loginname=:loginname and u.password=:password

]]></ query >

3.3.4.        Criteria

条g查询?/span> API 使得我们可以采用完全对象化的方式q行实体的查询,而不是通过 hql 的方式,在实际项目中Q?/span> hql 的方式更为居多,毕竟写v来更方便?/span>

关于 Criteria 的具体介l请参阅?/span> Hibernate Reference 》?/span>

3.3.5.        原生 SQL

原生 SQL 不推荐用,但在某些实需要用 sql 的情况下那么 Hibernate q是支持的,具体见?/span> Hibernate Reference 》?/span>

?              设计

独立的编写这个章节的原因是希望在采用Hibernate的情况下充分的去发挥Hibernate的优势,改变我们以关pdŞ式去做持久层的设计的惯性思维QŞ成以OO的思想去设计持久层Q所以我非常推荐通过?span>POȝ成数据表的方式,而不是设计表反向导成PO的Ş式,当然Q对于原有的pȝ那就没办法了?/span>

OO 思想中的核心三要素:(x)装、承和多态,?span>Hibernate的支持下同样可以充分发挥OO的三要素来优化持久层的设计?/span>

4.1.

4.1.1.        Component

Hibernate 中有一?/span> Component 的概念,q就允许在进行持久层设计的时候采用细_度U的领域模型q行设计Q例如在 User 对象中需要记?/span> User ?/span> firstname ?/span> lastname q些信息Q而在其他的表中也有这U需求,那么?/span> Hibernate 中我们就可以?/span> firstname ?/span> lastname l装Z?/span> UserName 对象Q作?/span> Component 攑օ User 中,?/span> user 中就可以变ؓ(f)采用 user.getUserName.getFristName 的方式来获取?/span>

Component 对于我们采用对象的封装概念进行持久层设计提供了很好的支持Q同时在 Hibernate 中还?/span> Elements ?/span> Properties q些元素Q具体请参见?/span> Hibernate Reference 》?/span>

4.2. l承

l承使得我们可以Ҏ(gu)久层中的对象q行抽象Q类如我们可以Ş?span>Personq个对象Q?span>User?span>Employee都承自q个对象?/span>

l承在数据库形式的设计中固然也可以实玎ͼ但通常不能以对象的观点d挥的淋漓致Q当然不是说以对象的方式去设计一定是最好的?/span>

?span>Hibernate中对于承映到数据表有几种不同的策略,各有适用的不同场合,具体的解释和说明见?span>Hibernate Reference?/span>

4.2.1.        单表{略

单表{略很容易理解,是类、子cM所有的属性都放至一张表中,q对于子cd性不多的情况非常有效?/span>

?/span> Hibernate 中通常子cd义ؓ(f) @hibernate.subclass 的方式来实现q个{略?/span>

4.2.2.        每个子类一张表

每个子类一张表?/span> Hibernate 中有几种实现方式Q?/span> @hibernate.join-subclass ?/span> @hibernate.join-subclass-key 的组合方式以?/span> @hibernate.join-subclass ?/span> @hibernate.discriminator 的组合方式是较常用的两种方式Q第一U方式采用的是主键关联方式,W二U方式采用的?/span> discriminator 字段的关联方式,个h比较推崇W一U方式?/span>

q种{略适合在子cd性和父类有较大不同的情况下采用?/span>

4.2.3.        每个具体cM张表

q种{略适合在类层次l构上有一定数量的抽象cȝ情况下用,同样有两U方式,一U是采用昑ּ多态的方式Q另一U是采用隐式多态的方式Q显式多态采用的?/span> @hibernate.union-subclass 的方式,隐式多态则采用每个具体cȝ PO 独立的策略,在它的映文件中看不出M的和接口、抽象类的关p,同时对于抽象c,需要指明其 abstract=”true” ?/span>

4.3. 多?/span>

4.3.1.        查询

在查询中很容易体?/span> Hibernate 对于多态的支持Q如pȝ?/span> Person 对象?/span> User ?/span> Employee 分别l承?/span> Person Q同?/span> Person ?/span> Organization 对象兌Q这个时候我们通过 Organization 获取其关联的 Person 时得到的既有可能?/span> User Q也有可能是 Employee Q?/span> ^_^…

?              性能

Hibernate 作ؓ(f)ORM工具Q从性能上来讲带l了很多人忧虑,但我觉得Hibernate在性能上也怼(x)带来许的降低,但如果对于不能合理设计数据库和?span>SQL的h来说Q我觉得Hibernate反倒能提高性能Q除非是在一些特D的场合Q如报表式的那种查询推荐l箋采用JDBC的方式?/span>

Hibernate 在性能提升上其实有很多U做法,在?span>Hibernate Reference》中也有专门的提升性能的章节,在这里我提几点在目中通常采用的方法?/span>

5.1. Lazy Load

Lazy Load 是常用的一U提升性能的方法,q个其实很容易理解,在不采用lazy load的情况下Q?span>Hibernate在获取一?span>PO的时候,同时获?span>PO中的属性?span>PO中的集合以及(qing)集合中对象的属性、集合,q样看过dҎ(gu)看出Q如果对象的兌l构有深层次的话Q最后搞不好整个库都被加载出来了Q而在实际使用中往往可能只需要用?span>PO中的一两个属性而已Q这点也是之前的ORM产品l常被批的一点,是ORM产品不能?span>sql那样只获取需要的东西Q?span>^_^Q其?span>Hibernate在这点上一直就支持Q而且支持的还不错Q在Hibernate 3以后Q默认的lazy已l设|ؓ(f)true了,q个时候包?span>po中的属性都是采?span>lazy load的方式,只有在调用到q个属性时才会(x)从缓存或数据库中加蝲Q当Ӟ集合也同样如此?/span>

?span>lazy load上推荐不要什么字D都采用lazy load的方式,对于一些基本属性的字段其lazy讄?span>falseQ而对于一些可能需要消耗内存的字段Q如clobq样的字D对象的lazy讄?span>trueQ对于集合则全部讄?span>lazy=true?/span>

是否采用Lazy load对系l的性能?x)有非常明显的媄响,同时量不要?span>Detached Object攑օHttp?span>session中?/span>

5.1.1.        OSIV

OSIV Q?/span> Open Session In View Q在 B/S pȝ中通常采用q种方式来更好的L?/span> Lazy load Q意思就是在 View 加蝲前打开 Session Q在 View 加蝲完毕后关?/span> Session 的方式,?/span> Spring 中有 OpenSessionInViewFilter Q可参考或直接使用?/span>

5.2. Cache

Cache 是在提升pȝ性能斚w常用的方法,?span>Hibernate中通常有非常好的对?span>Cache的支持方法,Hibernate中对?span>Cache有一U缓存和二~存的概念,一U缓存是必须的,位于Session部分Q二U缓存则不是必须的,由开发h员自行指定,二~存可指定用何U开源的cache工具Q?span>Hibernate 3以后的版本默认用的?span>EhcacheQ也可以切换?span>Oscache?span>JbossCacheQ对我而言最重要的区别在于对?span>cluster的支持上?/span>

二~存能够明显的提高系l的性能Q当Ӟ同时也会(x)更加的消耗内存,可以通过配置文g来指定内存中能够加蝲的最多的元素Q这有利于避免消耗过多内存?/span>

二~存的设|在Hibernate中非常的单,只需要在相应?span>hbm.xml中增?span>cache元素Q指明用何U策略,?span>read-only?span>read-write{,也可以直接在hibernate.cfg.xml中增?span>class-cache的方式来q行全局指定?/span>

5.3. 高效的查询语?/span>

查询语句的是否高效对于系l的性能也是?x)造成明显的媄响的Qؓ(f)了方便系l性能的调优,大家Ҏ(gu)询语句进行统一理Q如l一采用NamedQuery的方式,在这L(fng)情况下可以在pȝq行时请教数据库专家Q由他们来分析系l中的查询语句的执行效率以及(qing)提出改进{略Q而对于开发h员来Ԍ在查询语句方面最能够注意的就是采用占位符式的查询?/span>

5.3.1.        占位W式的查?/span>

数据库对于所有的 sql 语句都要q行语法分析Q而其分析通常?x)受到语句中的大写、空g?qing)参C同的影响Q在其语法分析器认ؓ(f)不同的情况下再ơ进行分析,q就不可避免的降低了响应的速度Q而采用占位符式的查询则可保证语法分析器只q行一ơ的分析Q在参数不同的情况ƈ不会(x)出现重复解析的现象,其次是要统一查询语句的编写风|包括大小写、空D些?/span>

我不是很定 Hibernate 中对于语句的语法分析Q估计和数据库的q种方式应该差不多,不过猜想可能?x)更一些, ^_^

5.4. 一些配|?/span>

?/span> hibernate.cfg.xml 中的一些配|也?x)对性能产生一定的影响Q如 jdbc.fetch_size 的设|等Q还有象采用q接池方面的讄Q对?/span> B/S 应用的情况徏议尽量采用应用服务器提供?/span> JNDI 的方式?/span>

5.5.

在性能提升斚w从两斚w入手Q一是持久层对象的设计上Q这斚w可以参考?/span> Hibernate Reference 》中提升性能章节中的一些徏议,另一斚w则是h数据库专Ӟ由数据库专家对表l构、查询语句等q行分析来给出改q策略,在现有的一个项目中Q竟然有出现 Hibernate 在外键上没徏立烦引的现象出现Q?/span>

?             

6.1. ~写专门的测试用的配|文?/span>

试斚w也是极度兛_的话题,在测试方面其实比较简单,只需要在试cM采用专门用于试的配|文件即可,在这个配|文件中Q通过都是采用讄hbm2ddl.auto属性ؓ(f)create-drop的方式,也就是在试c运行前创徏表,在测试类q行后删除表的策略,在更多的情况下,我们可以采用in-memory的数据库的方式,?span>hsqlQ当Ӟ有些时候则需要和实际q行环境一_(d)那么需要采用徏立专门的试库的方式Q避免测试数据和q行数据的相互媄响?/span>

?              企业应用开?/strong>

事务和ƈ发是企业应用开发中非常x的两个话题,在?span>Hibernate Reference》中提供了详l的Ҏ(gu)Q在q里我就单的说说?/span>

7.1. 事务

事务是企业应用开发中非常重视的一点,而在Hibernate中操作此部分?span>sql方式没有什么很大的区别Q可以通过sessiond去获?span>Transaction来实C务控Ӟ同时也可以交由应用服务器提供?span>JTA来实C务控制?/span>

在事务这个别上如果有更高的要求Q徏议采?span>Spring的事务框架?/span>

7.2. q发

在ƈ发方面多采用锁策略,锁策略和数据库基本相同,同样是乐观锁和?zhn)观锁两种{略Q乐观锁{略?span>Hibernate中推荐?span>version?span>timestamp来实玎ͼ具体覆盖方式则需要根据应用而定Q如是采用最新的修改的覆盖还是采用版本冲H策略等Q?zhn)观锁{略则通过指定对象的锁方式Q如LockMode.READQ引用?span>Hibernate Reference》中的一D话Q?/span>

“用户其实q不需要花很多_֊L心锁定策略的问题。通常情况下,只要?span>JDBCq接指定一下隔ȝ别,然后让数据库L定一切就够了。然而,高用户有时候希望进行一个排它的(zhn)观锁定Q或者在一个新的事务启动的时候,重新q行锁定?span>HibernateL使用数据库的锁定机制Q从不在内存中锁定对象!

如果数据库不支持用户讄的锁定模式,Hibernate用适当的替代模式,q一点可以确保应用程序的可移植性?#8221;?/span>

用户可通过几种方式来指定锁定模式:(x)

u       Session.load() 的时候指定锁定模?span>LockModeQ?/span>

u       Session.lock() Q?/span>

u       Query.setLockMode() ?/span>

?              相关书籍

Hibernate 上手q不难,但要真正的用好它实不是件容易的事,有些书籍能够很好的帮我们快速的提供解决思\和解x案,而这些书c我们也应该常备Q以方便自己在有些问题上的解{?/span>

同时Q我一直坚持的观点Q一U开源框枉常带来的不仅仅是开发、用上的改变,带来的最大的改变仍然是在设计层次上的Q设计上能否充分的发挥开源框架的优势才是最为重要的?/span>

8.1. ?span>Hibernate Reference?/span>

q本没什么说的,必读书籍Q也许在ȝ时候很多东西你不会(x)觉得什么,但当到一些确定方向的问题Ӟ可以通过此书快速的查找到相应的解决Ҏ(gu)Q感?span>Redsagal织的翻译工作,使得我们可以有中文版可看?/span>

目前版本(Hibernate 3.1.2)的下载地址Q?/span>

http://www.redsaga.com/hibernate-ref/3.1.2/zh-cn/pdf/hibernate_reference.pdf

8.2. ?span>Hibernate in action?/span>

In action pd的书c也没啥多说的,强烈推荐看看Q尽现在看h版本有些老了Q但里面很多的实跉|想仍然是非常值得学习(fn)的,|上应该有很多电(sh)子版下蝲的地斏V?/span>

8.3. 《深入浅?span>Hibernate?/span>

q本书想必大家也听闻了不,U白皮书Q?span>^_^Q是夏昕、曹晓刚以及(qing)唐勇三位大师的大作?/span>



冬天的猪 2007-08-15 21:14 发表评论
]]>
hibernat配置文g中set元素中各属性的定义 http://m.tkk7.com/microlab4321/articles/136427.html冬天的猪冬天的猪Mon, 13 Aug 2007 08:14:00 GMThttp://m.tkk7.com/microlab4321/articles/136427.htmlhttp://m.tkk7.com/microlab4321/comments/136427.htmlhttp://m.tkk7.com/microlab4321/articles/136427.html#Feedback0http://m.tkk7.com/microlab4321/comments/commentRss/136427.htmlhttp://m.tkk7.com/microlab4321/services/trackbacks/136427.html          name="propertyName"                                                                                   (1)  
          table="table_name"                                                                                     (2)  
          schema="schema_name"                                                                                 (3)  
          lazy="true|false"                                                                                       (4)  
          inverse="true|false"                                                                                 (5)  
          cascade="all|none|save-update|delete|all-delete-orphan"           (6)  
          sort="unsorted|natural|comparatorClass"                                           (7)  
          order-by="column_name   asc|desc"                                                           (8)  
          where="arbitrary   sql   where   condition"                                               (9)  
          outer-join="true|false|auto"                                                                 (10)  
          batch-size="N"                                                                                             (11)  
          access="field|property|ClassName"                                                       (12)  
  >  
   
          <key   ....   />  
          <index   ....   />  
          <element   ....   />  
  </set>  
  (1)   name   集合属性的名称    
  (2)   table   Q可选——默认ؓ(f)属性的名称Q这个集合表的名U?不能在一对多的关联关pM使用)    
  (3)   schema   (可?   表的schema的名U?   他将覆盖在根元素中定义的schema    
  (4)   lazy   (可选——默认ؓ(f)false)   lazy(可?-默认为false)   允许延迟加蝲Qlazy   initialization   Q?不能在数l中使用)    
  (5)   inverse   (可选——默认ؓ(f)false)   标记q个集合作ؓ(f)双向兌关系中的方向一端?nbsp;   
  (6)   cascade   (可选——默认ؓ(f)none)   让操作联到子实?nbsp;   
  (7)   sort(可?指定集合的排序顺?   其可以ؓ(f)自然?natural)或者给定一个用来比较的cR?nbsp;   
  (8)   order-by   (可?   仅用于jdk1.4)   指定表的字段(一个或几个)再加上asc或者desc(可?,   定义Map,Set和Bag的P代顺?nbsp;   
  (9)   where   (可?   指定L的SQL   where条g,   该条件将在重新蝲入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时q个条g非常有用)    
  (10)   outer-join(可?指定q个集合,只要可能,应该通过外连?outer   join)取得。在每一个SQL语句?   只能有一个集合可以被通过外连接抓?译者注:   q里提到的SQL语句是取得集合所属类的数据的Select语句)    
  (11)   batch-size   (可?   默认?)   指定通过延迟加蝲取得集合实例的批处理块大("batch   size"Q?nbsp;   
  (12)   access(可?默认为属性property):Hibernate取得属性值时使用的策?

冬天的猪 2007-08-13 16:14 发表评论
]]>
hibernate中对象的3U状?---瞬时态、持久态、脱?http://m.tkk7.com/microlab4321/articles/136419.html冬天的猪冬天的猪Mon, 13 Aug 2007 08:01:00 GMThttp://m.tkk7.com/microlab4321/articles/136419.htmlhttp://m.tkk7.com/microlab4321/comments/136419.htmlhttp://m.tkk7.com/microlab4321/articles/136419.html#Feedback0http://m.tkk7.com/microlab4321/comments/commentRss/136419.htmlhttp://m.tkk7.com/microlab4321/services/trackbacks/136419.html
  •         瞬时?/strong>
  •         由new命o(h)开辟内存空间的java对象Q?/p>

           eg. Person person = new Person("amigo", "?);

            如果没有变量对该对象q行引用Q它?yu)被java虚拟机回收?/p>

            瞬时对象在内存孤立存在,它是携带信息的蝲体,不和数据库的数据有Q何关联关p,在Hibernate中,可通过session的save()或saveOrUpdate()Ҏ(gu)瞬时对象与数据库相兌Qƈ数据对应的插入数据库中Q此时该瞬时对象转变成持久化对象?/p>

    •        持久?/strong>

            处于该状态的对象在数据库中具有对应的记录Qƈ拥有一个持久化标识。如果是用hibernate的delete()Ҏ(gu)Q对应的持久对象变成瞬时对象,因数据库中的对应数据已被删除Q该对象不再与数据库的记录关联?/p>

           当一个session执行close()或clear()、evict()之后Q持久对象变成脱对象,此时持久对象?x)变成脱对象,此时该对象虽然具有数据库识别|但它已不在HIbernate持久层的理之下?/p>

           持久对象h如下特点Q?/p>

           1. 和session实例兌Q?/p>

           2. 在数据库中有与之兌的记录?/p>

    •  q?/strong>

            当与某持久对象关联的session被关闭后Q该持久对象转变对象。当q对象被重新关联到session上时Qƈ再次转变成持久对象?/p>

           q对象拥有数据库的识别|可通过update()、saveOrUpdate(){方法,转变成持久对象?/p>

           q对象h如下特点Q?/p>

           1.  本质上与瞬时对象相同Q在没有M变量引用它时QJVM?x)在适当的时候将它回Ӟ

           2.  比瞬时对象多了一个数据库记录标识倹{?/p>

    冬天的猪 2007-08-13 16:01 发表评论
    ]]>
    Hibernate的核心接口学?http://m.tkk7.com/microlab4321/articles/136418.html冬天的猪冬天的猪Mon, 13 Aug 2007 08:00:00 GMThttp://m.tkk7.com/microlab4321/articles/136418.htmlhttp://m.tkk7.com/microlab4321/comments/136418.htmlhttp://m.tkk7.com/microlab4321/articles/136418.html#Feedback0http://m.tkk7.com/microlab4321/comments/commentRss/136418.htmlhttp://m.tkk7.com/microlab4321/services/trackbacks/136418.html      Hibernate有如?个核心接口:(x)
    • Configuration接口Q该对象用于配置q且根启动Hibernate。Hibernate应用通过Configuration实例来指定对?关系映射文g的位|或动态配|Hibernate的属性,然后创徏SessionFactory实例?
    • SessionFactory接口Q一个SessionFactory实例对应一个数据存储源Q应用从SessionFactory中获得Session实例。它h如下特点Q?/li>

                  1Q它是线E安全的Q这意味着它的同一个实例可以被应用的各个线E共享?/p>

                  2Q它是重量的,q意味着不能随意创徏或销毁它的实例。如果应用只讉K一个数据库Q只需创徏一个SessionFactory实例Q在应用初始化的时候创实例。如果应用同时访问多个数据库Q则需要ؓ(f)每个数据库创Z个单独的SessionFactory实例?/p>

                  之所以说SessionFactory是重量的,是因为它需要一个很大的~存Q用来存N定义的SQL语句以及(qing)映射元数据等。用戯可以为SessionFactory配置一个缓存插Ӟq个~存插g被称为Hibernate的第二~存Q该~存用来存放被工作单元读q的数据Q将来其它工作单元可能会(x)重用q些数据Q因此这个缓存中的数据能够被所有工作单元共享,一个工作单元通常对应一个数据库事务?/p>

    • Session接口Q?/strong>该接口是Hibernate应用使用最q泛的接口。Session也被UCؓ(f)持久化管理器Q提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。Sessionh一下特点:(x)

                 1Q不是线E安全的Q因此在设计软g架构Ӟ应该避免多个U程׃n同一个Session实例Q?/p>

                 2QSession实例是轻量的,所谓轻量Q是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以l常创徏和销毁Session对象Q例如ؓ(f)每个客户h分配单独的Session实例Q或者ؓ(f)每个工作单元分配单独的Session实例?/p>

                 Session有一个缓存,被称为Hibernate的第一U缓存,它存放被当前工作单元加蝲的对象。每个Session实例都有自己的缓存,q个Session实例的缓存,q个Session实例的缓存只能被当前工作单元讉K?/p>

    •  TransactionQ?/strong>该接口是Hibernate的数据库事务接口Q它对底层的事务接口做了装Q底层事务接口包括:(x)JDBC API、JTAQJava Transaction APIQ、CORBAQCommon Object Requet Broker Architecture) API.

                 Hibernate应用可通过一致的Transaction接口来声明事务边界,q有助于应用在不同环境或容器中移植?/p>

    •  Query和Criteria接口Q?/strong>它们是Hibernate的查询接口,用于向数据库查询对象Q以?qing)控制执行查询的q程。Query实例装了一个HQLQHibernate Query LanguageQ查询语句,HQL是面向对象的Q它引用cd?qing)类的属性名Q而不是表名及(qing)表的字段名。Criteria接口完全装了基于字W串形式的查询语句,比Query接口更加面向对象QCriteria接口更擅长于执行动态查询?/li>


    冬天的猪 2007-08-13 16:00 发表评论
    ]]>
    Hibernate的检索策略小l?http://m.tkk7.com/microlab4321/articles/136303.html冬天的猪冬天的猪Mon, 13 Aug 2007 02:22:00 GMThttp://m.tkk7.com/microlab4321/articles/136303.htmlhttp://m.tkk7.com/microlab4321/comments/136303.htmlhttp://m.tkk7.com/microlab4321/articles/136303.html#Feedback0http://m.tkk7.com/microlab4321/comments/commentRss/136303.htmlhttp://m.tkk7.com/microlab4321/services/trackbacks/136303.html        cȝ别检索策略有立即索和延迟索,默认的检索策略是立即索。在Hibernate映射文g中,通过?font face="文鼎PLl上宋Uni, serif"><class>
    上配|?font face="文鼎PLl上宋Uni, serif">lazy
    属性来定索策略。对?font face="文鼎PLl上宋Uni, serif">Session
    的检索方式,cȝ别检索策略仅适用?font face="文鼎PLl上宋Uni, serif">load
    Ҏ(gu)Q也pQ对?font face="文鼎PLl上宋Uni, serif">get
    ?font face="文鼎PLl上宋Uni, serif">qurey
    索,持久化对象都?x)被立即加蝲而不?font face="文鼎PLl上宋Uni, serif">lazy
    ?font face="文鼎PLl上宋Uni, serif">false
    q是true。一般来_(d)我们索对象就是要讉K它,因此立即索是通常的选择。由?font face="文鼎PLl上宋Uni, serif">load
    Ҏ(gu)在检索不到对象时?x)抛出异常(立即索的情况下)Q因此我个hq不使用load索;而由?font face="文鼎PLl上宋Uni, serif"><class>
    中的lazy属性还影响到多对一?qing)一对一的检索策略,因此使用loadҎ(gu)更没必要了?/p>

            兌U别索策略有立即索、gq检索和q切左外q接索。对于关联别检索,又可分ؓ(f)一对多和多对多、多对一和一对一两种情况讨论?/p>

            一对多和多对多兌关系一般?font face="文鼎PLl上宋Uni, serif"><set>配置?font face="文鼎PLl上宋Uni, serif"><set>?font face="文鼎PLl上宋Uni, serif">lazy?font face="文鼎PLl上宋Uni, serif">outer-join属性,它们的不同取值绝对了索策略?/p>

            1Q立x索:(x)q是一对多默认的检索策略,此时lazy=falseQ?font face="文鼎PLl上宋Uni, serif">outer-join=false。尽这是默认的索策略,但如果关联的集合是无用的Q那么就不要使用q种索方式?/p>

            2Qgq检索:(x)此时lazy=trueQ?font face="文鼎PLl上宋Uni, serif">outer-join=falseQ?font face="文鼎PLl上宋Uni, serif">outer-join=true是无意义的)Q这是优先考虑的检索方式?/p>

            3Q迫切左外连接检索:(x)此时 lazy=falseQ?font face="文鼎PLl上宋Uni, serif">outer-join=trueQ这U检索策略只适用于依?font face="文鼎PLl上宋Uni, serif">id索方式(load?font face="文鼎PLl上宋Uni, serif">getQ,而不适用?font face="文鼎PLl上宋Uni, serif">query的集合检索(它会(x)采用立即索策略)。相比于立即索,q种索策略减了一?font face="文鼎PLl上宋Uni, serif">sql语句Q但?font face="文鼎PLl上宋Uni, serif">Hibernate中,只能有一?font face="文鼎PLl上宋Uni, serif"><set>配置?outer-join=true?/p>

            多对一和一对一索策略一般?font face="文鼎PLl上宋Uni, serif"><many-to-one>?font face="文鼎PLl上宋Uni, serif"><one-to-one>配置?font face="文鼎PLl上宋Uni, serif"><many-to-one>中需要配|的属性是 outer-joinQ同时还需要配|?font face="文鼎PLl上宋Uni, serif">one端关联的<class>?font face="文鼎PLl上宋Uni, serif">lazy属性(配置的可不是<many-to-one>中的lazy哦)Q它们的l合后的索策略如下:(x)

            1Q?outer-join=autoQ这是默认|如果lazy=true为gq检索,如果lazy=false切左外连接检索?/p>

            2Q?outer-join=trueQ无关于lazyQ都切左外连接检索?/p>

            3Q?outer-join=falseQ如?font face="文鼎PLl上宋Uni, serif">lazy=true为gq检索,否则为立x索?/p>

            可以看到Q在默认的情况下Q?font face="文鼎PLl上宋Uni, serif">outer-join=autoQ?font face="文鼎PLl上宋Uni, serif">lazy=falseQ,对关联的one端对?font face="文鼎PLl上宋Uni, serif">Hibernate采用的迫切左外连接检索。依我看Q很多情况下Q我们ƈ不需要加?font face="文鼎PLl上宋Uni, serif">one端关联的对象Q很可能我们需要的仅仅是关联对象的idQ;另外Q如果关联对象也采用了迫切左外连接检索,׃(x)出现select语句中有多个外连接表Q如果个数多的话?x)媄响检索性能Q这也是Z?font face="文鼎PLl上宋Uni, serif">Hibernate通过hibernate.max_fetch_depth属性来控制外连接的深度。对于迫切左外连接检索,query的集合检索ƈ不适用Q它?x)采用立x索策略?/p>

            对于索策略,需要根据实际情况进行选择。对于立x索和延迟索,它们的优点在?font face="文鼎PLl上宋Uni, serif">select语句单(每张表一条语句)、查询速度快,~点在于兌表时需要多?font face="文鼎PLl上宋Uni, serif">select语句Q增加了讉K数据库的频率。因此在选择x索和延迟索时Q可以考虑使用扚w索策略来减少select语句的数量(配置batch-size属性)。对于切左外q接索,优点在于select较少Q但~点?font face="文鼎PLl上宋Uni, serif">select语句的复杂度提高Q多表之间的兌?x)是很耗时的操作。另外,配置文g是死的,但程序是zȝQ可以根据需要在E序里显C的指定索策略(可能l常需要在E序中显C指定迫切左外连接检索)。ؓ(f)了清楚检索策略的配置效果如何Q可以配|?font face="文鼎PLl上宋Uni, serif">show_sql属性查看程序运行时Hibernate执行?font face="文鼎PLl上宋Uni, serif">sql语句?/p>

           



    冬天的猪 2007-08-13 10:22 发表评论
    ]]> վ֩ģ壺 Ʒ޶| ޹߹ۿ| Ƭ߹ۿѹۿӰ | ޾ƷywӰԺ| Ůڵվ| Ļav޿| Ļ벻Ƶ| ëƬ߹ۿվ| ַѹۿ | ޾Ʒ˳| ˳ۺ7777| ޾Ʒɫ| һֻ| Ļպ| ޹˾þþƷ | պŷAVҹҹ| ҹҹAһ | 99þѹƷػ| Ƶ| Ļ| һAV| ˳վ߲ӰԺ| Ƶһ߲| Ʒר߹ۿ| ޳AVӰƬ߹ۿ| Ƶ| Ƶ| 99þ޾Ʒһ| þۺAVѹۿ| һѿ| þþþרav| AVպƷþþþþþ| Ƶѿ| ˳ɵӰվɫ| ŮǿڸˬƵ | һѹۿƵ| Ļվѹۿ| ѲĻ| Ƶ| ɫ͵͵ۺav78| ɫƬѿ|