每日一得

不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速开发
最近关心的内容:SSH,seam,flex,敏捷,TDD
本站的官方站点是:颠覆软件

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  220 随笔 :: 9 文章 :: 421 评论 :: 0 Trackbacks

#

转自: 这里

1. 配置RedHat AS 3

操作系统版本:
Red Hat Enterprise Linux AS release 3 (Taroon)
Kernel 2.4.21-4.EL on an i686
按照常规来安装操作系统,记得要安装开发工具(gcc等必要工具).

1.1 检查必要的硬件信息

检查内容 最小值 检查命令参考
物理内存 512M # grep MemTotal /proc/meminfo
交换空间 1.0 GB或者2倍内存大小 # grep SwapTotal /proc/meminfo
/tmp 空间 400 MB # df -k /tmp
软件所需空间 2.5 GB # df -k (空间越大越好,如果是正式系统,应该进行详尽的规划)
数据库文件 1.2 GB # df -k (空间越大越好,如果是正式系统,应该进行详尽的规划)
检查完如上各项之后, 应该修改核心参数.执行如下命令:

#vi /etc/sysctl.conf

#注释:
#表示使用root用户操作,$表示使用oracle 用户进行操作.提示符后面的蓝色部分表示需要输入的命令,以下同.

在该文件末尾加入如下内容:
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

编辑完之后,保存,执行 # /sbin/sysctl -p 命令操作来使我们所做的变更生效.
注:上面kernel.shmmax/kernel.sem等是典型的核心参数配置.您可能需要根据您的实际环境进行适当的变动.

关于这些核心参数的说明在Oracle的 Oracle9i Installation Guide Release 2 (9.2.0.1.0) for UNIX Systems 中有很详细的说明.( http://download-west.oracle.com/docs/html/A96167_01/toc.htm )

然后,应该检查一下上面的操作是否正确:
# /sbin/sysctl -a | grep sem
# /sbin/sysctl -a | grep shm
# /sbin/sysctl -a | grep file-max
# /sbin/sysctl -a | grep ip_local_port_range

为Oracle用户设定Shell的限制
一般来说,出于性能上的考虑,还需要需要进行如下的设定,以便改进Oracle用户的有关 nofile(可打开的文件描述符的最大数)和nproc(单个用户可用的最大进程数量)

# vi /etc/security/limits.conf
# 添加如下的行

*               soft    nproc   2047
*               hard    nproc   16384
*               soft    nofile  1024
*               hard    nofile  65536

添加如下的行到/etc/pam.d/login 文件:
session    required     /lib/security/pam_limits.so

编辑 /etc/profile 文件,添加如下部分:
if [ $USER = "oracle" ]; then 
        if [ $SHELL = "/bin/ksh" ]; then 
                ulimit -p 16384 
                ulimit -n 65536 
        else 
                ulimit -u 16384 -n 65536 
        fi 
fi
之后,执行$ ulimit 验证一下.

1.2 检查并安装相关补丁
在这个版本的RHEL上安装Oracle,必须要有几个软件包. 确认以下 rpm包都已经安装:

make-3.79
binutils-2.11
openmotif-2.2.2-16
setarch-1.3-1
compat-db-4.0.14.5
compat-gcc-7.3-2.96.122
compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122

# rpm -qa | grep compat
# 在机器上输出如下:

compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122
compat-glibc-7.x-2.2.4.32.5
compat-db-4.0.14-5
compat-gcc-7.3-2.96.122

# rpm -qa | grep openmotif
openmotif-devel-2.2.2-16
openmotif-2.2.2-16

# rpm -qa | grep setarch
setarch-1.3-1


上面显示的内容是在笔者已经安装了具体的RPM包之后的结果.一般情况下,你的系统上的输出结果和这个不同.如果个别包没有安装,把系统安装光盘mount上,找到具体的软件包(大多数在第三张光盘上),然后利用如下的命令来安装相应的包:
# rpm -ivh *.rpm

要额外注意的是,这些软件包之间是有依赖性的,先后的顺序要找好.否则会报告不能安装的错误. 此外,最好验证一下 gcc和glibc的版本(要求是gcc-3.2.3-2 或者更高):
#gcc -v
#rpm -q glibc

1.3 创建用户和相关的组
# /usr/sbin/groupadd oinstall
# /usr/sbin/groupadd dba
# /usr/sbin/useradd -g oinstall -G dba oracle
 

如果只是测试目的的话,不创建oinstall组也没什么. 不过还是规范一点比较好.如果oracle 用户和dba组等已经存在,作适当的调整即可.

1.4 检查并调整环境变量
登录为oracle用户

# su - oracle
$ cd
$ vi .bash_profile

#添加如下内容,你的具体值应该不会和这个完全相同.
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/dbse
export ORACLE_SID=orcl
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export LC_CTYPE=en_US.UTF-8

然后执行
$ source .bash_profile

使环境变量生效. /oracle 等目录应该建立好并做合适的授权.

2. 安装Orale10g
mount安装盘.由于10g无法以root安装,以前面建的oracle用户登录.执行:

$ ./runInstaller

按照提示安装即可,最后还需要以root运行两个脚本。

3. 配置TNS参数
在 /oracle/product/dbse/network/admin/ 目录下有 listener.ora 和 tnsnames.ora 两个文件,设置如下:

#listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
     (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /oracle/product/dbse)
      (SID_NAME = orcl)
     )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
        (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
        )
        (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
        )
    )
  )

#tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
        (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

其中SERVICE_NAME与SID_NAME一定要和.bash_profile中的ORACLE_SID相一致,否则无法启动

4. 启动Oracle
以oracle用户登录

4.1 启动TNS监听器
$ lsnrctl start
出现如下显示,表示监听服务成功开启
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 22-FEB-2006 10:24:03

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

Starting /oracle/product/dbse/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /oracle/product/dbse/network/admin/listener.ora
Log messages written to /oracle/product/dbse/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date                22-FEB-2006 10:24:03
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle/product/dbse/network/admin/listener.ora
Listener Log File         /oracle/product/dbse/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully


4.2启动数据库
9i 之后已经没有 svrmgrl 了,所有的管理工作都通过 sqlplus 来完成:
$ sqlplus /nolog
SQL> connect system/change_on_install as sysdba
SQL> startup

出现如下显示,表示Oracle已经成功启动
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size              88082024 bytes
Database Buffers          188743680 bytes
Redo Buffers                7168000 bytes
Database mounted.
Database opened.

4.3 自动启动与关闭

编辑 /etc/oratab ,把所有的 instance 的重启动标志设置成 'Y',如:
orcl:/oracle/product/dbse:Y

做一个启动脚本 /etc/init.d/dbora ,如下所示:

#!/bin/sh
# description: Oracle auto start-stop script.
# chkconfig: - 20 80
#
# Set ORA_HOME to be equivalent to the $ORACLE_HOME
# from which you wish to execute dbstart and dbshut;
#
# Set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME.

ORA_HOME=/oracle/product/dbse
ORA_OWNER=oracle
if [ ! -f $ORA_HOME/bin/dbstart ]
then
echo "Oracle startup: cannot start"
exit
fi
case "$1" in
'start')

# Start the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values

su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
;;
'stop')

# Stop the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values

su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
;;
'restart')
$0 stop
$0 start
;;
esac

赋予执行权限
chmod 750 /etc/init.d/dbora

作成以下链接:
ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora


执行以下命令:
chkconfig --level 345 dbora on

这样就OK了。下次开关机的时候,Oracle也会随之启动/停止。

参考信息

http://www.dbanotes.net

posted @ 2006-05-09 13:12 Alex 阅读(906) | 评论 (5)编辑 收藏

注:本文继续分页的上一篇 关于分页,标签,缓存
hibernate分页有现成的支持:

query.setFirstResult(start);
query.setMaxResults(rowNum); 


MySql如下:
select * from table where  limit start,rowNum;


Oracle如下
select * from table where  and rowid not in(select rowid from t_table where  .... and  rownum<= (pageIndex-1* size)
and rownum <= size;

PageBean以前是设置currentPage,然后在页面里自己判断上一页下一页是什么,后来发现纯粹多余,完全可以把目标页写进去,而且参数也统一了,以前页面传到Action有好几个参数:

if(method.equals("lastPage")){

}
else if(method.equals("nextPage")){

}
else if(method.equals("targetPage")){
    
//.
}


现在统一一个参数就是pageIndex,爽多了  :)
PageBean代码如下:
int currentPage = 1;//当前页:Action控制
    int totalPages = 0;//总页数 :自己运算
    public static int pageRecorders = 10//每页记录数,默认为10,可以在初始化的时候修改//总数据数
    int pageStartRow = 0//每页的起始数  [这个字段可以去掉]
    int pageEndRow = 0//每页显示数据的终止数  [这个字段也可以去掉]
    boolean hasNextPage = false//是否有下一页:自己运算
    boolean hasPreviousPage = false//是否有前一页 :自己运算
    List objList = new ArrayList();//存放欲展示的对象列表
    int totalRows;//总记录数,由底层service提供

    
//增加上一页索引 [directly to target page]
    private int lastPageIndex = 1;
    
//增加下一页索引 [directly to target page]
    private int nextPageIndex = 1;

    
public int getLastPageIndex() {
        
return currentPage - 1;
    }

    
public int getNextPageIndex() {
        
return currentPage + 1;
    }


    
//是否有上一页
    public boolean isHasPreviousPage() {
        
return (currentPage > 1 ? true : false);
    }

    
//共有多少页,service只提供有多少条记录,多少页数由PageBean自己运算
    public int getTotalPages() {
        
if (totalRows <= pageRecorders) return 1;
        
return (totalRows % pageRecorders == 0 ? totalRows / pageRecorders : totalRows / pageRecorders + 1);
    }

    
public int getCurrentPage() {
        
return currentPage;
    }

    
public int getPageEndRow() {
        
return pageEndRow;
    }

    
//是否有下一页
    public boolean isHasNextPage() {
        
return (currentPage < this.getTotalPages() ? true : false);
    }

    
public int getTotalRows() {
        
return totalRows;
    }

    
public int getPageStartRow() {
        
return pageStartRow;
    }

    
public int getPageRecorders() {
        
return pageRecorders;
    }

    
public void setObjList(List objList) {
        
this.objList = objList;
    }

    
public void setHasPreviousPage(boolean hasPreviousPage) {
        
this.hasPreviousPage = hasPreviousPage;
    }

    
public void setTotalPages(int totalPages) {
        
this.totalPages = totalPages;
    }

    
public void setCurrentPage(int currentPage) {
        
this.currentPage = currentPage;
    }

    
public void setPageEndRow(int pageEndRow) {
        
this.pageEndRow = pageEndRow;
    }

    
public void setHasNextPage(boolean hasNextPage) {
        
this.hasNextPage = hasNextPage;
    }

    
public void setTotalRows(int totalRows) {
        
this.totalRows = totalRows;
    }

    
public void setPageStartRow(int pageStartRow) {
        
this.pageStartRow = pageStartRow;
    }

    
public void setPageRecorders(int pageRecorders) {
        
this.pageRecorders = pageRecorders;
    }

    
public List getObjList() {
        
return objList;
    }
}

在action中负责把pageIndex传给PageBean,以及通过service得到的记录总数传给pageBean就OK了


补充:另,在IDEA中文站上看到一篇文章 
分页,心中的痛?       提到用一个统一的接口来规范:
代码如下:
public interface Page {
boolean isFirstPage();
boolean isLastPage();
boolean hasNextPage();
boolean hasPreviousPage();
int getLastPageNumber();
Object getThisPageElements();
int getTotalNumberOfElements();
int getThisPageFirstElementNumber();
int getThisPageLastElementNumber();
int getNextPageNumber();
int getPreviousPageNumber();
int getPageSize();
int getThisPageNumber ();
}

