错误信息:
Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
原因与解决:
1.因为Hibernate Tools(或者Eclipse本身的Database Explorer)生成*.hbn.xml工具中包含有catalog="***"(*表示数据库名称)这样的属性,将该属性删除就可以了
2.估计是你的列名里面有关键字的原因吧,命名列的时候不要单独使用date,ID...这种关键字 

Hibernate查询时候的问题。
莫名其妙地报如下的错误,
org.hibernate.exception.GenericJDBCException: could not execute query

最后把mysql的驱动程序 从 mysql-connector-java-3.2.0-alpha改成mysql-connector-java-5.0.4就可以了。

posted @ 2008-12-03 22:02 caihaibo 阅读(610) | 评论 (0)编辑 收藏
Hibernate入门 - 基础配置

作者:robbin (MSN:robbin_fan AT hotmail DOT com)

版权声明:本文严禁转载,如有转载请求,请和作者联系

Hibernate配置文件可以有两种格式,一种是 hibernate.properties ,另一种是 hibernate.cfg.xml

后者稍微方便一些,当增加hbm映射文件的时候,可以直接在 hibernate.cfg.xml 里面增加,不必像 hibernate.properties 必须在初始化代码中加入。

但不管怎么说,两种的配置项都是一样的,下面详细介绍:

在Hibernate的src目录下有一个 hibernate.properties 模板,我们不必自己从头写,修改模板就可以了:)


hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'

这个配置意思是当你在Hibernate里面输入true的时候,Hibernate会转化为1插入数据库,当你在Hibernate里面输入false的时候,Hibernate会转化为0插入数据库,后面的Y,N同理。

对于某些数据库,例如Oracle来说,没有boolean数据类型,就是采用1代表true,0代表false,因此使用这个配置在Hibernate里面直接用true/false会非常直观。


hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql:///test
hibernate.connection.username root
hibernate.connection.password

这是一个连接MySQL数据库的例子,很直观,不必解释,不同的数据库的连接参数模板中全部给出了。
对于某些数据库,例如Oracle来说,没有boolean数据类型,就是采用1代表true,0代表false,因此使用这个配置在Hibernate里面直接用true/false会非常直观。


hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql:///test
hibernate.connection.username root
hibernate.connection.password

这是一个连接MySQL数据库的例子,很直观,不必解释,不同的数据库的连接参数模板中全部给出了。
如果你不是在App Server环境中使用Hibernate,例如远程客户端程序,但是你又想用App Server的数据库连接池,那么你还需要配置JNDI的参数,例如Hibernate连接远程Weblogic上的数据库连接池:

hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.datasource mypool
hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider
hibernate.jndi.class weblogic.jndi.WLInitialContextFactory
hibernate.jndi.url t3://servername:7001/


最后,如果你需要在EJB或者JTA中使用Hibernate,需要取消下行的注释:

hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory

杂项配置:


hibernate.show_sql false

是否将Hibernate发送给数据库的sql显示出来,这是一个非常非常有用处的功能。当你在调试Hibernate的时候,让Hibernate打印sql语句,可以帮助你迅速解决问题。


#hibernate.connection.isolation 4

指定数据库的隔离级别,往往不同的数据库有自己定义的隔离级别,未必是Hibernate的设置所能更改的,所以也不必去管它了。

hibernate.jdbc.fetch_size 50
hibernate.jdbc.batch_size 25

这两个选项非常非常非常重要!!!将严重影响Hibernate的CRUD性能!

C = create, R = read, U = update, D = delete

Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。

例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。

因此大大节省了无谓的内存消耗。当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。

这有点像平时我们写程序写硬盘文件一样,设立一个Buffer,每次写入Buffer,等Buffer满了以后,一次写入硬盘,道理相同。

Oracle 数据库的JDBC驱动默认的Fetch Size=10,是一个非常保守的设定,根据我的测试,当Fetch Size=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。

因此我建议使用Oracle的一定要将Fetch Size设到50。

不过并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支持。

MySQL就像我上面说的那种最坏的情况,他总是一下就把1万条记录完全取出来,内存消耗会非常非常惊人!这个情况就没有什么好办法了 :(

Batch Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。

Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。我做的一个测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!!!

可见有多么大的性能提升!很多人做Hibernate和JDBC的插入性能测试会奇怪的发现Hibernate速度至少是JDBC的两倍,就是因为Hibernate使用了Batch Insert,而他们写的JDBC没有使用Batch的缘故。

以我的经验来看,Oracle数据库 Batch Size = 30 的时候比较合适,50也不错,性能会继续提升,50以上,性能提升的非常微弱,反而消耗内存更加多,就没有必要了。


#hibernate.jdbc.use_scrollable_resultset true

设定是否可以使用JDBC2.0规范的可滚动结果集,这对Hibernate的分页显示有一定的作用,默认就好了。


#hibernate.cglib.use_reflection_optimizer false

默认打开,启用cglib反射优化。cglib是用来在Hibernate中动态生成PO字节码的,打开优化可以加快字节码构造的速度。

不过,当你在调试程序过程中,特别是和proxy,lazy loading相关的应用中,代码出错,但是出错提示信息有语焉不详,那么你可以把cglib优化关掉,这样Hibernate会输出比较详细的调试信息,帮助你debug。

Hibernate一共包括了23个jar包,令人眼花缭乱。本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进行取舍。

下载Hibernate,例如2.0.3稳定版本,解压缩,可以看到一个hibernate2.jar和lib目录下有22个jar包:

hibernate2.jar:
Hibernate的库,没有什么可说的,必须使用的jar包

cglib-asm.jar:
CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包

dom4j.jar:
dom4j 是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar 包,Hibernate用它来读写配置文件。

odmg.jar:
ODMG是一个ORM的规范,Hibernate实现了ODMG规范,这是一个核心的库,必须使用的jar包。

commons-collections.jar:
Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。

commons-beanutils.jar:
Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。

commons-lang.jar:
Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。

commons-logging.jar:
Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本身包含了一个Simple Logger,但是功能很弱。在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的 java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用 commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j,java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件,你只需要到Apache 网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。

使用Hibernate必须的jar包就是以上的这几个,剩下的都是可选的。

ant.jar:
Ant编译工具的jar包,用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码,那么就没有什么用,可选的jar包

optional.jar:
Ant的一个辅助包。

c3p0.jar:
C3PO是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池,就需要这个jar包。

proxool.jar:
也是一个连接池,同上。

commons-pool.jar, commons-dbcp.jar:
DBCP数据库连接池,Apache的Jakarta组织开发的,Tomcat4的连接池也是DBCP。

实际上Hibernate自己也实现了一个非常非常简单的数据库连接池,加上上面3个,你实际上可以在Hibernate上选择4种不同的数据库连接池,选择哪一个看个人的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中使用Hibernate,一定要用App Server的连接池,不要用以上4种连接池,否则容器管理事务不起作用。

connector.jar:
JCA 规范,如果你在App Server上把Hibernate配置为Connector的话,就需要这个jar。不过实际上一般App Server肯定会带上这个包,所以实际上是多余的包。

jaas.jar:
JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。所以实际上是多余的包。

jcs.jar:
如果你准备在Hibernate中使用JCS的话,那么必须包括它,否则就不用。

jdbc2_0-stdext.jar:
JDBC2.0的扩展包,一般来说数据库连接池会用上它。不过App Server都会带上,所以也是多余的。

jta.jar:
JTA规范,当Hibernate使用JTA的时候需要,不过App Server都会带上,所以也是多余的。

junit.jar:
Junit包,当你运行Hibernate自带的测试代码的时候需要,否则就不用。

xalan.jar, xerces.jar, xml-apis.jar:
Xerces 是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上,JDK1.4也包含了解析器,不过不是Xerces,是Crimson,效率比较差,不过Hibernate用XML只不过是读取配置文件,性能没什么紧要的,所以也是多余的。

Hibernate 是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装,下面我们详细的分析:

Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties中的配置:

#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory

如果你什么都不配置,默认情况下使用JDBCTransaction,如果你配置为:

hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory

将使用JTATransaction

不管你准备让Hibernate使用JDBCTransaction,还是JTATransaction,我的忠告就是什么都不配,将让它保持默认状态,如下:

#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory

在下面的分析中我会给出原因。

一、JDBC Transaction

看看使用JDBC Transaction的时候我们的代码例子:

Session session = sf.openSession();
Transaction tx = session.beginTransactioin();
...
session.flush();
tx.commit();
session.close();

这是默认的情况,当你在代码中使用Hibernate的Transaction的时候实际上就是JDBCTransaction。那么JDBCTransaction究竟是什么东西呢?来看看源代码就清楚了:

Hibernate2.0.3源代码中的类

net.sf.hibernate.transaction.JDBCTransaction:

public void begin() throws HibernateException {
   
...
        if (toggleAutoCommit) session.connection().setAutoCommit(false);
...
}

这是启动Transaction的方法,看到 connection().setAutoCommit(false) 了吗?是不是很熟悉?

再来看

public void commit() throws HibernateException {  
...
    try {
        if ( session.getFlushMode()!=FlushMode.NEVER ) session.flush();
        try {
            session.connection().commit();
            committed = true;
        }
...
    toggleAutoCommit();
}


这是提交方法,看到connection().commit() 了吗?下面就不用我多说了,这个类代码非常简单易懂,通过阅读使我们明白Hibernate的Transaction都在干了些什么?我现在把用 Hibernate写的例子翻译成JDBC,大家就一目了然了:

Connection conn = ...;         <---   session = sf.openSession();

conn.setAutoCommit(false);     <---   tx = session.beginTransactioin();

...                            <---   ...

conn.commit();                 <---   tx.commit(); (对应左边的两句)
conn.setAutoCommit(true);

conn.close();                  <---   session.close();

看明白了吧,Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫无神秘可言,只不过在Hibernate 中,Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以你最后不写 commit也没有关系,由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate的时候,你在程序中不写 Transaction的话,数据库根本就没有反应。


JTATransaction

如果你在EJB中使用Hibernate,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTATransaction,先看一个例子:

javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");

Session s1 = sf.openSession();
...
s1.flush();
s1.close();

...

Session s2 = sf.openSession();
...
s2.flush();
s2.close();

tx.commit();

这是标准的使用JTA的代码片断,Transaction是跨Session的,它的生命周期比Session要长。如果你在EJB中使用 Hibernate,那么是最简单不过的了,你什么Transaction代码统统都不要写了,直接在EJB的部署描述符上配置某某方法是否使用事务就可以了。

现在我们来分析一下JTATransaction的源代码, net.sf.hibernate.transaction.JTATransaction:

public void begin(InitialContext context, ...
  ...
  ut = (UserTransaction) context.lookup(utName);
  ...

看清楚了吗? 和我上面写的代码 tx = new (Initial Context)().lookup("javax.transaction.UserTransaction"); 是不是完全一样?

public void commit() ...
  ...
  if (newTransaction) ut.commit();
  ...


JTATransaction的控制稍微复杂,不过仍然可以很清楚的看出来Hibernate是如何封装JTA的Transaction代码的。

但是你现在是否看到了什么问题? 仔细想一下,Hibernate Transaction是从Session中获得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,这完全符合JDBC的 Transaction的操作顺序,但是这个顺序是和JTA的Transactioin操作顺序彻底矛盾的!!! JTA是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction,因此当你使用JTA的 Transaction的时候,那么就千万不要使用Hibernate的Transaction,而是应该像我上面的JTA的代码片断那样使用才行。
总结:
1、在JDBC上使用Hibernate

必须写上Hibernate Transaction代码,否则数据库没有反应。此时Hibernate的Transaction就是Connection.commit而已

2、在JTA上使用Hibernate

写JTA的Transaction代码,不要写Hibernate的Transaction代码,否则程序会报错

3、在EJB上使用Hibernate

什么Transactioin代码都不要写,在EJB的部署描述符里面配置

|---CMT(Container Managed Transaction)
|
|---BMT(Bean Managed Transaction)
        |
        |----JDBC Transaction
        |
        |----JTA Transaction
 
posted @ 2008-12-03 18:11 caihaibo 阅读(252) | 评论 (0)编辑 收藏
原文出处:http://www.blogjava.net/Andyluo/archive/2006/10/06/73584.html
         在MySQL里创建外键时(Alter table xxx add constraint fk_xxx foreign key),提示错误,但只提示很简单的信息:ERROR 1005 (HY000): Can't create table '.\env_mon\#sql-698_6.frm' (errno: 150)。根本起不到解决问题的作用。

要看错误的详细提示,可以使用命令:(在MySQL Manual里搜索“errno 150”时找到)

SHOW ENGINE INNODB STATUS;     //针对用INNODB存储方式的数据库

在信息中有一组【LATEST FOREIGN KEY ERROR】会有最近错误的详细描述和解决办法。
如:
Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.
(译:不能在“被reference的表”里找到包含“被reference字段”的索引,或者是两个关联字段类型不匹配)

(我犯的错误是没有在主表中设置主键-_-!,即第一种原因)

呵呵,今天建数据库等时出的错误是由第二种原因引起,即两个关联字段类型不匹配,万能的互联网啊。。。。。。
posted @ 2008-12-02 21:25 caihaibo 阅读(151) | 评论 (0)编辑 收藏
 HSQLDB是一个开放源代码的JAVA数据库,具有标准的SQL语法和JAVA接口。HSQLDB可以自由使用和分发,具有内存数据库,独立数据库和客户-服务器三种数据库模式。本文介绍客户-服务器模式的配置。 

    从HSQLDB主页上下载HSQLDB:

    http://hsqldb.org/

  把下载的压缩文件解开,然后在系统环境变量中加入hsqldb.jar,如:

.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;D:\hsqldb\lib\hsqldb.jar

     在硬盘中任意位置建一个目录作为HSQLDB数据库的主目录,然后打开命令行,进入该目录。在里面建一个server.properties文件,这是HSQLDB服务器模式的配置文件。可以在里面设置数据库服务的监听端口、服务名称、数据文件的相对和绝对路径:

#begin of 'server.properties' file

#数据库服务的监听端口
server.port=9001

#定义服务名称,也即数据库名称。数据库链接的URL即为

#jdbc:hsqldb:hsql://localhost:9001/bitan。
server.dbname.0=bitan

# 该服务在硬盘上的相对或绝对路径。file:后面可以跟相#对或绝对路径,如file:bitan表示数据文件为当前目录下的bitan.*文件。服务名和路径之间通过小数点后的数字关联。比如database.0与#dbname.0关联,database.1与dbname.1关联,……, database.n与dbname.n关联。
server.database.0=file:d:/bitan
#mounts a 'file_in_jar' database with alias 'restest'
#database connection url would be 'jdbc:hsqldb:hsql://host:1234/restest'
#server.database.1=res:/mypackage/test
#server.dbname.1=restest
#mounts a 100% in-memory (transient) database with alias 'memtest'
#database connection url would be 'jdbc:hsqldb:hsql://host:1234/memtest'
#server.database.2=mem:test
#server.dbname.2=memtest
#...
#server.database.n=...
#server.dbname.n=...
server.silent=true

#end of 'server.properties' file

 

    进入上面设置的主目录,启动HSQLDB服务器:HSQLDB会在当前目录下寻找server.properties文件,如果没有发现该文件就使用默认设置。

 

D:\work\eclipse\hibe\data>java org.hsqldb.Server
[Server@1034bb5]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@1034bb5]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@1034bb5]: Startup sequence initiated from main() method
[Server@1034bb5]: Loaded properties from [D:\work\eclipse\hibe\data\server.prope
rties]
[Server@1034bb5]: Initiating startup sequence...
[Server@1034bb5]: Server socket opened successfully in 78 ms.
[Server@1034bb5]: Database [index=0, id=0, db=file:bitan, alias=bitan] opened su
cessfully in 1000 ms.
[Server@1034bb5]: Startup sequence completed in 1093 ms.
[Server@1034bb5]: 2005-11-03 11:30:47.046 HSQLDB server 1.8.0 is online
[Server@1034bb5]: To close normally, connect and execute SHUTDOWN SQL
[Server@1034bb5]: From command line, use [Ctrl]+[C] to abort abruptly

 

 

另外开一个命令行窗口,启动HSQLDB的管理工具,这是GUI外观的程序:

 

D:\work\eclipse\hibe\data>java org.hsqldb.util.DatabaseManager

 

首先出现的是登录窗口:

    在“setting name”中填入“bitan”,下次启动管理工具时,该字串就会出现在“recent”下拉框中。点击“clr”按钮可以清除该字串。在“type”中选择HSQL Database Engine Server,然后在“URL”中输入上面server.properties中的设置。

    点“OK” 登录以后,会出现下面的窗口,左边是目录窗口,右边是SQL查询窗口。我们可以在SQL查询窗口中键入任意SQL语句(包括DDL,DML等等),然后点击“Execute”执行该语句。HSQLDB安装文件的doc目录里附带了PDF和HTML格式的文档,介绍了HSQLDB的SQL语法、支持的数据类型、内置函数等等。

可以在SQL窗口里创建新表:

 

create table events

(event_id integer identity not null,

event_date date,

title varchar(500))

(ID的自动插入方式上,HSQLDB支持identity,如sql server;也支持序列+触发器,如Oracle。)

 

可以插入记录:

 

insert into events (event_id, event_date, title)

values (null, curdate(), 'bitan')

 

(curdate()是HSQLDB内置函数,返回当前日期)

 

启动了HSQLDB服务器,我们就可以在java程序中以JDBC方式访问数据库了。hsqldb.jar中内置了JDBC驱动程序。

如下例,这是hibernate中的配置文件Hibernate.cfg.xml:

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
   
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="connection.url">jdbc:hsqldb:hsql://jim:9001/bitan</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>
       
        <property name="connection.pool_size">1</property>
       
        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
       
        <property name="show_sql">true</property>
       
        <!-- property name="hbm2ddl.auto">update</property-->
       
        <mapping resource="hbm/Event.hbm.xml"/>
    </session-factory>
</hibernate-configuration>


posted @ 2008-12-02 18:23 caihaibo 阅读(952) | 评论 (0)编辑 收藏

HSQLDB是一个开源的DBMS数据库,以其体积小巧、功能实用、使用方便而越来越受到开发人员的欢迎,特别是在平时的开发、单元测试中。如果你不想安装庞大的ORACLE、SQL Server数据库,同时又想尽快拥有一个可用的数据库,那么HSQLDB绝对是你的首选。

Ant是一个人皆知之的打包发布工具,其简单的语法,丰富的功能,让我们不但可以方便地进行像资源管理、编译、运行、测试的功能,同时也能够快速地管理数据库。

下面就以这两者为例,来介绍一下他们的结合运用。


一、下载Ant和HSQLDB:

Ant的下载地址:http://ant.apache.org/bindownload.cgi
HSQLDB的下载地址:http://sourceforge.net/project/showfiles.php?group_id=23316

二、安装Ant和HSQLDB:

Ant的安装我就不多说了,可以参考其网站的文档。HSQLDB的安装更简单,直接把hsqldb.jar包拷贝到你工程的lib目录下就可以了。

三、配置HSQLDB:

在你的工程目录下创建一个名为data的目录,这是HSQLDB用来存放数据文件的地方。够简单吧,^_^。

四、编写Ant脚本:

我们的Ant脚本很简单,主要的功能有:启动数据库、关闭数据库、显示Swing界面的HSQLDB管理工具。请看下面的XML文件

<?xml version="1.0" encoding="UTF-8"?>

<project name="hibernate-hsql" default="startDb">

  
<!-- Set default database properties -->
  
<property name="hjar" value="lib/hsqldb.jar" />
  
<property name="hclass" value="org.hsqldb.Server" />
  
<property name="hfile" value="-database.0 data/test" />
  
<property name="halias" value="test" />
  
<property name="hport" value="9005" />

  
<!-- Start up HSQLDB instance, use default properties as arguments: database file,database name,port -->
  
<target name="startDb">
  
<java fork="true" classname="${hclass}" 
        classpath
="${hjar}" 
        args
="${hfile} -dbname.0 ${halias} -port ${hport}" />
  
</target>

  
<!-- Start up HSQLDB swing manager UI -->    
  
<target name="hsqldm">
  
<java fork="true" classname="org.hsqldb.util.DatabaseManagerSwing" 
        classpath
="${hjar}"  />
  
</target> 
    
  
<!-- Shut down HSQLDB -->    
  
<target name="shutdownDb">
    
<sql classpath="${hjar}"
           driver
="org.hsqldb.jdbcDriver" 
           url
="jdbc:hsqldb:hsql://localhost:${hport}/${halias}" 
           userid
="sa" password="" 
           print
="yes">
        SHUTDOWN
    
</sql>
  
</target>
    
</project>


首先我们定义了几个属性:

·hjar:HSQLDB的JAR包位置
·hclass:org.hsqldb.Server,代表了HSQLDB。
·hfile:相当于URL,其中database.0代表了第一个数据库,data是存放数据的地方,test是数据库名
·halias:别名
·hport:端口号,默认为9905

接着我们我们看startDb这个Target,它相当于我们在DOS下转到data目录下,执行java -classpath /lib/hsqldb.jar org.hsqldb.Server。启动HSQLDB数据库。执行该Target后我们可以看到如下输出:

startDb:
     [java] The args attribute is deprecated. Please use nested arg elements.
     [java] [Server@a62fc3]: [Thread[main,5,main]]: checkRunning(false) entered
     [java] [Server@a62fc3]: [Thread[main,5,main]]: checkRunning(false) exited
     [java] [Server@a62fc3]: Startup sequence initiated from main() method
     [java] [Server@a62fc3]: Loaded properties from [D:\peng\Java\Pro\framework\hibernate\server.properties]
     [java] [Server@a62fc3]: Initiating startup sequence...
     [java] [Server@a62fc3]: Server socket opened successfully in 32 ms.
     [java] [Server@a62fc3]: Database [index=0, id=0, db=file:data/test, alias=test] opened sucessfully in 968 ms.
     [java] [Server@a62fc3]: Startup sequence completed in 1000 ms.
     [java] [Server@a62fc3]: 2008-02-24 22:56:39.468 HSQLDB server 1.8.0 is online
     [java] [Server@a62fc3]: To close normally, connect and execute SHUTDOWN SQL
     [java] [Server@a62fc3]: From command line, use [Ctrl]+[C] to abort abruptly

hsqldbm这个Target是一个Swing界面的HSQLDB管理工具,可以在上面执行一系列的简单的SQL操作,对于不想看日志的人来说比较方便,但功能不多。值得注意的是:执行这个Target并需要先启动HSQLDB。
启动后我们可以看到如下界面:



最后是HSQLB的关闭了。在Ant中我们可以采用<sql></sql>这个命令来执行SQL操作,首先当然是指定数据库的一系列配置信息,然后在<sql></sql>之间书写SQL语句。这里SHUTDOWN是HSQLDB提供的一个用来关闭数据库的命令。执行该命令后,我们可以看到如下输出:

 [java] [Server@a62fc3]: Initiating shutdown sequence...
 [java] [Server@a62fc3]: Shutdown sequence completed in 16 ms.
 [java] [Server@a62fc3]: 2008-02-24 22:57:27.375 SHUTDOWN : System.exit() is called next

OK,这个简单的脚本就完成了,现在我们可以直接在DOS、Eclipse下启动、关闭、浏览HSQLDB了。

posted @ 2008-12-02 17:43 caihaibo 阅读(148) | 评论 (0)编辑 收藏
其實只要下載完後設定環境變數就可以了。


下載後解壓縮到C槽,更名資料夾為ant
接著設定以下環境變數,

ANT_HOME=c:\ant
JAVA_HOME=c:\jdk-1.5.0.05
PATH=%PATH%;%ANT_HOME%\bin


開始 -> 控制台 -> 系統 -> 進階 -> 環境變數 ->
1. 新增 -> 變數名稱: ANT_HOME  變數值: c:\ant -> 確定
2. 找到變數Path -> 編輯 -> 在變數值最後面加上 ;%ANT_HOME%\bin   (注意分號)
確定離開後重新啟動電腦。


重新啟動後,
開始 -> 執行 -> cmd -> 在命令提示字元下輸入 ant 
若出現
Buildfile: build.xml does not exist!
Build failed
表示路徑已完成設定。
posted @ 2008-11-29 23:24 caihaibo| 编辑 收藏
  美国《心身医学》杂志刊登一项最新研究显示,夫妻争执时保持缄默的女性面对死亡的几率是在争执中能自由表达意见女性的4倍,抑郁症和肠胃病在前者人群中较为常见。

  “我常常跟女士说,如果跟你先生吵架了,什么时候把你气哭了再走,别气半截。”北京崔月犁传统医学研究中心研究员樊正伦说。

  “有人为了实验老鼠生气,就掐它尾巴让它生气,制造一个生气的模型,但那与人生气不可能一样,人就是人,是很难模拟的。”樊正伦指出,中医说喜、怒、忧、思、悲、恐、惊是作为一个正常人必须有的情绪,而这些情绪跟你的五脏密切相关。所以情绪的好坏、变化直接影响着你的生命活动。

  怒与肝相关。生气的时候肝气特别旺,一哭,肺气上来了,肺属金,肝属木,金克木,肺气一通肝气就调达了,如果气一半,肝气没下来,回头还得接着吵架不说,还容易得病。“所以,吵架时不能气半截,要吵透。”樊正伦说。

  五脏相互制约,如果可以很好地调整情绪,就可以少生很多病。樊正伦说,临床中发现,女人三四十岁时,甲状腺、卵巢、乳腺都容易出现一系列病变。其原因是35岁到42岁这个阶段,阳明脉衰,自身运化的能力弱了。而且这个年龄,上有老,下有小,在家里和单位都是顶梁柱,郁闷得不到疏散,这类疾病的发病率就非常高。

  他建议,这个年龄段的女性要自觉地调整自己的状态,调整自己的情绪,在特别抑郁的时候大哭一场,或者大骂一顿,能自如地嬉笑怒骂,疾病就会少很多。

  男性以阳气为主,表现得不像女人那么剧烈,不爱哭,什么事都憋着扛着,认为这样才是男子汉。这也是不对的,男人与女人一样,都需要宣泄,以免肝气郁结。

posted @ 2008-11-26 22:43 caihaibo 阅读(206) | 评论 (0)编辑 收藏
我认为生气就是当一个人认为某种事物或现象违背了他内心的准则或信念时产生的一种情绪体验。
我们每个人都有自己的信念系统和价值系统。比如说我认为怎么样才是对的,别人应该怎么样才是对的,我应该怎么样才是对的等等,一旦别人或自己的一些行为违背了这些标准,我们就会不高兴和生气。

这么看来生气是必然的了,确实如此。只不过生气也有轻重之分,也有难易之分。

一个人如果他的标准越宽容他就越难生气,所谓你的胸怀的大小决定于你生气事情的大小。动不动就生气的人,是因为他的信念系统和价值系统认同的范围太窄,所以别人或他自己的一些行为很容易触犯他的准则,使他不高兴,于是生气。其实别人可能根本就没有做错什么。当然别人做没做错也正是根据他的信念系统来评估的,所以别人的对错也没有客观标准,完全在于接受方的评价。
其实还有一点,就是不容易生气的人除了拥有比较宽容的信念系统以外,他还有一条直接避免生气的信念,那就是同理心,即将心比心。虽然他不赞同别人的意见或行为。但他能理解,如果能做到这一点,生气的次数大概要减少80%。

还有一条信念就是,可以将生气压到最低限度。那就是当别人的行为你不能赞同,也不能表示理解,可以说你认定他完全错误,这时候告诫自己,生气就是拿别人的错误来惩罚自己。有了这一条,你想生气都难了。

所以还是那句行话:生气是一种态度,是一种选择,全在乎你愿不愿意,不关别人的事。千万别说是谁惹了你,是谁令你生气,生气完全是你自己要的,自己选的。

建议:每天坚持做长跑也是锻练自控能力的好方法,每天2000米,这样你每天坚持,你的自控能力必然能改善,三天打鱼两天晒网就不可能改善的哦.

我送你12个字:缓一缓 再生气 想一想 再行动!











有句话送给你,不要拿别人的错误来惩罚自己。很多事情,也没必要事事完美,与其改变别人做的更好,不如先改变自己接受一些缺点。或者说把一些你看不惯的东西看成是芝麻绿豆大。
有个故事不知你有没听过,鸭子看东西时,眼睛是放大镜,它看到的人都很大,所以它看到人的时候,总是以为人要来打它,所以它会去咬人,牛看东西的时候,所以的东西在它的眼里都是蚂蚁一样这么小,所以它不会袭击人类。



要生气的时候先问问自己:
我为什么生气?
生气有什么用?
生完气会给别人造成什么伤害?有什么后果?

回答完这几个问题,再从一数到十。


告诉他:怒主肝,生气直接伤肝,肝脏出了问题会影响其他器官,继而身体病就来了。相信他知道了利害关系,会尽快控制自己的情绪。


每次生气都记个数,看看自己每天会生多少次。
然后学习控制自己,慢慢减少次数!!
posted @ 2008-11-26 21:53 caihaibo 阅读(1786) | 评论 (0)编辑 收藏
MyEclipse Update Progress Error现象:
频繁弹出Update Progress(Time of error:……)窗口。
.log文件里

org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalArgumentException: Argument cannot be null)
at org.eclipse.swt.SWT.error(SWT.java:3563)
at org.eclipse.swt.SWT.error(SWT.java:3481)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:126)
中略
Caused by: java.lang.IllegalArgumentException: Argument cannot be null
at org.eclipse.swt.SWT.error(SWT.java:3547)
at org.eclipse.swt.SWT.error(SWT.java:3481)
at org.eclipse.swt.SWT.error(SWT.java:3452)

 

解决方案
在某英文网站上找到一下答案,试了,没好用。你们可以试下OK不?
a) leave myeclipse
b) point explorer to the .metadata folder
c) right mouse button select "search" giving criteria 'org.eclipse.update*' (without quotes)
d) deleting all the files/folders found
e) restart myeclipse

通过上面的联想到其它UpdateStamp的文件,到MyEclipse的安装目录,之下的“eclipseconfigurationorg.eclipse.update”目录,
发现有一个,last.config.stamp。
a) leave myeclipse
b) delete last.config.stamp
c) restart myeclipse
之后就没有同样的窗口弹出来。
但是,如果在某项目上右键打开项目的属性窗口,点击“Myeclipse”的Update按钮,又会弹出同样的窗口。
这样的话,只要再重复一下上述操作就OK。

posted @ 2008-11-21 14:57 caihaibo 阅读(10521) | 评论 (4)编辑 收藏

本文所用环境:Eclipse 3.2 + MyEclipse 5.0GA + WebLogic 9.2

选择 WebLogic 9.2 的原因

①WebLogic 8 支持的是 J2EE 1.3,也就是 Servlet 2.3 规范。若在 MyEclipse 中建立 Web Project 时选择了 J2EE 1.4[default],在部署的时候就会出现异常,提示部署描述符 web.xml 是畸形的,也就是未通过 DTD 检验。因为 J2EE 1.4 使用的是 Servlet 2.4 规范,这直接体现在 web.xml 部署描述符的头部引用中。这就是有些朋友遇到的,部署在 Tomcat 和 JBoss 中能够运行的 JSP 程序,部署到 WebLogic 8 就无法运行的原因之一。解决这个问题,需要将 WebLogic 升级到 9.2 版本;或者使用 J2EE 1.3。

Servlet 2.3 规范生成的 web.xml 头部:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd"
>
<web-app>
...
</web-app>

Servlet 2.4 规范生成的 web.xml 头部:


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi
=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
...
</web-app>

②若在上一个问题选择了 J2EE 1.3 进行开发后,在部署时会出现另外的异常,提示“Unsupported major.minor version 49.0”—— 又是版本问题,这次是由于 JDK 版本不支持造成的。WebLogic 8 不支持 JDK 1.5,由 JDK 1.5 编译的程序无法部署到只支持 JDK 1.4 的服务器上运行。解决的办法也有两个:用 JDK 1.4 重新编译;或者换用支持 JDK 1.5 的服务器,也就是升级到 WebLogic 9.2。

配置 WebLogic 9.2

安装 WebLogic 比较容易,在这里就不再累述了,大家可以参阅相关文档。现在着重讲一下 WebLogic 的配置,因为后面在配置 MyEclipse 时将用到这里的配置信息。

①运行开始 -> 程序 -> BEA Products -> Tools -> Configuration Wizard。
②选择 Create a new WebLogic domain,Next。
③在 Select Domain Source 界面保持默认,Next。
④在 User name 处输入 user,两个 password 都输入 12345678(密码要求 8 位),Next。
⑤ 在 Configure Server Start Mode and JDK 界面中保持默认,即 JDK 选择的是“Sun SDK 1.5.0_04 @ C:BEAjdk150_04”,注意这里若选择“Other JDK”配置比 SDK 1.5.0_04 更高的版本,服务器启动时将会出现异常,所以最好保持默认,然后 Next。
⑥在 Customize Environment and Services Settings 界面中默认为 No,Next。
⑦在 Domain name 处输入 mydomain,点击 Create。
⑧完成后点击 Done 关闭 Configuration Wizard 对话框。
⑨ 运行开始 -> 程序 -> BEA Products -> User Projects -> mydomain -> Start Admin Server for Weblogic Server Domain,检查服务器是否启动成功。

