记录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)字节码的动态生成。
http://cglib.sourceforge.net/
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辅助工具的功能,方便了开发.
关于这些内容的参考可见: