記錄hibernate 3學習過程中的報錯(未完成)
1。解壓縮hibernate-3.0beta1.zip文件
2。copy msbase.jar,msutil.jar,mssqlserver.jar文件到hibernater-3.0/lib目錄下
3。編輯etc/hibernate.properties(不在src目錄下)。如下:
4。運行 hibernater-3.0/builder eg
報錯如下:
org.hibernate.HibernateException: could not instantiate CacheProvider: net.sf.hibernate.cache.HashtableCache.Provider
吃虧了:hibernate2.jar和hibernate3.jar包結構完全不同了
例如:hibernate2中的net.sf.hibernate.dialect.SQLServerDialect
在hibernater3中變成了org.hibernate.dialect.SQLServerDialect
報錯說:class not found : org.hsqldb.jdbcDriver
在build.xml文件中發現以下這句話:
將hsqldb.jar文件拷貝到hibernater-3.0/lib目錄下。
在hibernate.properties文件中寫
hibernate.dialect org.hibernate.dialect.SQLServerDialect
hibernate.connection.username spitrade
hibernate.connection.password spitechnhm
hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
hibernate.connection.url jdbc:microsoft:sqlserver://218.244.111.84:1433;DatabaseName=spitrade;SelectMethod=cursor
去除HypersonicSQL的連接方法,好像成功連接了。
怎么去建立數據庫?用Main方法去建立失敗,
Exception in thread "main" java.lang.NoClassDefFoundError: org/hibernate/Session
java org.hibernate.auction.Main
缺少classpath cglib.jar hibernate3.jar ehcache.jar commons-collections-2.1.1.jar
set classpath后
報錯說:Not binding factory to JNDI, no JNDI name configured
http://www.hibernate.org/114.html ----> Using Hibernate with Tomcat and JNDI
hibernate.connection.datasource jdbc/soos 失敗
可能需要修改hibernate.cfg.xml文件 并增加jta.jar
hibernate.properties not found
將hibernate.properties文件放入classpath找得到的地方 成功。
Could not find datasource: java:comp/env/jdbc/soos
在hibernate.properties中必須寫hibernate.connection.datasource jdbc/soos
hibernate2 升級為hibernate3的需要注意的事項
hibernate2 升級為hibernate3的需要注意的事項
(chinaewolf的工作日記)
(chinaewolf的工作日記)
目的,主要是那當前的項目練手,熟悉一下hibernate2和hibernate3的差別,給當前項目一點擴展的空間.
1.首先將hibernate2.jar替換為hibernate3.jar(hibernate-3.0.5)
hibernate-tools.jar也替換成新的(從hibernate-tools-3.0.0.alpha4a找出來的)
2.將所有程序中的net.sf.hibernate替換為org.hibernate.
3.但是有例外
net.sf.hibernate.expression.Expression換為org.hibernate.criterion.Expression
如果用eclipse,用ctrl+shift+o快捷鍵可以加快速度:)
4.在使用hql查詢時將
createSQLQuery(hql,"c",EZCampaignDTO.class);改為createSQLQuery(hql).addEntity("c",EZCampaignDTO.class);
5.在批量插入時
將原來的int size = ((SessionFactoryImpl)(session.getSessionFactory())).getJdbcBatchSize()
改為int size = ((SessionFactoryImpl)(session.getSessionFactory())).getSettings().getJdbcBatchSize();
6.在計算count時
將原來的int size = ((Integer) session.iterate(hql).next()).intValue();
改為int size = ((Integer) session.createQuery(hql).iterate().next()).intValue();
其中hql="select count(*) from " + DAOVar.contactClass;
7.還有就是把.hbm中的hibernate-mapping-2.0.dtd替換為hibernate-mapping-3.0.dtd
Hibernate Mapping DTD 2.0替換為Hibernate Mapping DTD 3.0
8.hibernate.cfg.xml中
Hibernate Mapping DTD 2.0替換為Hibernate Mapping DTD 3.0
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
9.hibernate.properties中類似
10.cache-config.xml中
<provider className="net.sf.hibernate.cache.OSCacheProvider"/>替換為
<provider className="org.hibernate.cache.OSCacheProvider"/>
11.classeshibernate.properties中
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
暈s了,怎么這里還有
還是用編輯器暴力替換一下吧干脆
然后部署,集成測試,希望一切ok
結果咣鐺,還是報錯
12.在自動外部模塊部分有一個功能是根據模版自動生成.hbm文件在load,結果出來的.hbm中有問題:
生成的 <composite-id unsaved-value="any" mapped="false">其中mapped="false" 出錯.
找了半天才發現在網上的hibernate-mapping-3.0.dtd文件有支持mapped="false"這個屬性.而本地的hebernate3.0.5中的
hibernate-mapping-3.0.dtd文件沒有這個屬性.暈,hibernate也太不負責了吧. 解決辦法把hibernate-mapping-3.0.dtd
copy到jboss\bin目錄下然后,在template文件中
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "hibernate-mapping-3.0.dtd">
然后他會在jboss\bin目錄下讀取該文件
13.重新測試,還是咣鐺
發現子類讀父類數據時拋出異常
"org.hibernate.LazyInitializationException: could not initialize proxy"
延遲抓取出的錯,hb3對many-to-one的默認處理是lazy = "proxy"
沒有搞懂到底怎么回事,把所有many-to-one,one-to-one都加上lazy="false"
再測試終于大功告成
ant-1.6.2.jar、ant-antlr-1.6.2.jar、ant-junit-1.6.2.jar、ant-launcher-1.6.2.jar、ant-swing-1.6.2.jar
以上5個是hibernate需要的Ant包。
ant-antlr-1.6.2.jar這個包中只包含org.apache.tools.ant.taskdefs.optional.ANTLR類。
ant-launcher.jar中的class文件是幫助建立Ant的classpath的。目前最好的方法是使用ant-launcher.jar 中的org.apache.tools.ant. launch.Launcher類來啟動Ant,雖然有些應用已經加入了Ant(例如Tomcat),但是它們仍然使用傳統的方法,即:用ant.jar包中的org.apache.tools.ant.Main類來啟動。
antlr-2.7.4.jar
ANTLR (ANother Tool for Language Recognition)是一個PCCTS制定的語言工具。它是為創建認定者、程序編譯者、翻譯者提供一個包括Java,C#和C++在內的語法描述框架。
c3p0-0.8.4.5.jar
c3p0是一個容易使用的java庫,用于擴充傳統的基于驅動管理的JDBC驅動和JNDI綁定數據源,包括執行Connection和Statement Pooling的數據源。
cglib-full-2.0.2.jar
CGL(Code Generation Library)是一種高性能、高質量的代碼產生庫。Hibernate用它來實現PO(Persistent Object)字節碼的動態生成。
cleanimports.jar
cleanimports是對java文件中的無用的imports作清理,并通過配置文件提供的格式對imports代碼段進行格式整理。
http://www.euronet.nl/users/tomb/cleanImports/V105/cleanImports.html
commons-collections-2.1.1.jar
Jakarta的通用collections包。包含了一些Apache開發的集合類。
commons-logging-1.0.4.jar
Jakarta的通用日志記錄包。
concurrent-1.3.2.jar
concurrent包提供標準化、高效的版本的實用的類,用于并行的Java程序。
http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
connector.jar
JCA(J2EE Connector Architecture)規范的包
dom4j-1.5.2.jar
Dom4J是一個在Java平臺上使用Java Collections Framework與XML、 XPath和XSLT協同工作的開源Java庫,它全面支持DOM、SAX和JAXP。
DOM(Document Object Model)是一個與平臺和語言無關的接口,提供一個標準的模式來讀些XML文件。
SAX Simple API for XML,相比于文檔對象模型DOM,SAX 是讀取和操作 XML 數據的更快速、更輕量的方法。
JAXP(Java API for XML Parsing)
ehcache-1.1.jar
EHCache 是一個純java的在進程中的緩存,它具有以下特性:快速,簡單,為Hibernate2.1充當可插入的緩存,最小的依賴性,全面的文檔和測試。
官方網站 http://ehcache.sourceforge.net/
hsqldb.jar
Hsqldb是一個用java寫的帶有JDBC驅動的關系數據庫引擎,它支持ANSI-92 SQL子集規范(BNF樹形格式),它一般來說是很小的(小于160K),但速度很快的數據引擎,它提供了基于內存和磁盤的表,具有內嵌和服務模式。另外,它還包括許多工具,例如:小型web服務,基于內存的查詢和管理工具(能夠運行在applet上),許多演示例子。
官方網址:http://hsqldb.sourceforge.net/
jaas.jar
JAAS(Java Authentication and Authorization Service)是Java認證和授權服務。它是多個Java包的集合,具有授權和加強了基于用戶的訪問控制能力的服務。是基于Java平臺的針對不同認證和授權服務的框架。是一個Java平臺的安全機制。
jaxen-1.1-beta-4.jar
jaxen是一個用Java開發的XPath 引擎,用于配合各種基于XML的對象模型,如DOM, dom4j ,JDOM以及Java Beans。
jboss-cache.jar
JBossCache是一個復制的事務處理緩存,它允許你緩存企業級應用數據來更好的改善性能。緩存數據被自動復制,讓你輕松進行JBoss服務器之間的集群工作。JBossCache能夠通過JBoss應用服務或其他J2EE容器來運行一個MBean服務,當然,它也能獨立運行。
JBossCache包括兩個模塊:TreeCache和TreeCacheAOP。
TreeCache --是一個樹形結構復制的事務處理緩存。
TreeCacheAOP --是一個“面向對象”緩存,它使用AOP來動態管理POJO(Plain Old Java Objects)
注:AOP是OOP的延續,是Aspect Oriented Programming的縮寫,意思是面向方面編程。
官方網站 http://www.jboss.org/products/jbosscache
jboss-common.jar
jboss通用包
jboss-jmx.jar
JMX(Java Management Extensions)是一個為應用程序植入管理功能的框架。JMX是一套標準的代理和服務,實際上,用戶可以在任何Java應用程序中使用這些代理和服務實現管理。
Jboss-jmx就是針對Jboss開發的JMX框架。
jboss-system.jar
jboss系統包
jdbc2_0-stdext.jar
JDBC2.0包
jgroups-2.2.7.jar
JGroups 是一個可靠的多點傳送通訊工具包,它不只是基于IP Multicast協議,它同時也基于UDP , TCP, JMS 等傳輸協議。它能夠創建一組進程,進程的成員之間能夠互相發送消息。
jta.jar
Java Transaction API (JTA) 規范的包,是指定事務處理管理和分布式事務處理系統之間的標準Java接口,包括資源管理,應用服務,事務應用程序。
junit-3.8.1.jar
Java測試工具包
log4j-1.2.9.jar
Java日志包
oscache-2.0.2.jar
OSCache是個一個廣泛采用的高性能的J2EE緩存框架,OSCache能用于任何Java應用程序的普通的緩存解決方案。
OSCache有以下特點:
緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可以緩存。
擁有全面的API--OSCache API給你全面的程序來控制所有的OSCache特性。
永久緩存--緩存能隨意的寫入硬盤,因此允許昂貴的創建(expensive-to-create)數據來保持緩存,甚至能讓應用重啟。
支持集群--集群緩存數據能被單個的進行參數配置,不需要修改代碼。
緩存記錄的過期--你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略(如果默認性能不需要時)。
官方網站 http://www.opensymphony.com/oscache/
proxool-0.8.3.jar
Proxool是Java數據庫連接池,它能向存在的JDBC驅動中透明的增加數據庫連接池。
swarmcache-1.0rc2.jar
SwarmCache是一個簡單且有效的分布式緩存,它使用IP multicast與同一個局域網的其他主機進行通訊,是特別為集群和數據驅動web應用程序而設計的。SwarmCache能夠讓典型的讀操作大大超過寫操作的這類應用提供更好的性能支持。
SwarmCache使用JavaGroups來管理從屬關系和分布式緩存的通訊。
官方網站 http://swarmcache.sourceforge.net
versioncheck.jar
hibernate版本檢測包
xalan-2.6.jar
Xalan名稱來自于一種罕見的樂器。
Xalan-Java是一個將XML轉換成HTML、text或其他XML文件類型的XSLT(XSL Transformations)處理機制。它使用XSL Transformations (XSLT) Version 1.0 and XML Path Language (XPath) Version 1.0。它在命令行方式、applet、servlet、或其他程序的模塊中都可以使用。
Xalan同時構建于SAX2和DOM level 2上。
官方網站;http://xml.apache.org/xalan-j/
xerces-2.6.2.jar
Xerces(名稱來源于一種叫Xerces Blue的蝴蝶)提供世界級的XML解析和產生。充分驗證的語法分析可用于Java和C++,執行W3C的XML和DOM(Level1 and 2)標準,以及SAX(version 2)標準。其語法具有高模塊化和可配置化。同時提供支持XML Schema(W3C標準草案)。
xml-apis.jar
XML包
在Hibernate有一些相當方便的輔助工具: hbm2java,hbm2ddl, 數據庫的逆向工程,Mapping Editor.
這些任務可以通過Ant構建完成,Hibernate提供了Ant Tasks及其構建腳本.由于Hibernate從2到3進行了重大重構,且包重新做了組織,因此Ant構建腳本也發生了巨大變化.在2中腳本樣式為:
<?xml version="1.0"?>
<project name="anto builder"
default="db" basedir=".">
<!-- Set up properties containing important project directories -->
<property name="source.root" value="src"/>
<property name="class.root" value="classes"/>
<property name="lib.dir" value="lib"/>
<property name="data.dir" value="data"/>
<!-- Set up the class path for compilation and execution -->
<path id="project.class.path">
<!-- Include our own classes, of course -->
<pathelement location="${class.root}" />
<!-- Include jars in the project library directory -->
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
<target name="db" description="Runs HSQLDB database management UI
against the database file--use when application is not running">
<java classname="org.hsqldb.util.DatabaseManager"
fork="yes">
<classpath refid="project.class.path"/>
<arg value="-driver"/>
<arg value="org.hsqldb.jdbcDriver"/>
<arg value="-url"/>
<arg value="jdbc:hsqldb:${data.dir}/music"/>
<arg value="-user"/>
<arg value="sa"/>
</java>
</target>
<!-- Teach Ant how to use Hibernate's code generation tool -->
<taskdef name="hbm2java"
classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
classpathref="project.class.path"/>
<!-- Generate the java code for all mapping files in our source tree -->
<target name="codegen"
description="Generate Java source from the O/R mapping files">
<hbm2java output="${source.root}">
<fileset dir="${source.root}">
<include name="**/*.hbm.xml"/>
</fileset>
</hbm2java>
</target>
<!-- Create our runtime subdirectories and copy resources into them -->
<target name="prepare" description="Sets up build structures">
<mkdir dir="${class.root}"/>
<!-- Copy our property files and O/R mappings for use at runtime -->
<copy todir="${class.root}" >
<fileset dir="${source.root}" >
<include name="**/*.properties"/>
<include name="**/*.hbm.xml"/>
</fileset>
</copy>
</target>
<!-- Compile the java source of the project -->
<target name="compile" depends="prepare"
description="Compiles all Java classes">
<javac srcdir="${source.root}"
destdir="${class.root}"
debug="on"
optimize="off"
deprecation="on">
<classpath refid="project.class.path"/>
</javac>
</target>
<!-- Generate the schemas for all mapping files in our class tree -->
<target name="schema" depends="compile"
description="Generate DB schema from the O/R mapping files">
<!-- Teach Ant how to use Hibernate's schema generation tool -->
<taskdef name="schemaexport"
classname="net.sf.hibernate.tool.hbm2ddl.SchemaExportTask"
classpathref="project.class.path"/>
<schemaexport properties="${class.root}/hibernate.properties"
quiet="no" text="no" drop="no">
<fileset dir="${class.root}">
<include name="**/*.hbm.xml"/>
</fileset>
</schemaexport>
</target>
</project>
在3中,構建腳本為:
<?xml version="1.0" encoding="GBK"?>
<project name="Hibernate" default="anthbm2java" basedir=".">
<property name="src.dir" value="./src" />
<property name="class.dir" value="./bin" />
<property name="lib.dir" value="D:/eclipse/plugins/org.hibernate.eclipse_3.0.0.alpha4/lib" />
<path id="project.class.path">
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
<pathelement location="${class.dir}" />
</path>
<path id="tasks.classpath">
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
<pathelement location="${class.dir}" />
</path>
<target name="anthbm2java">
<taskdef name="hibernatetool"
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="tasks.classpath"/>
<hibernatetool destdir="${class.dir}">
<configuration configurationfile="hibernate.cfg.xml" >
<fileset dir="${src.dir}">
<include name="**/*.hbm.xml" />
</fileset>
</configuration>
<hbm2ddl export="false" console="false" create="true" update="false" drop="false" outputfilename="broad.sql" delimeter=";"/> 其中的delimeter屬性不支持.
<hbm2java generics="true" ejb3="false"/>
<cfg2hbm/>
<!--
<cfg2cfgXml/> 這個任務在Hibernate-Tool A5版本中不支持.
<hbm2doc/> 同樣在這個版本中有問題.
-->
</hibernatetool>
</target>
</project>
這個腳本在Eclipse中檢驗過.
通過這個腳本,執行了很多Hibernate輔助工具的功能,方便了開發.
關于這些內容的參考可見:
posted on 2005-09-06 09:54 夏青松 閱讀(3165) 評論(0) 編輯 收藏 所屬分類: hibernate