配置 MyEclipse 的 WebLogic 9 服务器

启动 Eclipse,选择“Window -> Preferences”菜单,打开首选项对话框。展开 MyEclipse 下的 Application Servers 节点,点击 WebLogic 9,选中右边的 Enable 单选按钮,启用 WebLogic 服务器。配置如下:
①BEA home directory:C:BEA(假定 WebLogic 安装在 C:BEA 目录中)
②WebLogic installation directory:C:BEAWebLogic92
③Admin username:user(来自 WebLogic 中的配置)
④Admin password:12345678(来自 WebLogic 中的配置)
⑤Execution domain root:C:BEAuser_projectsdomainsmydomain
⑥Execution server name:AdminServer
⑦Security policy file:C:BEAWebLogic92serverlibweblogic.policy
⑧JAAS login configuration file:(Null)

接着展开 WebLogic 9 节点,点击 JDK,在右边的 WLS JDK name 处选择 WebLogic 9 的默认 JDK。这里组合框中缺省为单独安装的 JRE。单击 Add 按钮,弹出 WebLogic -> Add JVM 对话框,在 JRE 主目录处选择 WebLogic 安装文件夹中的 JDK 文件夹,我的版本为 C:BEAjdk150_04,程序会自动填充其他选项。单击确定按钮关闭对话框。这时候就可以在 WLS JDK name 组合框中选择 jdk150_04 了。

至此,MyEclipse 中 WebLogic 9 的配置工作就算完成了。下面可以看看在 Eclipse 中能否启动 WebLogic 服务器了?安装了 MyEclipse 之后,Eclipse 工具栏中就会有一个“Run/Stop/Restart MyEclipse Application Servers”下拉按钮。点击该按钮的下拉部分,选择“WebLogic 9 -> Start”菜单,即开始启动 WebLogic 了。通过查看控制台的消息,就可以检查启动是否成功,或发生什么异常。
posted @ 2008-11-19 17:31 caihaibo 阅读(225) | 评论 (0)编辑 收藏
仅列出标题
共8页: 上一页 1 2 3 4 5 6 7 8 下一页