今天看见的一个日期控件,感觉很强大。与大家共享。
演示地址 http://www.my97.net/dp/demo/


posted @ 2008-09-04 15:03 勒紧皮带向前冲 阅读(353) | 评论 (0)编辑 收藏
 
Iterate主要用来处理在页面上输出集合类,集合一般来说是下列之一:
1、 java对象的数组

2、 ArrayList、Vector、HashMap等

具体用法请参考struts文档,这里不作详细介绍

现在定义一个class,User.java 把它编译成User.class

package example;

import java.io.Serializable;
public final class User implements Serializable {
private String name = null;
private String password = null;

public String getName () {
return (this.name);
}

public void setName(String name) {
this.name = name;
}

public String getPassword () {
return (this. password);
}

public void setPassword (String password) {
this. password = password;
}

}

然后在一个struts webapplication中创建一个jsp,例如iterate.jsp

<%@ page language=”java” %>
<%@ page import=”example.*%>
<%@ taglib uri=/WEB-INF/struts-bean.tld” prefix=”bean” %>
<%@ taglib uri=/WEB-INF/struts-logic.tld” prefix=”logic” %>

<%
java.util.ArrayList list 
= new java.util.ArrayList();
User usera
=new User();
usera.setName(”white”);
usera.setPassword(”abcd”);
list.add(usera);
User userb
=new User();
userb.setName(”mary”);
userb.setPassword(”hijk”);
list.add(userb);
session.setAttribute(”list”, list);

%>

<html><body><table width=”100%”>

<logic:iterate id=”a” name=”list” type=” example.User “>

<tr><td width=”50%”>

name: 
<bean:write name=”a” property=”name”/>

<td/><td width=”50%”>

password: 
<bean:write name=”a” property=”password”/>

</td></tr>

</logic:iterate>

</table></body></html>
将User.class, iterate.jsp放到相应的目录,运行iterate.jsp你就可以看到iterate的效果了

iterate标记
id 脚本变量的名称,它保存着集合中当前元素的句柄。
name 代表了你需要叠代的集合,来自session或者request的属性。
type 是其中的集合类元素的类型

bean的write标记是用来将属性输出的,name用来匹配iterate的id,property用来匹配相应类的属性

<logic:iterate>用法详解2

2007-04-04 20:34

<login:iterate>标记用于在页面中创建一个循环,以此来遍历如数组、Collection、Map这样的对象。该标记的功能强大,在Struts应用的页面中经常使用到。
1、对数组进行循环遍历
使用
<logic:iterate>标记可以用于遍历数组,以下是一段示例代码:

 

程序代码 程序代码

<%
String[] testArray={”str1″,”str2″,”str3″};
pageContext.setAttribute(”test”,testArray);
%>
<logic:iterate id=”show” name=”test”>
<bean:write name=”show”/>
</logic:iterate>
在上面的代码中,首先定义了一个字符串数组,并为其初始化。接着,将该数组存入pageContext对象中,命名为test1。然后使用
<logic:iterate>标记的name属性指定了该数组,并使用id来引用它,同时使用<bean:write>标记来将其显示出来。其结果为:
str1
str2
str3

另外,还可以通过length属性来指定输出元素的个数。如下面的代码:

 

程序代码 程序代码

<logic:iterate id=”show” name=”test” length=”2″ offset=”1″>
<bean:write name=”show”/>
</logic:iterate>
其中length属性指定了输出元素的个数,offset属性指定了从第几个元素开始输出,如此处为1,则表示从第二个元素开始输出。所以该代码的运行结果应当输出:
str2
str3

另外,该标记还有一个indexId属性,它指定一个变量存放当前集合中正被访问的元素的序号,如:

 

程序代码 程序代码

<logic:iterate id=”show” name=”test” length=”2″ offset=”1″ indexId=”number”>
<bean:write name=”number”/>:<bean:write name=”show”/>
</logic:iterate>
其显示结果为:
1:str2
2:str3

2、对HashMap进行循环遍历

 

程序代码 程序代码

<%
HashMap countries
=new HashMap();
countries.put(”country1″,”中国”);
countries.put(”country2″,”美国”);
countries.put(”country3″,”英国”);
countries.put(”country4″,”法国”);
countries.put(”country5″,”德国”);
pageContext.setAttribute(”countries”,countries);
%>
<logic:iterate id=”country” name=”countries”>
<bean:write name=”country” property=”key”/>:
<bean:write name=”country” property=”value”/>
</logic:iterate>
在bean:write中通过property的key和value分别获得HaspMap对象的键和值。其显示结果为:
country5:德国
country3:英国
country2:美国
country4:法国
country1:中国
由结果可看出,它并未按添加的顺序将其显示出来。这是因为HaspMap是无序存放的。

3、嵌套遍历

 

程序代码 程序代码

<%
String[] colors={”red”,”green”,”blue”};
String[] countries1={”中国”,”美国”,”法国”};
String[] persons={”乔丹”,”布什”,”克林顿”};
ArrayList list2
=new ArrayList();
list2.add(colors);
list2.add(countries1);
list2.add(persons);
pageContext.setAttribute(”list2″,list2);
%>
<logic:iterate id=”first” name=”list2″ indexId=”numberfirst”>
<bean:write name=”numberfirst”/>
<logic:iterate id=”second” name=”first”>
<bean:write name=”second”/>
</logic:iterate>
<br>
</logic:iterate>
运行效果:
0 red green blue
1 中国 美国 法国
2 乔丹 布什 克林顿


<logic:iterate id="myBean" indexId="ind" name="循环JavaBean的对象名称">

<bean:write name="myBean" property="Bean的属性">

  <!--循环Map-->
   <logic:iterate id="myHashMap" indexId="mapInd" name="myBean" property="hashMap名称">
         <!--输出hashMap的键,不需要可以不用这行-->
         <bean:write name="myHashMap" property="key">

         <!--输出hashMap的值,如果值是个数组或者又一个MAP你可以再对他循环-->
         <bean:write name="myHashMap" property="value">
   </logic:iterate>

<logic:iterate>



转自 听雪楼 http://www.tingxuelou.com/index.php/archives/517

posted @ 2008-09-02 16:44 勒紧皮带向前冲 阅读(169) | 评论 (0)编辑 收藏
 
在单一的服务器上执行WEB应用程序有一些重大的问题,当网站成功建成并开始接受大量请求时,单一服务器终究无法满足需要处理的负荷量,所以就有点显得有点力不从心了。另外一个常见的问题是会产生单点故障,如果该服务器坏掉,那么网站就立刻无法运作了。不论是因为要有较佳的扩充性还是容错能力,我们都会想在一台以上的服务器计算机上执行WEB应用程序。所以,这时候我们就需要用到集群这一门技术了。

         在进入集群系统架构探讨之前,先定义一些专门术语:
1. 集群(Cluster):是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。 
2. 负载均衡(Load Balance):先得从集群讲起,集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机。如一个提供Web服务的集群,对外界来看是一个大Web服务器。不过集群的节点也可以单独提供服务。
3. 特点:在现有网络结构之上,负载均衡提供了一种廉价有效的方法扩展服务器带宽和增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。集群系统(Cluster)主要解决下面几个问题: 
高可靠性(HA):利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。
高性能计算(HP):即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,比如基因分析,化学分析等。 
负载平衡:即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。

目前比较常用的负载均衡技术主要有: 
1. 基于DNS的负载均衡 
通过DNS服务中的随机名字解析来实现负载均衡,在DNS服务器中,可以为多个不同的地址配置同一个名字,而最终查询这个名字的客户机将在解析这个名字时得到其中一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址,他们也就访问不同地址上的Web服务器,从而达到负载均衡的目的。 

2. 反向代理负载均衡 (如Apache+JK2+Tomcat这种组合)
使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用它访问内部Web服务器,因此也被称为反向代理模式。

3. 基于NAT(Network Address Translation)的负载均衡技术 (如Linux Virtual Server,简称LVS)
网络地址转换为在内部地址和外部地址之间进行转换,以便具备内部地址的计算机能访问外部网络,而当外部网络中的计算机访问地址转换网关拥有的某一外部地址时,地址转换网关能将其转发到一个映射的内部地址上。因此如果地址转换网关能将每个连接均匀转换为不同的内部服务器地址,此后外部网络中的计算机就各自与自己转换得到的地址上服务器进行通信,从而达到负载分担的目的。

介绍完上面的集群技术之后,下面就基于Tomcat的集群架构方案进行说明:

上面是采用了Apache httpd作为web服务器的,即作为Tomcat的前端处理器,根据具体情况而定,有些情况下是不需要Apache httpd作为 web 服务器的,如系统展现没有静态页面那就不需要Apache httpd,那时可以直接使用Tomcat作为web 服务器来使用。使用Apache httpd主要是它在处理静态页面方面的能力比Tomcat强多了。
1、 用户的网页浏览器做完本地 DNS和企业授权的DNS之的请求/响应后,这时候企业授权的DNS(即21cn BOSS DNS)会给用户本地的DNS服务器提供一个NAT请求分配器(即网关)IP。


2、 NAT分配器,它会根据特定的分配算法,来决定要将连接交给哪一台内部 Apache httpd来处理请求。大多数的NAT请求分配器提供了容错能力:根据侦测各种WEB服务器的失效状况,停止将请求分配给已经宕掉的服务器。并且有些分配器还可以监测到WEB服务器机器的负载情况,并将请求分配给负载最轻的服务器等等。Linux Virtual Server是一个基于Linux操作系统上执行的VS-NAT开源软件套件,而且它有丰富的功能和良好的说明文件。商业硬件解决方案 Foundry Networks的ServerIron是目前业界公认最佳的请求分配器之一。


3、 Apache httpd + Mod_JK2在这里是作为负载均衡器,那为什么要做集群呢?如果集群系统要具备容错能力,以便在任何单一的硬件或软件组件失效时还能100%可用,那么集群系统必须没有单点故障之忧。所以,不能只架设一台有mod_jk2的Apache httpd,因为如果 httpd或mod_jk2失效了,将不会再有请求被会送交到任何一个Tomcat 实例。这种情况下,Apache httpd就是瓶劲,特别在访问量大的网站。


4、 Mod_JK2负载均衡与故障复原,决定把Apache httpd当成web服务器,而且使用mod_jk2将请求传送给Tomcat,则可以使用mod_jk2的负载均衡与容错功能。在集群系统中,带有mod_jk2的Apache httpd可以做的事情包括:
A、 将请求分配至一或多个Tomcat实例上
你可以在mod_jk2的workers.properties文件中,设定许多Tomcat实例,并赋于每个实例一个lb_factor值,以作为请求分配的加权因子。


B、 侦测Tomcat实例是否失败
当Tomcat实例的连接器服务不再响应时,mod_jk2会及时侦测到,并停止将请求送给它。其他的Tomcat实例则会接受失效实例的负载。


C、 侦测Tomcat实例在失效后的何时恢复
因连接器服务失效,而停止将请求分配给Tomcat实例之后,mod_jk2会周期性地检查是否已恢复使用性,并自动将其加入现行的Tomcat实例池中。


5、 Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制。这里提示一下就是,对每个请求的处理,Tomcat都会进行会话复制,复制后的会话将会慢慢变得庞大。


6、 Mod_jk2同时支持会话亲和和会话复制。在tomcat 5中如何实现会话亲和和会话复制?把server.xml中的
<cluster/>标签去掉就实现会话亲和,把<cluster/>标签加上就实现会话复制。


7、 会话亲和:就是表示来自同会话的所有请求都由相同的Tomcat 实例来处理,这种情况下,如果Tomcat实例或所执行的服务器机器失效,也会丧失Servlet的会话数据。即使在集群系统中执行更多的Tomcat实例,也永远不会复制会话数据。这样是提高集群性能的一种方案,但不具备有容错能力了。


8、 使用会话复制,则当一个Tomcat实例宕掉时,由于至少还有另一个Tomcat实例保有一份会话状态数据,因而数据不会丧失。但性能会有所降低。 
posted @ 2008-08-26 16:53 勒紧皮带向前冲 阅读(162) | 评论 (0)编辑 收藏
 
转自 http://www.blogjava.net/SteelHand/archive/2005/07/01/6974.html

第3.10式. 过滤文本输入
问题

你想要渲染包含HTML标记的数据,并且希望该数据被浏览器当作HTML标记解释和处理。
动作要

很简单,可以使用:
<bean:write name="myForm" property="freeText" filtered="false"/>

 

在使用JSTL时,你也可以使用未过滤的值:
<c:out value="${myForm.freeText}" escapeXml="false"/>

 
动作变化

在你使用Struts bean:write 标签来产生文本时,默认情况下任何对HTML处理敏感的字符都要被它们的对等实体代替。例如,大于号字符(>) 将被替代为
&gt;字符实体。这种特征称为是响应过滤( response filtering),默认情况下是激活的。在大多数情况下,过滤正是希望的行为,因为未经过滤的文本可能被浏览器误解释。Table 3-4 列出了被bean:write标签过滤的字符和它们的对应实体。
Table 3-4. 被过滤的字符

字符名称
    

字符值
    

替代实体

大于
    

< 
    

&lt
;

小于
    

> 
    

&gt;

&符号
    

&
    

&amp;

双引号
    

"
    

&quot;

反斜杠
    

\
    

'

 

但是有时候,你希望被渲染的文本中包括HTML 标签。假设你有一个在线日志应用,允许用户输入将要显示在一个页面中的文本。允许使用HTML 标签将使得用户可以那些可以格式化文本的标记。文本中可能包含超链接,不同的字体,以及图像等等。在其他情形下,你的应用可能可能还会从其他来源,比如另一个URL,一个XML文件,一个Web Service或者数据库中,获得HTML模板文本。

通过将bean:write标签的filtered属性设置为false,你就可以告诉Struts标签不要使用相应的实体替换 tag not to 特殊字符。首先,我们来看一下过滤是如何工作的。假设一个用户在表单中输入了下面的文本:
Apache Struts Web Framework 
<b>rocks</b>!

 

现在这个文本将被bean:write标签来渲染显示。当filtered 属性设施为true时,特殊字符将被其对等物替换,这样文本看起来就会是:
Apache Struts Web Framework 
&lt;b&gt;rocks&lt;/b&gt;!

这很有可能不是用户所想要的。他想要的是"Apache Struts Web Framework rocks!"。但是,因为意图是想要允许用户输入装饰文本的HTML标签,那么将filtered属性设置为false 就会得到正确的渲染:
Apache Struts Web Framework 
<b>rocks</b>!

 

浏览器将认识这个标签,并且按其所愿正确的应用HTML 标记。

这在渲染一个Web页面时式一个有用的机制。但是,在使用这个方法时必须足够小心。如果数据是没有过滤的,那么就可能会危及渲染后的 HTML页面的布局,整个页面可能会看起来遭到破坏。例如,假定下面的文本被输入:
Apache Struts Web Framework 
<b>rocks<b>!

 

咋看起来,这没什么问题。但是,注意到b元素的后面一个关闭标签的斜杠缺失了。这个错误很容易发生,而且这可能会使得页面中后面的所有文本都是粗体。

不幸的是,要避免这类错误是很困难的。最好还是试图确保输入的数据都是正确有效的HTML。还有个选择就是通过XML 解析器来处理输出。它会检测诸如标记不匹配之类的问题。你还可以通过一些能够试图纠正问题的解析器来完成,比如Jtidy。最后,如果数据是来自于非受控的来源,你可以选择完全不允许HTML。如果你还想使用一些文本装饰功能的话,还可以考虑使用WikiText 或者UBB Code之类的格式表示来替代。
相关动作

JTidy 提供了一个命令行接口和Java API 来解析和整理HTML。关于JTidy 的细节请访问http://jtidy.sourceforge.net。

UBBCode 是PHP本身支持的一种标记格式。也可以在Java中处理UBBCode。一个解析UBBCode 的PHP函数,有人在Java中重写了,地址可见:http://www.firegemsoftware.com/other/tutorials/ubb.php.

posted @ 2008-08-26 13:03 勒紧皮带向前冲 阅读(264) | 评论 (0)编辑 收藏
 
 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 2 <HTML>
 3  <HEAD>
 4   <TITLE> New Document </TITLE>
 5   <META NAME="Generator" CONTENT="EditPlus">
 6   <META NAME="Author" CONTENT="">
 7   <META NAME="Keywords" CONTENT="">
 8   <META NAME="Description" CONTENT="">
 9   <script>
10     var fileSize=160;
11     var fileType="jpg,gif,bmp,png";
12     var bool=false;   //0代表上传的类型不对,1代表上传的类型正确
13     var str="";
14     function checkform(){
15        str=document.getElementById("photo").value.toLowerCase();
16        var ext=str.split(".");
17        var type=fileType.split(",");
18        for(var i=0;i<type.length;i++){
19          alert(ext[1]+","+type[i]);
20          if(ext[1]==type[i]){
21             bool=true;
22             alert(bool);
23          }
24        }
25       if(bool){
26          var boolSize=checkSize(str);
27          alert(boolSize);
28          if(boolSize){
29           alert("上传成功");
30          }else{
31           alert("你上传的图片太大,不能超过"+fileSize+"KB");
32          }
33        }else{
34            bool=false;
35             alert("你上传的类型不是"+type+"中的一种");
36        }
37     }
38     function checkSize(fileName){
39       var img=new Image();
40         img.src=str;
41         fsize=img.fileSize/1024;
42         fsize=fsize.toFixed(1);
43        if(img.readyState!="complete"){
44          bool=false;
45          return false;
46        }else{
47          alert(fsize+","+fileSize);
48          if(fsize>fileSize){
49              bool=false;
50             return false;
51          }else{
52           bool=false;
53           return true;
54          }
55         }
56     }
57   </script>
58  </HEAD>
59 
60  <BODY>
61 <form   name= "form1 "   action= " "> 
62 照片: <input  type="file"  name= "photo" id="photo" value= " "   onchange= "checkform();"> 
63 </form> 
64  </BODY>
65 </HTML>
66 
posted @ 2008-08-25 11:35 勒紧皮带向前冲 阅读(411) | 评论 (0)编辑 收藏
 
1function CheckFile(f,p)
 
2{
 
3//判断图片尺寸
 4var img=null;
 5img
=document.createElement("img");
 6document.body.insertAdjacentElement(
"beforeend",img);
 7img.style.visibility
="hidden"
 8img.src
=f;
 9
var imgwidth=img.offsetWidth;
10
var imgheight=img.offsetHeight;
11
if(p.name=="UpFile_Photo1")
12{
13
if(imgwidth!=68||imgheight!=68)
14{
15alert(
"小图的尺寸应该是68x68");
16}
17}
18
if(p.name=="UpFile_Photo2")
19{
20
if(imgwidth!=257||imgheight!=351)
21{
22alert(
"中图的尺寸应该是257x351");
23}
24}
25
if(p.name=="UpFile_Photo3")
26{
27
if(imgwidth!=800||imgheight!=800)
28{
29alert(
"大图的尺寸应该是800x800");
30}
31}
32//判断图片类型
33if(!/\.(gif|jpg|jpeg|bmp)$/.test(f))
34{
35alert(
"图片类型必须是.gif,jpeg,jpg,bmp中的一种")
36
return false;
37}
38
return true;
39}


1<input type="file" id="UpFile_Photo1" runat="server" name="UpFile_Photo1" 
2size
="35" onpropertychange="CheckFile(this.value,this)">小图<br />
3
<input type="file" id="UpFile_Photo2" runat="server" name="UpFile_Photo2" 
4size
="35" onpropertychange="CheckFile(this.value,this)">中图<br />
5
<input type="file" id="UpFile_Photo3" runat="server" name="UpFile_Photo3" 
6size
="35" onpropertychange="CheckFile(this.value,this)">大图<br />


转自  http://www.cnblogs.com/lixx/archive/2008/06/12/1218599.html
posted @ 2008-08-25 11:04 勒紧皮带向前冲 阅读(216) | 评论 (0)编辑 收藏
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=??????">
<script language="javascript">
<!--
function imgSel()
{
var img = new Image();
img.src = document.imageForm.file.value;
document.imageForm.width.value = img.width;
document.imageForm.height.value = img.height;
document.imageForm.size.value = img.fileSize;
document.images['image'].src = img.src;
}
-->
</script>
</head>
<body>
<form name="imageForm">
宽: <input name="width" type="text" size="6"> 高: <input name="height" type="text" size="6"> 大小: <input name="size" type="text" size="6"><br>
<input name="file" type="file" onChange="imgSel()"><br>
<img src="" name="image">
</form>
</body>
</html>

转自 http://info.codepub.com/2006/10/info-7912.html
posted @ 2008-08-25 10:47 勒紧皮带向前冲 阅读(1115) | 评论 (0)编辑 收藏
 
转自    http://www.gold98.net/blog/article.asp?id=125
不能删除包含主键的行,该主键被用做另一个表的外键

Error: orA-02292: integrity constraint <constraint name> violated - child record found 
Cause: You tried to Delete a record from a parent table (as referenced by a foreign key), but a record in the child table exists. 
Action: The options to resolve this oracle error are: 
This error commonly occurs when you have a parent-child relationship established between two tables through a foreign key. You then have tried to delete a value into the parent table, but the corresponding value exists in the child table. 
To correct this problem, you need to update or delete the value into the child table first and then you can delete the corresponding value into the parent table.



For example, if you had created the following foreign key (parent-child relationship).

Create TABLE supplier 
( supplier_id numeric(10) not null, 
 supplier_name varchar2(50) not null, 
 contact_name varchar2(50),  
 CONSTRAINT supplier_pk PRIMARY KEY (supplier_id) 
); 

Create TABLE products 
( product_id numeric(10) not null, 
 supplier_id numeric(10) not null, 
 CONSTRAINT fk_supplier 
   FOREIGN KEY (supplier_id) 
   REFERENCES supplier (supplier_id) 
); 



Then you try inserting into the products table as follows:

Insert INTO supplier
(supplier_id, supplier_name, contact_name)
VALUES (1000, 'Microsoft', 'Bill Gates');

Insert INTO products
(product_id, supplier_id)
VALUES (50000, 1000);



Then you tried to delete the record from the supplier table as follows:

Delete from supplier
Where supplier_id = 1000;



You would receive the following error message:




Since the supplier_id value of 100 exists in the products,  you need to first delete the record from the products table as follows:

Delete from products
Where supplier_id = 1000;

Then you can delete from the supplier table:

Delete from supplier
Where supplier_id = 1000;


不能删除包含主键的行,该主键被用做另一个表的外键

完整性约束错误

如果你尝试删除一条记录,该记录中的值依赖一个完整性约束,一个错误被返回。

某例子试图从DEPARTMENTS表中删除部门号60,但执行该语句将返回一个错误,因为部门号在EMPLOYEES表中被用做外键。如果你试图删除的父记录有子记录,那么,你将收到child record found violation orA-02292。
下面的语句可以正常工作,因为在部门70中没有雇员:
Delete FROM departments
Where department_id = 70;
1 row deleted.

注释

如果使用了引用完整性约束,当你试图删除一行时,你可能收到一个Oracle服务器错误信息。但是,如果引用完整性约束包含了ON Delete CASCADE选项,那么,可以删除行,并且所有相关的子表记录都被删除。


posted @ 2008-08-20 11:51 勒紧皮带向前冲 阅读(2321) | 评论 (0)编辑 收藏
 
这段时间老总要我修改公司原先的人做的项目,是采用spring+struts+hibernate+ajax做得,要求将数据库改为oracle(以前的是mysql)。我对hibernate,无赖老总要求,只得边学边改。通过使用myeclipse来生成的映射文件,能按照数据库表来生成映射文件。但这样生成的映射文件确保一定能用。
如,有以下映射文件
<hibernate-mapping>
    
<class name="com.hibernate.temp.News" table="NEWS" schema="PIRATESTUDIO">
        
<id name="id" type="java.lang.Long">
            
<column name="ID" precision="10" scale="0" />
            
<generator class="assigned" />
        
</id>
        
<property name="NType" type="java.lang.String">
            
<column name="N_TYPE" length="10" not-null="true" />
        
</property>
        
<property name="NTitle" type="java.lang.String">
            
<column name="N_TITLE" length="50" not-null="true" />
        
</property>
        
<property name="NContent" type="java.lang.String">
            
<column name="N_CONTENT" not-null="true" />
        
</property>
        
<property name="NIp" type="java.lang.String">
            
<column name="N_IP" length="20" not-null="true" />
        
</property>
        
<property name="NTime" type="java.util.Date">
            
<column name="N_TIME" length="7" not-null="true" />
        
</property>
        
<property name="NRRate" type="java.lang.Long">
            
<column name="N_R_RATE" precision="10" scale="0" not-null="true" />
        
</property>
        
<property name="NTypeT" type="java.lang.Long">
            
<column name="N_TYPE_T" precision="10" scale="0" not-null="true" />
        
</property>
        
<property name="NComm" type="java.lang.Long">
            
<column name="N_COMM" precision="10" scale="0" not-null="true" />
        
</property>
        
<property name="NIsedit" type="java.lang.Long">
            
<column name="N_ISEDIT" precision="10" scale="0" not-null="true" />
        
</property>
    
</class>
当我在使用hibernate的getHiberbnateTemplate().getDelete(entity)时,就会报以下错误
javax.servlet.ServletException: org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: com.GameServer.Entity.News.NTitle; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: com.GameServer.Entity.News.xxxx(xxxx是映射未见中的column的name)
这是因为我在映射文件中使用not-null="true" 这使用delete()方法是系统会根据not-null来检查相应的值。而我的entity中只用id是不为null,其余是null。因此报错。
通过这个可以得出,hiberbnate的映射文件最好自己来写,这样才能达到灵活性。

posted @ 2008-08-19 09:54 勒紧皮带向前冲 阅读(1324) | 评论 (0)编辑 收藏
 

Hibernate映射类型分为两种:内置映射类型和客户化映射类型。内置映射类型负责把一些常见的Java类型映射到相应的SQL类型;此外,Hibernate还允许用户实现UserTypeCompositeUserType接口,来灵活地定制客户化映射类型。客户化类型能够把用户定义的Java类型映射到数据库表的相应字段。

 

一、Hibernate的内置映射类型

1Java基本类型的Hibernate映射类型

Hibernate映射类型

Java类型

标准SQL类型

大小和取值范围

integer或者int

int或者java.lang.Integer

INTEGER

4字节

long

long Long

BIGINT

8字节

short

short Short

SMALLINT

2字节

byte

byte Byte

TINYINT

1字节

float

float Float

FLOAT

4字节

double

double Double

DOUBLE

8字节

big_decimal

java.math.BigDecimal

NUMERIC

NUMERIC(8,2)8

character

char Character String

CHAR(1)

定长字符

string

String

VARCHAR

变长字符串

boolean

boolean Boolean

BIT

布尔类型

yes_no

boolean Boolean

CHAR(1) (Y-N)

布尔类型

true_false

boolean Boolean

CHAR(1) (T-F)

布尔类型

 

2Java时间和日期类型的Hibernate映射

映射类型

Java类型

标准SQL类型

描述

date

util.Date或者sql.Date

DATE

YYYY-MM-DD

time

Date    Time

TIME

HH:MM:SS

timestamp

Date   Timestamp

TIMESTAMP

YYYYMMDDHHMMSS

calendar

calendar

TIMESTAMP

YYYYMMDDHHMMSS

calendar_date

calendar

DATE

YYYY-MM-DD

 

3Java大对象类型的Hibernate映射类型

映射类型

Java类型

标准SQL类型

MySQL类型

Oracle类型

binary

byte[]

VARBINARY(BLOB)

BLOB

BLOB

text

String

CLOB

TEXT

CLOB

serializable

Serializable接口任意实现类

VARBINARY(BLOB)

BLOB

BLOB

clob

java.sql.Clob

CLOB

TEXT

CLOB

blob

java.sql.Blob

BLOB

BLOB

BLOB

 

       在程序中通过Hibernate来保存java.sql.Clob或者java.sql.Blob实例时,必须包含两个步骤:

l         在一个数据库事务中先保存一个空的BlobClob实例。

l         接着锁定这条记录,更新上面保存的BlobClob实例,把二进制数据或文本数据写到BlobClob实例中。

 

4JDK自带的个别Java类的Hibernate映射类型(略)

 

5、使用Hibernate内置映射类型

  

二、客户化映射类型(略)

结束!

http://aumy2008.blogbus.com/logs/13732626.html  转自小于

posted @ 2008-08-16 11:35 勒紧皮带向前冲 阅读(6739) | 评论 (0)编辑 收藏
仅列出标题
共14页: First 上一页 6 7 8 9 10 11 12 13 14 下一页