个人感觉思想挺好,不过我还是喜欢用一个PageBean类就足够了,没必要搞复杂了,在PageBean中其实是currentPage为核心.

一个工具能够在任何地方都能容易的嵌入进去,这就很小巧了,也就够用了.  :)
posted @ 2006-05-08 22:46 Alex 阅读(1192) | 评论 (0)编辑 收藏

注:这个说的挺全面,考虑到了两种情况,一个是超连接,一个是表单

原文是这里


Struts Token 机制可以解决这个问题。

1.   防止通过超链接重复访问 Struts Action

如果我们要防止 A 的默认页面 J 中指向 K 的超链接重复提交数据,按照下列步骤即可:

a.   如果 J 是从 Struts Action 转发而来,我们要在该 Struts Action execute 方法中添加下面的一行:

    saveToken(request);

b.   如果 J 不是从 Struts Action 转发而来,那么新建一个 Struts Action ,在该 Struts Action excute 方法中增加上面的一行,然后再从该 action 转到 J 页面。

c.   J 页面中使用 Struts 标签生成指向 K 的超链接,如:

   <html:link action="/deleteLayoutAction?layoutId=0" transaction="true" >delete</html:link>

   注意红色字体部分。

d.   <html:link> 标签指向的 action excute 方法中加入下面的代码:

   if (!isTokenValid(request)) {

                     return mapping.findForward(" 这种情况下就是重复提交,转到相应的页面 ");

              }

e All Done.

2.   防止通过表单重复提交数据。

a.   如果 J 是从 Struts Action 转发而来,我们要在该 Struts Action execute 方法中添加下面的一行:

    saveToken(request);

b.   如果 J 不是从 Struts Action 转发而来,那么新建一个 Struts Action ,在该 Struts Action excute 方法中增加上面的一行,然后再从该 action 转到 J 页面。

c.   J 页面中表单 Action 属性指向的 Struts action excute 方法中加入下面的代码:

   if (!isTokenValid(request)) {

           saveToken(request);

                     return mapping.findForward(" 这种情况下就是重复提交,转到相应的页面 ");

   saveToken(request);

              }

e All Done.
posted @ 2006-05-08 10:02 Alex 阅读(353) | 评论 (0)编辑 收藏

在新窗口中添加内容到父窗口

代码如下:
父窗口: form.html
<script language="JavaScript">
function addItems() 
{
    
var AWnd=window.open('items.htm','fwId','resizable=yes,scrollbars=yes,width=300,height=400');
    AWnd.focus();

}
function delItems() 
{
  
var sel=document.menu.fwId;
  
for(i=0;i<=sel.options.length;i++)
  {
  
if(sel.options[i]!=null)
    
if(sel.options[i].selected)
    {
      sel.options[i]
=null;
      i
--;
    }
  }
}
</script>

<form method="post" name="menu">

<select name="fwId" size="5" multiple>
</select> 
<input name="item" type="button" onClick="addItems()" value="Ìí¼Ó"> 
<input name="itemDel" type="button" onClick="delItems()" value="ɾ³ý" > 
</form>




新开窗口items.html:

<script language="JavaScript">
function doSubmit(value,name) 
{
      
var aa = window.opener.document;
    
var myop = aa.createElement("OPTION");

    
for(var j = 0; j < aa.menu.fwId.options.length; j++
    {
          
if(value == aa.menu.fwId.options[j].value)
            {
                alert(
"ÒѾ­±»Ñ¡Ôñ£¡");
                
return;
            }
    }
    myop.text 
=name;
    myop.value 
=value;
    aa.menu.fwId.add(myop); 
}
</script>

<form name="items">
    
<a onclick="javascript:doSubmit('1','test1');" href="#">test1</a><br>
    
<a onclick="javascript:doSubmit('2','test2');" href="#">test2</a><br>
</form>

posted @ 2006-05-05 20:37 Alex 阅读(3538) | 评论 (0)编辑 收藏

想用缓存又不想用oscache觉得
麻烦,自己写了个简单的缓存,不小心发现getAllCity结果总是在第一次进去的时候数量加倍,第二次就好了,真实怪事.

代码如下:
public static List getAllCity(boolean bInit) throws XXException {
        List cityList 
= new ArrayList();
        
if (null == CityInfos || CityInfos.size() == 0) bInit = true;
        
synchronized (CityInfos) {
            
if (bInit) { //retrieve city info from database
                CityService service = new CityService();
                cityList 
= service.getAllCitys();
                CityInfos.clear();
                
if (null != cityList && cityList.size() > 0) {
                    log.info(
"========" + "cityList size : " + cityList.size() + "========");
                    
for (Iterator it = cityList.iterator(); it.hasNext();) {
                        CityVo cityVo 
= (CityVo) it.next();
                        CityInfos.put(cityVo.getId(), cityVo);
                    }
                }
            }

            cityList.addAll(CityInfos.values());
        }
        
return cityList;
    }

CityInfos是一个static Hashtable,查了下原来是共用了cityList,将synchronized 里面的cityList 改成
List tmpCityList 就可以了  :)  为什么会犯低级错误呢?  :(
posted @ 2006-03-30 14:18 Alex 阅读(163) | 评论 (0)编辑 收藏

     时间走到了21世纪,一切都那么快,那么忙碌,那么纷繁,java世界的新观点,新技术,恩,还有新框架层出不穷,看的我都累死了,你累么?  :)

     学完servlet学jsp,学完jsp又来了struts,用了Struts又说webwork不赖;刚学会jdbc又来了hibernate,刚对hibernate掌握了点皮毛又来了个无所不能的Spring.看看Springside里包含的技术点,看着也够吓人的,我在想,什么样的项目里会用到这么多的东东呢?你会了我会么,我会了他会么? 也许xp的可能性太小了,一群牛人才能在那xp.

     哦,还有模式,感觉模式就像是ML里的姿势,一会是老汉推车一会是69式,你可能忙的满头是汉,不过对方很可能就没有feeling,也没有high,你是不是感觉很冤? 其实有时候不需要太多的技巧,多一天体贴就够了,那么,你体贴你的客户了么? 反过来说,你的客户在乎你的那些奇淫怪巧么?

     世界正变得越来越复杂,所以我们应该变得越来越简单才对.  这话是哪个牛人说的? 真TMD的经典  反思下,你的思绪变的复杂了还是简单了? 
   
     技术不是上帝,但客户是我们的上帝

     让我们一起想一想,怎么体贴我们的客户? 

     一点牢骚,胡乱说几句,不要拍砖.
posted @ 2006-03-29 16:19 Alex 阅读(513) | 评论 (10)编辑 收藏

keyword: Live Templates XDoclet

在IDEA中要写hibernate标签想不想用自动提示功能?  :)

Come on!
  1. 进入 这里
  2. 把hibernate.xml文本拷到本机
  3. 把hibernate.xml copy 到IDEA的config/templates目录下
  4. 重启IDEA
  5. 进入IDEA的设置里的Erros,找到Unknown javadoc tags,把以下代码copy进来
 
happy吧    :)
posted @ 2006-03-16 00:56 Alex 阅读(849) | 评论 (0)编辑 收藏

喜欢在bloglines里看一些rss,一些想有时间再看的内容就点选" keep new ",时间长了也留了不少了,清理一下,移到这里,算是backup.
  1. Equinox 1.6 发布 [appfuse的轻量级版本实现]

  2. Design Pattern , 应该选哪本书? [Head First Design Patterns]

  3. Simple Persistence for Java 1.1.0 发布 [一个简易的方式持久化数据]
  4. hql语句查询时,根据属性和物理字段混查 [hibernate支持物理字段查询,用别名的时候只能用属性]

  5. 关于Java加密扩展的出口限制 [JAVA_HOME==>lib目录下的local_policy.jar和US_export_policy.jar文件替换调就OK了]

  6. 使用dom4j和XPath xpath对xml的所有操作变得异常的简单和方便,关于XPath的教程可以参照 xpath教程 另外,用oo的方式操作xml可以参考利用XMLBean轻轻松松读写XML感觉前者更适宜普通的配置文件的操作,后者针对大量的xml文件的读写操作,比如相互传递xml文件进行数据交换.

  7. 初识wxPython(环境配置篇) [据说开发GUI是个不错的选择,下载下来看了一下初步感觉不赖]
  8. 使用struts的同步令牌避免form的重复提交

  9. 重温Struts--Validator和Tiles

  10. 本人写的分页的标签,和.net中的datagrid标签相似,只需要设置几个属性就可以实现分页功能了

  11. 比较完整全面的分页

  12. 关于分页设计的一些做法

  13. 扩展的 通用表单验证函数 [提到了普通html中的用法,但是不知道如果在Struts标签中是否不支持]
  14. [原创]JAVA中图片上叠加文字的方法

  15. 自己实现的一个加密算法

  16. 浅谈hibernate性能优化的几点建议

  17. JDBC实现oracle blob 出库入库

posted @ 2006-03-12 03:55 Alex 阅读(454) | 评论 (0)编辑 收藏

keyword: IDEA 开发工具

IDE其实没什么,以前总会有人讨论这个好那个好,最终也没什么定论,各有所好,就像以前总有人喜欢讨论哪个语言如何如何,新手津津乐道,老手感觉无聊。但是我今天还是要提下IDE,我只是把我认为不错的东西分享下,仅此而已。

偶用过的工具不多,曾用过wsad,jbuilder,netbeans和Eclipse也就装过,几乎没用过。用的最多的就数jbuilder了,说实话感觉jbuilder不错,挺方便的,而且支持的东西也比较全,不过也有一些问题,比如有时候莫名其妙的就出现编译不通过,还有一些其他的扩展功能似乎不怎么样。

很早就听说IDEA这个工具,不过身边的人用的不多,一直也没怎么用,装了一个在桌面上这次终于因为是时间充足的缘故或是冲动的缘故就用了下,这一用就丢不开了  :)

好了,下面就请跟随我一起参与这个快乐之旅吧.

第一。IDEA很漂亮
        在它身上你既看到jbuilder的身影,又能感觉到Eclipse的舞姿,还有netbeans的微笑,是不是太夸张了?  :)

第二。优化你的代码.
        你一直在写代码,但是你有过多少机会你的项目经理或者其他xp的人给你提过你的代码建议? 也许你会说我会用checkstyle,但是单独用这个的好像也不多,恩,我的意思是说IDEA里有一个现成的东西,就是那个Analyze下的Inspect Code,你对自己的代码会有很多的发现哦。

第三。jsp页面也可以format。
        用jbuilder的时候对普通java代码的格式化是允许的,但是对于jsp页面则没有这个功能,令我开心的是我在这里碰到了,你的那些乱七八糟的html代码可以一下子旧貌换新颜了,偷着乐吧。

第四。装载Struts插件,支持Struts开发.
        恩,一开始我不敢用IDEA的考虑之一就是没有直接的Struts支持,怕会出问题,不过这个问题现在看来已经不是问题了.
首先请在settting===>Plugins里下载Struts Assistant[IDEA的插件不需要你单独下载,直接在Resource里下载update就可以了],安装好后重启IDEA,会在控制面板出现一个Struts Assistant的button,点击,进行属性设置,设置"Struts distributive",目录指向一个Struts的目录,我是从Apache下的一个1.2的版本,同时支持1.1和1.2,就用这个吧,设置完就OK了。下一步,在IDEA里打开你的struts-config.xml文件,这是IDEA会自动产生一个struts-config.awf文件,有了这个文件后你就可以在左边的struts assistant的panel里看到你的form和action了,以及forward,看起来很简洁。现在你就可以new一个form或者action都可以了,怎么样,一点也不难吧。
另外,在jsp页面里你会发现导入的标签变红了,提示找不到标签,这一点和jbuilder不同,它不能在web.xml里直接发现这个tld文件,还需要在Resource里做一下映射,算是步太聪明,不过也就麻烦一回,do it.

第五。导入你的项目文件到IDEA.
         IDEA支持直接从jbuilder的项目导入,也可以从Eclipse的项目导入,如果没有看到可以从Plugins里找相应的插件,速度也很快。当然,如果你不愿意通过导入的方式这里也介绍另一个适用的办法,在IDEA里直接新建一个工程,然后目录直接指向你的其他项目所在的目录就OK了,然后IDEA会自动发现src目录,在这个的wizard过程中你还可以根据自己的情况进行调整,比如有些目录需要Exclude,有些作为Test.这一切都是可以调整,灵活就在这里。

第六。版本控制。
        IDEA内建支持大多数的版本控制,cvs,svn,perforce,sourcesafe,应该够用了吧。

第七。html文件和javascrip的动态语法支持,偶最喜欢了。
       html的任一个元素你都可以点击鼠标跟进去看到底有哪些东西,javaScrip编辑也相当方便,这在jbuilder里是没有的事情,恩,如果你需要其他的关于javaScrip的功能,去Plugins里看看吧,会有收获的。

        有用IDEA的兄弟不妨一起交流下心得,偶的msn : eclipse.wang@gmail.com

         哎,写说这几点吧,我用的感觉不错,有兴趣的兄弟也尝试一下吧,唱歌半个通宵回来写点东西,天亮了,偶该睡觉了  :) 


         对了,偶没有拿IDEA的好处费在做宣传哦,这年头什么鸟都有,^_^
posted @ 2006-03-05 06:42 Alex 阅读(4636) | 评论 (11)编辑 收藏

keyword: struts错误,持续构建,checkbox

前天在运行应用时有一个页面一点button就转到系统错误页面,折腾了好半天,在Action里打桩调试连调试信息都见不到,还以为时log4j配置出了问题,改来改去也不知道原因在哪,最后检查居然时在Action里用错了Form,哎,真是要命.回忆了一下,以前这个地方一直正常,怎么这次修改了别的地方就影响到这了呢,记忆中好像是因为做了一次重构不小心在批量修改的时候把这里给改了.

现在总结一下Struts里可能常出现的错误的原因:

  1.配置文件里的input或者forward写错
  2.jsp里的Action对应的.do写错,实际就是对应的Form也错了
  3.Action里Form写错,或者forward为空
  4.还有Form里的属性和jsp页面的属性不一致

经过这次的教训也让我有了一个以前不怎么重视的想法要实现,就是持续构建,如果有了持续构建我的每一次的提交都有报告和分析结果出来,防患于未然,也不至于让我折腾半天为了一行代码.
方案就选maven + cc .

目前国内用的多么?没有调查过,不过就我目前了解到的情况,好多公司的做法真是让人觉得有点shit,但愿越来越好,越来越规范.

写到这里又想起一个关于jsp的checkbox问题,例如,在一个产品删除的页面里,每条记录前面有一个checkbox,我们一般的做法是给checkbox的value赋值为产品ID的值,然后Action根据ID就可以直接删除产品了,但是问题是有时候我除了需要删除这个产品,同时还需要在下一个页面里再将当前页面的东西显示一次,让用户确认,就还需要除产品ID以外的信息了,该怎么办呢?  我以前有一个比较笨的办法就是在value里拼数据,
比如id | name | quantity | other,最后在Action里再解析,现在想来其实没有必要,可以用<logic:iterator/>里的indexId属性来做。
具体请参看这里:
这里贴下关键部分的代码:
jsp代码:

<logic:iterate id="testqclist" name="testQCActionForm" property="result" indexId="index" >
<tr bgcolor="#FFFFFF">
<td height="26" bgcolor="#EEEEEE">
<div align= "center" >
<input type="checkbox" name="checkboxVal" value="<%=index%>" ></div>
</td>
</tr>
</logic:iterate>

Action代码: [原文作者写在Form里实现,不过我个人喜欢在Action里做,看你情况了]

if (checkboxVal != null && checkboxVal.length > 0){

      
for (int i = 0; i < checkboxVal.length; i++){

        
int chkVal = Integer.parseInt(checkboxVal[i]); //取得checkbox的index值

        //..........................

        checkform.setSaamsampleid (datesampledVal[chkVal].toString());//取得和checkbox为true的其他属性的值

        checkform.setSaamsampleid(saamsampleidVal[chkVal].toString());

        //......................................................

      }


    }



 

posted @ 2006-03-05 05:58 Alex 阅读(964) | 评论 (0)编辑 收藏

keyword :  Meta  html  header  content
  引言

  您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广
个人网站,人们首先想到的方法无外乎以下几种:
  
  ● 在搜索引擎中登录自己的个人网站
  
  ● 在知名网站加入你个人网站的链接

  ● 在论坛中发帖子宣传你的个人网站

  很多人却忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性,有兴趣吗,谁我来重新认识一下META标签吧!

  META标签是HTML语言HEAD区的一个辅助性标签,它位于HTML文档头部的<HEAD>标记和<TITLE>标记之间,它提供用户不可见的信息。meta标签通常用来为搜索引擎robots定义页面主题,或者是定义用户浏览器上的cookie;它可以用于鉴别作者,设定页面格式,标注内容提要和关键字;还可以设置页面使其可以根据你定义的时间间隔刷新自己,以及设置RASC内容等级,等等。


  详细介绍

  下面介绍一些有关 标记的例子及解释。

  META标签分两大部分:HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME)。


  ★HTTP-EQUIV

  HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容。常用的HTTP-EQUIV类型有:


  1、Content-Type和Content-Language (显示字符集的设定)

  说明:设定页面使用的字符集,用以说明主页制作所使用的文字已经语言,浏览器会根据此来调用相应的字符集显示page内容。

  用法:<Meta http-equiv="Content-Type" Content="text/html; Charset=gb2312">
      <Meta http-equiv="Content-Language" Content="zh-CN">

  注意: 该META标签定义了HTML页面所使用的字符集为GB2132,就是国标汉字码。如果将其中的“charset=GB2312”替换成“BIG5”,则该页面所用的字符集就是繁体中文Big5码。当你浏览一些国外的站点时,IE浏览器会提示你要正确显示该页面需要下载xx语支持。这个功能就是通过读取HTML页面META标签的Content-Type属性而得知需要使用哪种字符集显示该页面的。如果系统里没有装相应的字符集,则IE就提示下载。其他的语言也对应不同的charset,比如日文的字符集是“iso-2022-jp ”,韩文的是“ks_c_5601”。
      
  Content-Type的Content还可以是:text/xml等文档类型;
  Charset选项:ISO-8859-1(英文)、BIG5、UTF-8、SHIFT-Jis、Euc、Koi8-2、us-ascii, x-mac-roman, iso-8859-2, x-mac-ce, iso-2022-jp, x-sjis, x-euc-jp,euc-kr, iso-2022-kr, gb2312, gb_2312-80, x-euc-tw, x-cns11643-1,x-cns11643-2等字符集;Content-Language的Content还可以是:EN、FR等语言代码。

  2、Refresh (刷新)

   说明:让网页多长时间(秒)刷新自己,或在多长时间后让网页自动链接到其它网页。
   用法:<Meta http-equiv="Refresh" Content="30">
      <Meta http-equiv="Refresh" Content="5; Url=http://www.xia8.net">
   注意:其中的5是指停留5秒钟后自动刷新到URL网址。

  3、Expires (期限)

   说明:指定网页在缓存中的过期时间,一旦网页过期,必须到服务器上重新调阅。
   用法:<Meta http-equiv="Expires" Content="0">
      <Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT">
   注意:必须使用GMT的时间格式,或直接设为0(数字表示多少时间后过期)。

  4、Pragma (cach模式)

   说明:禁止浏览器从本地机的缓存中调阅页面内容。
   用法:<Meta http-equiv="Pragma" Content="No-cach">
   注意:网页不保存在缓存中,每次访问都刷新页面。这样设定,访问者将无法脱机浏览。

  5、Set-Cookie (cookie设定)

  说明:浏览器访问某个页面时会将它存在缓存中,下次再次访问时就可从缓存中读取,以提高速度。当你希望访问者每次都刷新你广告的图标,或每次都刷新你的计数器,就要禁用缓存了。通常HTML文件没有必要禁用缓存,对于ASP等页面,就可以使用禁用缓存,因为每次看到的页面都是在服务器动态生成的,缓存就失去意义。如果网页过期,那么存盘的cookie将被删除。
   用法:<Meta http-equiv="Set-Cookie" Content="cookievalue=xxx; expires=Wednesday,
       21-Oct-98 16:14:21 GMT; path=/">
   注意:必须使用GMT的时间格式。

  6、Window-target (显示窗口的设定)

   说明:强制页面在当前窗口以独立页面显示。
   用法:<Meta http-equiv="Widow-target" Content="_top">
   注意:这个属性是用来防止别人在框架里调用你的页面。Content选项:_blank、_top、_self、_parent。

  7、Pics-label (网页RSAC等级评定)
   说明:在IE的Internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级
      别就是通过该参数来设置的。
   用法:<META http-equiv="Pics-label" Contect=
               "(PICS-1.1'http://www.rsac.org/ratingsv01.html'
       I gen comment 'RSACi North America Sever' by 'inet@microsoft.com'
       for 'http://www.microsoft.com' on '1997.06.30T14:21-0500' r(n0 s0 v0 l0))">

   注意:不要将级别设置的太高。RSAC的评估系统提供了一种用来评价Web站点内容的标准。用户可以设置Microsoft Internet Explorer(IE3.0以上)来排除包含有色情和暴力内容的站点。上面这个例子中的HTML取自Microsoft的主页。代码中的(n 0 s 0 v 0 l 0)表示该站点不包含不健康内容。级别的评定是由RSAC,即美国娱乐委员会的评级机构评定的,如果你想进一步了解RSAC评估系统的等级内容,或者你需要评价自己的网站,可以访问RSAC的站点:http://www.rsac.org/。

  8、Page-Enter、Page-Exit (进入与退出)

   说明:这个是页面被载入和调出时的一些特效。
   用法:<Meta http-equiv="Page-Enter" Content="blendTrans(Duration=0.5)">
      <Meta http-equiv="Page-Exit" Content="blendTrans(Duration=0.5)">
   注意:blendTrans是动态滤镜的一种,产生渐隐效果。另一种动态滤镜RevealTrans也可以用于页面进入与退出效果:

      <Meta http-equiv="Page-Enter" Content="revealTrans(duration=x, transition=y)">
      <Meta http-equiv="Page-Exit" Content="revealTrans(duration=x, transition=y)">

       Duration  表示滤镜特效的持续时间(单位:秒)
       Transition 滤镜类型。表示使用哪种特效,取值为0-23。

       0 矩形缩小
       1 矩形扩大
       2 圆形缩小
       3 圆形扩大
       4 下到上刷新
       5 上到下刷新
       6 左到右刷新
       7 右到左刷新
       8 竖百叶窗
       9 横百叶窗
       10 错位横百叶窗
       11 错位竖百叶窗
       12 点扩散
       13 左右到中间刷新
       14 中间到左右刷新
       15 中间到上下
       16 上下到中间
       17 右下到左上
       18 右上到左下
       19 左上到右下
       20 左下到右上
       21 横条
       22 竖条
       23 以上22种随机选择一种

  9、MSThemeCompatible (XP主题)
   说明:是否在IE中关闭 xp 的主题
   用法:<Meta http-equiv="MSThemeCompatible" Content="Yes">
   注意:关闭 xp 的蓝色立体按钮系统显示样式,从而和win2k 很象。

  10、IE6 (页面生成器)
   说明:页面生成器generator,是ie6
   用法:<Meta http-equiv="IE6" Content="Generator">
   注意:用什么东西做的,类似商品出厂厂商。

  11、Content-Script-Type (脚本相关)
   说明:这是近来W3C的规范,指明页面中脚本的类型。
   用法:<Meta http-equiv="Content-Script-Type" Content="text/javascript">
   注意:

  ★NAME变量

  name是描述网页的,对应于Content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。
  name的value值(name="")指定所提供信息的类型。有些值是已经定义好的。例如description(说明)、keyword(关键字)、refresh(刷新)等。还可以指定其他任意值,如:creationdate(创建日期) 、
document ID(文档编号)和level(等级)等。
  name的content指定实际内容。如:如果指定level(等级)为value(值),则Content可能是beginner(初级)、intermediate(中级)、advanced(高级)。


  1、Keywords (关键字)
   说明:为搜索引擎提供的关键字列表
   用法:<Meta name="Keywords" Content="关键词1,关键词2,关键词3,关键词4,……">
   注意:各关键词间用英文逗号“,”隔开。META的通常用处是指定搜索引擎用来提高搜索质量的关键词。当数个META元素提供文档语言从属信息时,搜索引擎会使用lang特性来过滤并通过用户的语言优先参照来显示搜索结果。例如:
      <Meta name="Kyewords" Lang="EN" Content="vacation,greece,sunshine">
      <Meta name="Kyewords" Lang="FR" Content="vacances,grè:ce,soleil">

  2、Description (简介)
   说明:Description用来告诉搜索引擎你的网站主要内容。
   用法:<Meta name="Description" Content="你网页的简述">
   注意:

  3、Robots (机器人向导)
   说明:Robots用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。Content的参数有all、none、index、noindex、follow、nofollow。默认是all。
   用法:<Meta name="Robots" Content="All|None|Index|Noindex|Follow|Nofollow">
   注意:许多搜索引擎都通过放出robot/spider搜索来登录网站,这些robot/spider就要用到meta元素的一些特性来决定怎样登录。

    all:文件将被检索,且页面上的链接可以被查询;
    none:文件将不被检索,且页面上的链接不可以被查询;(和 "noindex, no follow" 起相同作用)
    index:文件将被检索;(让robot/spider登录)
    follow:页面上的链接可以被查询;
    noindex:文件将不被检索,但页面上的链接可以被查询;(不让robot/spider登录)
   nofollow:文件将不被检索,页面上的链接可以被查询。(不让robot/spider顺着此页的连接往下探找)

  4、Author (作者)
   说明:标注网页的作者或制作组
   用法:<Meta name="Author" Content="张三,abc@sina.com">
   注意:Content可以是:你或你的制作组的名字,或Email

  5、Copyright (版权)
   说明:标注版权
   用法:<Meta name="Copyright" Content="本页版权归Zerospace所有。All Rights Reserved">
   注意:

  6、Generator (编辑器)
   说明:编辑器的说明
   用法:<Meta name="Generator" Content="PCDATA|FrontPage|">
   注意:Content="你所用编辑器"

  7、revisit-after (重访)
   说明:
   用法:<META name="revisit-after" CONTENT="7 days" >
   注意:

  ★Head中的其它一些用法


  1、scheme (方案)
   说明:scheme can be used when name is used to specify how the value of content should
      be interpreted.
   用法:<meta scheme="ISBN" name="identifier" content="0-14-043205-1" />
   注意:

  2、Link (链接)
   说明:链接到文件
   用法:<Link href="soim.ico" rel="Shortcut Icon">
   注意:很多网站如果你把她保存在收件夹中后,会发现它连带着一个小图标,如果再次点击进入之后还会发现地址栏中也有个小图标。现在只要在你的页头加上这段话,就能轻松实现这一功能。<LINK> 用来将目前文件与其它 URL 作连结,但不会有连结按钮,用於 <HEAD> 标记间, 格式如下:
       <link href="URL" rel="relationship">
       <link href="URL" rev="relationship">

  3、Base (基链接)
   说明:插入网页基链接属性
   用法:<Base href="http://www.xia8.net/" target="_blank">
   注意:你网页上的所有相对路径在链接时都将在前面加上“http://www.cn8cn.com/”。其中target="_blank"是链接文件在新的窗口中打开,你可以做其他设置。将“_blank”改为“_parent”是链接文件将在当前窗口的父级窗口中打开;改为“_self”链接文件在当前窗口(帧)中打开;改为“_top”链接文件全屏显示。


  以上是META标签的一些基本用法,其中最重要的就是:Keywords和Description的设定。为什么呢?道理很简单,这两个语句可以让搜索引擎能准确的发现你,吸引更多的人访问你的站点!根据现在流行搜索引擎(Google,Lycos,AltaVista等)的工作原理,搜索引擎先派机器人自动在WWW上搜索,当发现新的网站时,便于检索页面中的Keywords和Description,并将其加入到自己的数据库,然后再根据关键词的密度将网站排序。

  由此看来,我们必须记住添加Keywords和Description的META标签,并尽可能写好关键字和简介。否则,
后果就会是:
  
  ● 如果你的页面中根本没有Keywords和Description的META标签,那么机器人是无法将你的站点加入数
    据库,网友也就不可能搜索到你的站点。

  ● 如果你的关键字选的不好,关键字的密度不高,被排列在几十甚至几百万个站点的后面被点击的可
    能性也是非常小的。

  写好Keywords(关键字)要注意以下几点:


  ● 不要用常见词汇。例如www、homepage、net、web等。

  ● 不要用形容词,副词。例如最好的,最大的等。

  ● 不要用笼统的词汇,要尽量精确。例如“爱立信手机”,改用“T28SC”会更好。


  “三人之行,必有我师”,寻找合适关键词的技巧是:到Google、Lycos、Alta等著名搜索引擎,搜索与
你的网站内容相仿的网站,查看排名前十位的网站的META关键字,将它们用在你的网站上,效果可想而知了。

  ★小窍门

  为了提高搜索点击率,这里还有一些“捷径”可以帮得到你:

  ● 为了增加关键词的密度,将关键字隐藏在页面里(将文字颜色定义成与背景颜色一样)。

  ● 在图像的ALT注释语句中加入关键字。如:<IMG SRC="xxx.gif" Alt="Keywords">

  ● 利用HTML的注释语句,在页面代码里加入大量关键字。用法: <!-- 这里插入关键字 -->


<head>
  <title>文件头,显示在浏览器标题区</title>
  <meta http-equiv="Content-Language" content="zh-cn">
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
  <meta name="ProgId" content="FrontPage.Editor.Document">
  <meta name="制作人" content="唐蓉生">
  <meta name="主题词" content="HTML 网页制作 课件">
</head>
posted @ 2006-03-02 15:46 Alex 阅读(325) | 评论 (0)编辑 收藏

  1. Java组件VLDocking 2.0.6 新版发布[swing的辅助工具]
  2. 七剑与java开源工具 [Eclipse + cvs + ant + junit + hibernate + spring + struts]
  3. InfoWorld 预测:2006年值得期待的11项创新
  4. Java API文档工具Ashkelon 0.9 发布
  5. 问题跟踪管理工具JIRA 3.5 发布
  6. JAVA操作Excel的方法
  7. Jetspeed介绍


posted @ 2006-02-26 00:35 Alex 阅读(165) | 评论 (0)编辑 收藏

     摘要: keyword:分页 缓存 eXtremeTable oscache 引子:这几天在弄一个关于页面的分页,查了一下网上的资料,大都不合要求,要么就是说怎么在数据库这个层面上如何实现,晕,有了hibernate我用那么费劲翻身么.看到一个用的比较多的方案是做了一个Page工具类,实现诸如getBooks(),getNextPage(),看了一下底层实现居然是"select * from book",...  阅读全文
posted @ 2006-02-25 21:26 Alex 阅读(2675) | 评论 (6)编辑 收藏

     摘要: keyword: 配置 Tomcat配置 MySql配置 server.conf my.ini 启动参数 虚拟机参数 jsp预编译 Author: Alex发布环境: Tomcat5 + MySql4 +Hibernate + Win2003 一.MySql配置文件 my.ini文件配置Code highlighting produced by Actipro CodeHighlighte...  阅读全文
posted @ 2006-02-24 12:52 Alex 阅读(2491) | 评论 (4)编辑 收藏

keyword:MySql字段,Hibernate session

一.MySql字段敏感

这几天怪问题真是不少,这不刚建的一个数据库的表用MiddleGen批量生成hbm.xml文件居然和数据库的数据类型不一致.
MySql建表语句如下:
drop table if exists book;

/*==============================================================*/
/* Table: book                                                  */
/*==============================================================*/
create table book
(
   id                             
int                            not null,
   name                           
varchar(100),
   author                         
varchar(100),
   date                           date,
   price                          
int,
   
primary key (id)
)
comment
="Book table"
type 
= InnoDB;

生成的hbm.xml文件如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" 
>
    
<hibernate-mapping>
<!-- 
    Created by the Middlegen Hibernate plugin 2.1

    http://boss.bekk.no/boss/middlegen/
    http://www.hibernate.org/
-->

<class 
    
name="net.foxlog.prj.Book" 
    table
="book"
>
    
<meta attribute="class-description" inherit="false">
       @hibernate.class
        table="book"
    
</meta>

    
<id
        
name="id"
        type
="java.lang.Long"
        column
="id"
    
>
        
<meta attribute="field-description">
           @hibernate.id
            generator-class="assigned"
            type="java.lang.Long"
            column="id"


        
</meta>
        
<generator class="assigned" />
    
</id>

    
<property
        
name="name"
        type
="java.lang.String"
        column
="name"
        length
="100"
    
>
        
<meta attribute="field-description">
           @hibernate.property
            column="name"
            length="100"
        
</meta>    
    
</property>
    
<property
        
name="author"
        type
="java.lang.String"
        column
="author"
        length
="100"
    
>
        
<meta attribute="field-description">
           @hibernate.property
            column="author"
            length="100"
        
</meta>    
    
</property>
    
<property
        
name="date"
        type
="java.sql.Date"
        column
="date"
        length
="10"
    
>
        
<meta attribute="field-description">
           @hibernate.property
            column="date"
            length="10"
        
</meta>    
    
</property>
    
<property
        
name="price"
        type
="java.lang.String"
        column
="price"
        length
="10"
    
>
        
<meta attribute="field-description">
           @hibernate.property
            column="price"
            length="10"
        
</meta>    
    
</property>

    
<!-- Associations -->
  

</class>
</hibernate-mapping>

注意到没有,id的类型变成了Long型了,而price居然变成了String了,晕啊.

各位碰到过这个问题么?

最后还是找到问题所在了,实际上是建表有问题,问题就出在字段的名称上,把id改为ID,price改为PRICE就没问题了!  MySql对id和price敏感? 不得而知,目前看来好像是这样.只是提醒我以后建表养成一个习惯,都用大写的就没问题了.
没想到一次测试中随便建的一个表发现了这么个有趣的事情  :)

二.Hibernate的session关闭问题
用hibernate的工具类获得session有没有碰到过session is closed的错误提示? 我又幸运的碰到这个问题了,呵呵,我怎么有那么多问题啊,晕了,我看来是问题先生了,我的一个同事上次也跟我说过这个事情,后来他没有正面解决这个,绕过去了,他用Spring去替自己解决了,呵呵,也够狠的.不过问题实际上是获得session的时候需要增加一个判断. 即 session.isOpen() == false;
 
DBUtil.java代码如下:
/**
     * 返回一个可用的数据库Session连接
     * 
@return Hibernate中对数据库的Session连接
     * 
@throws HibernateException
     
*/
    
public static Session currentSession() throws HibernateException
    {
        Session s 
= (Session) session.get();
        
// Open a new Session, if this Thread has none yet
        if (null==|| s.isOpen()==false)//注意这里
        {
            s 
= sessionFactory.openSession();
            session.set(s);
        }
        
return s;
    }


posted @ 2006-02-24 00:25 Alex 阅读(1373) | 评论 (0)编辑 收藏

仅列出标题
共15页: First 上一页 7 8 9 10 11 12 13 14 15 下一页