﻿<?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-难能之理宜停，难处之人宜厚，难处之事宜缓，难成之功宜智。-随笔分类-Java数据访问技术</title><link>http://www.blogjava.net/Weibo-Forum/category/8723.html</link><description>“道”就是指要自己才能走遍天下，“德”指两个人要直心相对.</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:47:23 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:47:23 GMT</pubDate><ttl>60</ttl><item><title>在Java中操作Zip文件，压缩/解压</title><link>http://www.blogjava.net/Weibo-Forum/archive/2006/04/06/39533.html</link><dc:creator>微薄社区</dc:creator><author>微薄社区</author><pubDate>Thu, 06 Apr 2006 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/Weibo-Forum/archive/2006/04/06/39533.html</guid><wfw:comment>http://www.blogjava.net/Weibo-Forum/comments/39533.html</wfw:comment><comments>http://www.blogjava.net/Weibo-Forum/archive/2006/04/06/39533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Weibo-Forum/comments/commentRss/39533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Weibo-Forum/services/trackbacks/39533.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed" cellspacing="0" cellpadding="0" width="100%">
				<tbody>
						<tr>
								<td>
										<font color="blue">本文版权归原作者，中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网&lt;www.cnjm.net&gt;</font>
										<br />
										<div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">来自:http://www.cnjm.net/tech/article1069.html</div>
										<br />[转载于IT狐]<br /><br />可随意转载，但请注明出处及作者<br />SonyMusic<br />2003.05.28<br />==========================================================================<br />在Java中操作Zip文件，压缩/解压<br /><br /><br />package test.nothing;<br /><br />import java.io.*;<br />import java.util.*;<br />import java.util.zip.*;<br /><br />import com.beaconsystem.util.*;<br /><br />import junit.framework.TestCase;<br /><br />/**<br />* @author SonyMusic<br />*<br />* 用于测试java.util.zip包压缩和解压缩文件zip文件的例子.<br />* 基于JUnit编写，包括两个test方法，和三个辅助方法.<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>* 注意到使用过程中操作的全是流，所以不仅仅可以读写文件。这只是一个简单的例子.<br />*/<br />public class TestZipOp extends TestCase {<br /><br />/**<br />* Constructor for TestZipOp.<br />* @param arg0<br />*/<br />public TestZipOp(String arg0) {<br />super(arg0);<br />}<br /><br />public static void main(String[] args) {<br />junit.textui.TestRunner.run(TestZipOp.class);<br />}<br /><br />/**<br />* zip压缩功能测试.<br />* 将d:\temp\zipout目录下的所有文件连同子目录压缩到d:\temp\out.zip.<br />* @throws Exception<br />*/<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>public void testCreateZip() throws Exception{<br />//压缩baseDir下所有文件，包括子目录<br />String baseDir="d:\temp\zipout";<br />List fileList=getSubFiles(new File(baseDir));<br /><br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>//压缩文件名<br />ZipOutputStream zos=new ZipOutputStream(new FileOutputStream("d:\temp\out.zip"));<br /><br />ZipEntry ze=null;<br />byte[] buf=new byte[1024];<br />int readLen=0;<br />for (int i = 0; i &lt;fileList.size(); i++) {<br />File f=(File)fileList.get(i);<br />System.out.print("Adding: "+f.getPath()+f.getName());<br /><br />//创建一个ZipEntry，并设置Name和其它的一些属性<br />ze=new ZipEntry(getAbsFileName(baseDir, f));<br />ze.setSize(f.length());<br />ze.setTime(f.lastModified());<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div><br />//将ZipEntry加到zos中，再写入实际的文件内容<br />zos.putNextEntry(ze);<br />InputStream is=new BufferedInputStream(new FileInputStream(f));<br />while ((readLen=is.read(buf, 0, 1024))!=-1) {<br />zos.write(buf, 0, readLen);<br />}<br />is.close();<br />System.out.println("   done...");<br />}<br />zos.close();<br />}<br /><br />/**<br />* 测试解压缩功能.<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>* 将d:\download\test.zip文件解压到d:\temp\zipout目录下.<br />* @throws Exception<br />*/<br />public void testReadZip() throws Exception{<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>//InputStream is=new BufferedInputStream(new FileInputStream());<br />String baseDir="d:\temp\zipout";<br />ZipFile zfile=new ZipFile("d:\download\Test.zip");<br />System.out.println(zfile.getName());<br />Enumeration zList=zfile.entries();<br />ZipEntry ze=null;<br />byte[] buf=new byte[1024];<br />while(zList.hasMoreElements()){<br />//从ZipFile中得到一个ZipEntry<br />ze=(ZipEntry)zList.nextElement();<br />if(ze.isDirectory()){<br />System.out.println("Dir: "+ze.getName()+" skipped..");<br />continue;<br />}<br />System.out.println("Extracting: "+ze.getName()+"t"+ze.getSize()+"t"+ze.getCompressedSize());<br /><br />//以ZipEntry为参数得到一个InputStream，并写到OutputStream中<br />OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(baseDir, ze.getName())));<br />InputStream is=new BufferedInputStream(zfile.getInputStream(ze));<br />int readLen=0;<br />while ((readLen=is.read(buf, 0, 1024))!=-1) {<br />os.write(buf, 0, readLen);<br />}<br />is.close();<br />os.close();<br />System.out.println("Extracted: "+ze.getName());<br />}<br />zfile.close();<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>}<br /><br />/**<br />* 给定根目录，返回一个相对路径所对应的实际文件名.<br />* @param baseDir 指定根目录<br />* @param absFileName 相对路径名，来自于ZipEntry中的name<br />* @return java.io.File 实际的文件<br />*/<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>private File getRealFileName(String baseDir, String absFileName){<br />String[] dirs=Regex.split("/", absFileName);<br />//System.out.println(dirs.length);<br />File ret=new File(baseDir);<br />if(dirs.length&gt;1){<br />for (int i = 0; i &lt;dirs.length-1; i++) {<br />ret=new File(ret, dirs[i]);<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>}<br />}<br />if(!ret.exists()){<br />ret.mkdirs();<br />}<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>ret=new File(ret, dirs[dirs.length-1]);<br />return ret;<br />}<br /><br />/**<br />* 给定根目录，返回另一个文件名的相对路径，用于zip文件中的路径.<br />* @param baseDir java.lang.String 根目录<br />* @param realFileName java.io.File 实际的文件名<br />* @return 相对文件名<br />*/<br />private String getAbsFileName(String baseDir, File realFileName){<br />File real=realFileName;<br />File base=new File(baseDir);<br />String ret=real.getName();<br />while (true) {<br />real=real.getParentFile();<br />if(real==null) break;<br />if(real.equals(base)) break;<br />else{<br />ret=real.getName()+"/"+ret;<br />}<br />}<br />return ret;<br />}<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div><br />/**<br />* 取得指定目录下的所有文件列表，包括子目录.<br />* @param baseDir File 指定的目录<br />* @return 包含java.io.File的List<br />*/<br />private List getSubFiles(File baseDir){<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>List ret=new ArrayList();<br />//File base=new File(baseDir);<br />File[] tmp=baseDir.listFiles();<br />for (int i = 0; i &lt;tmp.length; i++) {<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>if(tmp[i].isFile()){<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>ret.add(tmp[i]);<br />}<br /><div style="VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 1px; COLOR: #f4fbff; HEIGHT: 1px">JAVA手机网[www.cnjm.net]</div>if(tmp[i].isDirectory()){<br />ret.addAll(getSubFiles(tmp[i]));<br />}<br />}<br />return ret;<br />}<br /><br />}<br /></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Weibo-Forum/aggbug/39533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Weibo-Forum/" target="_blank">微薄社区</a> 2006-04-06 10:25 <a href="http://www.blogjava.net/Weibo-Forum/archive/2006/04/06/39533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何把Hibernate2.1升级到Hibernate3.0</title><link>http://www.blogjava.net/Weibo-Forum/archive/2006/03/21/36585.html</link><dc:creator>微薄社区</dc:creator><author>微薄社区</author><pubDate>Tue, 21 Mar 2006 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/Weibo-Forum/archive/2006/03/21/36585.html</guid><wfw:comment>http://www.blogjava.net/Weibo-Forum/comments/36585.html</wfw:comment><comments>http://www.blogjava.net/Weibo-Forum/archive/2006/03/21/36585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Weibo-Forum/comments/commentRss/36585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Weibo-Forum/services/trackbacks/36585.html</trackback:ping><description><![CDATA[选自&lt;&lt;精通Hibernate：Java对象持久化技术详解&gt;&gt; 作者：孙卫琴 来源:www.javathinker.org<br /> 
<p>1.1 Hibernate API 变化 <br />1.1.1 包名 <br />1.1.2 org.hibernate.classic包 <br />1.1.3 Hibernate所依赖的第三方软件包 <br />1.1.4 异常模型 <br />1.1.5 Session接口 <br />1.1.6 createSQLQuery() <br />1.1.7 Lifecycle 和 Validatable 接口 <br />1.1.8 Interceptor接口 <br />1.1.9 UserType和CompositeUserType接口 <br />1.1.10 FetchMode类 <br />1.1.11 PersistentEnum类 <br />1.1.12 对Blob 和Clob的支持 <br />1.1.13 Hibernate中供扩展的API的变化 <br />1.2 元数据的变化 <br />1.2.1 检索策略 <br />1.2.2 对象标识符的映射 <br />1.2.3 集合映射 <br />1.2.4 DTD <br />1.3 查询语句的变化 <br />1.3.1 indices()和elements()函数 </p><p><br />尽管Hibernate 3.0 与Hibernate2.1的源代码是不兼容的，但是当Hibernate开发小组在设计Hibernate3.0时，为简化升级Hibernate版本作了周到的考虑。对于现有的基于Hibernate2.1的Java项目，可以很方便的把它升级到Hibernate3.0。</p><p>本文描述了Hibernate3.0版本的新变化，Hibernate3.0版本的变化包括三个方面：<br />（1）API的变化，它将影响到Java程序代码。<br />（2）元数据，它将影响到对象-关系映射文件。<br />（3）HQL查询语句。</p><p>值得注意的是， Hibernate3.0并不会完全取代Hibernate2.1。在同一个应用程序中，允许Hibernate3.0和Hibernate2.1并存。</p><p>1.1 Hibernate API 变化</p><p>1.1.1 包名</p><p>Hibernate3.0的包的根路径为: “org.hibernate” ，而在Hibernate2.1中为“net.sf.hibernate”。这一命名变化使得Hibernate2.1和Hibernate3.0能够同时在同一个应用程序中运行。</p><p>如果希望把已有的应用升级到Hibernate3.0，那么升级的第一步是把Java源程序中的所有“net.sf.hibernate”替换为“org.hibernate”。</p><p>Hibernate2.1中的“net.sf.hibernate.expression”包被改名为“org.hibernate.criterion”。假如应用程序使用了Criteria API，那么在升级的过程中，必须把Java源程序中的所有“net.sf.hibernate.expression”替换为“org.hibernate.criterion”。</p><p>如果应用使用了除Hibernate以外的其他外部软件，而这个外部软件又引用了Hibernate的接口，那么在升级时必须十分小心。例如EHCache拥有自己的CacheProvider： net.sf.ehcache.hibernate.Provider，在这个类中引用了Hibernate2.1中的接口，在升级应用时，可以采用以下办法之一来升级EHCache:</p><p>（1）手工修改net.sf.ehcache.hibernate.Provider类，使它引用Hibernate3.0中的接口。<br />（2）等到EHCache软件本身升级为使用Hibernate3.0后，使用新的EHCache软件。<br />（3）使用Hibernate3.0中内置的CacheProvider：org.hibernate.cache.EhCacheProvider。</p><p>1.1.2 org.hibernate.classic包</p><p>Hibernate3.0把一些被废弃的接口都转移到org.hibernate.classic中。</p><p>1.1.3 Hibernate所依赖的第三方软件包</p><p>在Hibernate3.0的软件包的lib目录下的README.txt文件中，描述了Hibernate3.0所依赖的第三方软件包的变化。</p><p>1.1.4 异常模型</p><p>在Hibernate3.0中，HibernateException异常以及它的所有子类都继承了java.lang.RuntimeException。因此在编译时，编译器不会再检查HibernateException。</p><p>1.1.5 Session接口</p><p>在Hibernate3.0中，原来Hibernate2.1的Session接口中的有些基本方法也被废弃，但为了简化升级，这些方法依然是可用的，可以通过org.hibernate.classic.Session子接口来访问它们，例如：</p><p><br />org.hibernate.classic.Session session=sessionFactory.openSession();<br />session.delete("delete from Customer ");</p><p><br />在Hibernate3.0中，org.hibernate.classic.Session接口继承了org.hibernate.Session接口，在org.hibernate.classic.Session接口中包含了一系列被废弃的方法，如find()、interate()等。SessionFactory接口的openSession()方法返回org.hibernate.classic.Session类型的实例。如果希望在程序中完全使用Hibernate3.0，可以采用以下方式创建Session实例：</p><p>org.hibernate.Session session=sessionFactory.openSession();</p><p>如果是对已有的程序进行简单的升级，并且希望仍然调用Hibernate2.1中Session的一些接口，可以采用以下方式创建Session实例：</p><p>org.hibernate.classic.Session session=sessionFactory.openSession();</p><p>在Hibernate3.0中，Session接口中被废弃的方法包括：<br />* 执行查询的方法：find()、iterate()、filter()和delete(String hqlSelectQuery) <br />* saveOrUpdateCopy()</p><p>Hibernate3.0一律采用createQuery()方法来执行所有的查询语句，采用DELETE 查询语句来执行批量删除，采用merge()方法来替代 saveOrUpdateCopy()方法。</p><p><br />提示：在Hibernate2.1中，Session的delete()方法有几种重载形式，其中参数为HQL查询语句的delete()方法在Hibernate3.0中被废弃，而参数为Ojbect类型的的delete()方法依然被支持。delete(Object o)方法用于删除参数指定的对象，该方法支持级联删除。</p><p>Hibernate2.1没有对批量更新和批量删除提供很好的支持，参见&lt;&lt;精通Hibernate&gt;&gt;一书的第13章的13.1.1节（批量更新和批量删除），而Hibernate3.0对批量更新和批量删除提供了支持，能够直接执行批量更新或批量删除语句，无需把被更新或删除的对象先加载到内存中。以下是通过Hibernate3.0执行批量更新的程序代码：</p><p>Session session = sessionFactory.openSession();<br />Transaction tx = session.beginTransaction();</p><p>String hqlUpdate = "update Customer set name = :newName where name = :oldName";<br />int updatedEntities = s.createQuery( hqlUpdate )<br />.setString( "newName", newName )<br />.setString( "oldName", oldName )<br />.executeUpdate();<br />tx.commit();<br />session.close();</p><p>以下是通过Hibernate3.0执行批量删除的程序代码：</p><p>Session session = sessionFactory.openSession();<br />Transaction tx = session.beginTransaction();</p><p>String hqlDelete = "delete Customer where name = :oldName";<br />int deletedEntities = s.createQuery( hqlDelete )<br />.setString( "oldName", oldName )<br />.executeUpdate();<br />tx.commit();<br />session.close();</p><p>1.1.6 createSQLQuery()</p><p>在Hibernate3.0中，Session接口的createSQLQuery()方法被废弃，被移到org.hibernate.classic.Session接口中。Hibernate3.0采用新的SQLQuery接口来完成相同的功能。</p><p>1.1.7 Lifecycle 和 Validatable 接口</p><p>Lifecycle和Validatable 接口被废弃，并且被移到org.hibernate.classic包中。</p><p>1.1.8 Interceptor接口</p><p>在Interceptor 接口中加入了两个新的方法。 用户创建的Interceptor实现类在升级的过程中，需要为这两个新方法提供方法体为空的实现。此外，instantiate()方法的参数作了修改，isUnsaved()方法被改名为isTransient()。</p><p>1.1.9 UserType和CompositeUserType接口</p><p>在UserType和CompositeUserType接口中都加入了一些新的方法，这两个接口被移到org.hibernate.usertype包中，用户定义的UserType和CompositeUserType实现类必须实现这些新方法。</p><p>Hibernate3.0提供了ParameterizedType接口，用于更好的重用用户自定义的类型。</p><p>1.1.10 FetchMode类</p><p>FetchMode.LAZY 和 FetchMode.EAGER被废弃。取而代之的分别为FetchMode.SELECT 和FetchMode.JOIN。</p><p>1.1.11 PersistentEnum类</p><p>PersistentEnum被废弃并删除。已经存在的应用应该采用UserType来处理枚举类型。</p><p>1.1.12 对Blob 和Clob的支持</p><p>Hibernate对Blob和Clob实例进行了包装，使得那些拥有Blob或Clob类型的属性的类的实例可以被游离、序列化或反序列化，以及传递到merge()方法中。</p><p>1.1.13 Hibernate中供扩展的API的变化</p><p>org.hibernate.criterion、 org.hibernate.mapping、 org.hibernate.persister和org.hibernate.collection 包的结构和实现发生了重大的变化。多数基于Hibernate <br />2.1 的应用不依赖于这些包，因此不会被影响。如果你的应用扩展了这些包中的类，那么必须非常小心的对受影响的程序代码进行升级。</p><p>1.2 元数据的变化</p><p>1.2.1 检索策略</p><p>在Hibernate2.1中，lazy属性的默认值为“false”，而在Hibernate3.0中，lazy属性的默认值为“true”。在升级映射文件时，如果原来的映射文件中的有关元素，如&lt;set&gt;、&lt;class&gt;等没有显式设置lazy属性，那么必须把它们都显式的设置为lazy=“true”。如果觉得这种升级方式很麻烦，可以采取另一简单的升级方式：在&lt;hibernate-mapping&gt;元素中设置: default-lazy=“false”。 </p><p>1.2.2 对象标识符的映射</p><p>unsaved-value属性是可选的，在多数情况下，Hibernate3.0将把unsaved-value="0" 作为默认值。</p><p>在Hibernate3.0中，当使用自然主键和游离对象时，不再强迫实现Interceptor.isUnsaved()方法。 如果没有设置这个方法，当Hibernate3.0无法区分对象的状态时，会查询数据库，来判断这个对象到底是临时对象，还是游离对象。不过，显式的使用Interceptor.isUnsaved()方法会获得更好的性能，因为这可以减少Hibernate直接访问数据库的次数。</p><p>1.2.3 集合映射</p><p>&lt;index&gt;元素在某些情况下被&lt;list-index&gt;和&lt;map-key&gt;元素替代。此外，Hibernate3.0用&lt;map-key-many-to-many&gt; 元素来替代原来的&lt;key-many-to-many&gt;.元素，用&lt;composite-map-key&gt;元素来替代原来的&lt;composite-index&gt;元素。</p><p>1.2.4 DTD</p><p>对象-关系映射文件中的DTD文档，由原来的：<br /><a href="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd</a><br />改为：<br /><a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a></p><p>1.3 查询语句的变化</p><p>Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器，不过，Hibernate2.1的查询翻译器也依然存在。在Hibernate的配置文件中，hibernate.query.factory_class属性用来选择查询翻译器。例如：<br />（1）选择Hibernate3.0的查询翻译器：<br />hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory<br />（2）选择Hibernate2.1的查询翻译器<br />hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory</p><p><br />提示：ANTLR是用纯Java语言编写出来的一个编译工具，它可生成Java语言或者是C++的词法和语法分析器，并可产生语法分析树并对该树进行遍历。ANTLR由于是纯Java的，因此可以安装在任意平台上，但是需要JDK的支持。</p><p>Hibernate开发小组尽力保证Hibernate3.0的查询翻译器能够支持Hibernate2.1的所有查询语句。不过，对于许多已经存在的应用，在升级过程中，也不妨仍然使用Hibernate2.1的查询翻译器。<br />值得注意的是， Hibernate3.0的查询翻译器存在一个Bug：不支持某些theta-style连结查询方言：如Oracle8i的OracleDialect方言、Sybase11Dialect。解决这一问题的办法有两种：（1）改为使用支持ANSI-style连结查询的方言，如 Oracle9Dialect,（2）如果升级的时候遇到这一问题，那么还是改为使用Hibernate2.1的查询翻译器。</p><p>1.3.1 indices()和elements()函数</p><p>在HQL的select子句中废弃了indices()和elements()函数，因为这两个函数的语法很让用户费解，可以用显式的连接查询语句来替代 select elements(...) 。而在HQL的where子句中，仍然可以使用elements()函数。</p><img src ="http://www.blogjava.net/Weibo-Forum/aggbug/36585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Weibo-Forum/" target="_blank">微薄社区</a> 2006-03-21 11:19 <a href="http://www.blogjava.net/Weibo-Forum/archive/2006/03/21/36585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>升级Hibernate3的几点体会</title><link>http://www.blogjava.net/Weibo-Forum/archive/2006/03/21/36578.html</link><dc:creator>微薄社区</dc:creator><author>微薄社区</author><pubDate>Tue, 21 Mar 2006 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/Weibo-Forum/archive/2006/03/21/36578.html</guid><wfw:comment>http://www.blogjava.net/Weibo-Forum/comments/36578.html</wfw:comment><comments>http://www.blogjava.net/Weibo-Forum/archive/2006/03/21/36578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Weibo-Forum/comments/commentRss/36578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Weibo-Forum/services/trackbacks/36578.html</trackback:ping><description><![CDATA[
		<p>之前都是用Hibernate2.1的，原来也没想着升级，那天突然发现项目里要做批量删除的功能，心想不如升级Hibernate3体验一下罢！<br />谁知把lib一改，全乱了！首先是hibernate包的路径改了，要把所有的“net.sf.hibernate”替换为“org.hibernate”。<br />然后就是处理下面几个废弃的方法：find()、iterate()、filter()、delete(String hqlSelectQuery)和saveOrUpdateCopy()。Hibernate3一律采用createQuery()方法来执行所有的查询语句，采用DELETE 查询语句来执行批量删除，采用merge()方法来替代 saveOrUpdateCopy()方法。——又是一次全文搜索和替换！<br />这样，IDE基本没有报错信息了！但一旦运行就会报Connection timed out，后来发现hibernate的config文件和map文件都必须把dtd改为3.0。否则xerces会到hibernate.org上找3.0dtd,如果你没有联网，则会报出java.net.ConnectException。<br />另外，还要记得添加antlr-2.7.5H3.jar，要不会报java.lang.NoClassDefFoundError: antlr/ANTLRException。<br />花了大半天时间，系统基本正常了！粗略检查了一下，浏览和修改功能都正常，但有一个问题，竟然无法插入新记录啊！<br />出现的异常为：<br />org.hibernate.exception.ConstraintViolationException: could not insert<br />后来在所有元素中设置: default-lazy="false"就可以了。<br />值得一提的是，如果只想对已有的程序进行简单的升级，并且希望仍然调用Hibernate2.1中Session的一些接口，可以采用以下方式创建Session实例：<br />org.hibernate.classic.Session session=sessionFactory.openSession();<br />这样的改动会小很多～～～当然如果希望在程序中完全使用Hibernate3.0，就只能采用以下方式创建Session实例：org.hibernate.Session session=sessionFactory.openSession();<br /></p>
<img src ="http://www.blogjava.net/Weibo-Forum/aggbug/36578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Weibo-Forum/" target="_blank">微薄社区</a> 2006-03-21 11:04 <a href="http://www.blogjava.net/Weibo-Forum/archive/2006/03/21/36578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>