??xml version="1.0" encoding="utf-8" standalone="yes"?> 在Linux上部|Apache James 前提工作Q?/p>
1Q由于Apache James邮g服务需要用?024以下的端口,因此Lroot用户dq行部v?/p>
2Q需要先安装JDK1.5或以上版本,部v前请保(zhn)的JDK环境变量如JAVA_HOME{已l设|好?/p>
3QJames 启动Ӟ其SMTP 服务默认?25 端口启动QPOP3 服务默认?110 端口启动Q?NNTP 服务默认?119 端口启动, L保这些端口未被占用。Linux下查q这些端口是否被占用的命令是Qlsof -i:端口P例如Q?/p>
[root@nhslj-app ~]# lsof -i:25 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sendmail 3268 root 4u IPv4 8650 TCP nhslj-app:smtp (LISTEN) q表C?5端口正在被sendmail服务占用?/p>
关闭SendMail服务Q?/p>
一般RedHat的系l安装时都会默认安装了sendmail邮g服务Q因此在部vApache JamesӞ需要把sendmail关闭。可以通过以下Ҏ(gu)来关闭sendmailQ以防止pȝ重启时又自动启动sendmail服务?/p>
1Q用chkconfig --list sendmail命o查看sendmail的情况: [root@susun177 ~]# chkconfig --list sendmail sendmail 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭 2Q通过chkconfig sendmail off命o来关闭sendmail的启动: [root@susun177 ~]# chkconfig sendmail off 3Q这时再用chkconfig --list sendmail命o可以查看到sendmail的所有启动别都已经关闭了: [root@susun177 ~]# chkconfig --list sendmail sendmail 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭 q样Q即佉K新启动LinuxpȝQsendmail服务也不会自动启动了?/p>
前期工作做完了,接下来就是部|Apache James了?/p>
1Q解压Apache James包(apache-james-2.3.2.tar.gzQ: [root@susun177 local]# tar zxvf apache-james-2.3.2.tar.gz 解压后,会多了一个目录james-2.3.2 2Q进入james-2.3.2/bin目录Q运行run.shQ生成james的配|文件config.xmlQ?/p>
[root@susun177 bin]# sh run.sh run.sh: line 37: /usr/local/james-2.3.2/bin/phoenix.sh: 权限不够 权限不够Q估计是解压后run.sh文g没有赋予执行权限Q,可以执行以下命oQ?/p>
[root@susun177 bin]# chmod +x run.sh phoenix.sh 然后再次q行run.sh命oQ?/p>
[root@susun177 bin]# sh run.sh Using PHOENIX_HOME: /usr/local/james-2.3.2 Using PHOENIX_TMPDIR: /usr/local/james-2.3.2/temp Using JAVA_HOME: /usr/java/jdk1.5.0 Running Phoenix: Phoenix 4.2 James Mail Server 2.3.2 Remote Manager Service started plain:4555 POP3 Service started plain:110 SMTP Service started plain:25 NNTP Service started plain:119 FetchMail Disabled 说明James启动成功?/p>
3Q按Ctrl +
C退出JamesQ编辑config.xml文g。生成的config.xml攄?./james-2.3.2/apps/james/SAR-
INF目录下。关于James的config.xml的修改,|上很多资料Q请自行查阅。在q里Q只写关键的修改Q?/p>
AQ找?lt;servernames autodetect="true" autodetectIP="true"> 设成 autodetect="false" autodetectIP="false" autodetct设ؓtrue会自动侦你的主机名,设成false会用你指定的server name?/p>
autodetectIP设ؓtrue会ؓ你的servername加上ip?/p>
BQ设|servername 默认的为localhostҎ(gu)你的server名字 如king.cnQ? <servername>king.cn</servername> 然后修改Linux的hostsL讄文gQ?/p>
[root@susun177 SAR-INF]# vi /etc/hosts 在打开的文件添加一行,然后保存Q?/p>
192.168.1.177 king.cn king 注意Q第一个ؓIP地址 W二个ؓL域名 W三个ؓL名称 提示Q名字后面应该要加上.com或?cnq样163{邮件服务器才不会拒l的?/p>
CQ注释掉 <mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor> <processor> relay-denied </processor> <notice>550 - Requested action not taken: relaying denied</notice> </mailet> DQ配|DNS ServerQ先通过netstat命o查看dns配置 [root@susun177 SAR-INF]# netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 扑ֈ<dnsserver>Q在<servers>里最前面d一行: <server>192.168.1.0</server> Q?nbsp; 同时讄autodiscover为false?/p>
<dnsserver> <servers> <!--Enter ip address of your DNS server, one IP address per server --> <!-- element. --> <!-- <server>127.0.0.1</server> --> <server>10.168.0.10</server> </servers> <!-- Change autodiscover to false if you would like to turn off autodiscovery --> <!-- and set the DNS servers manually in the <servers> section --> <autodiscover>false</autodiscover> <authoritative>false</authoritative> <!-- Maximum number of entries to maintain in the DNS cache --> <maxcachesize>50000</maxcachesize> </dnsserver> EQ修改James数据库连接字W串Q?/p>
<data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource"> <driver>oracle.jdbc.driver.OracleDriver</driver> <dburl>jdbc:oracle:thin:@192.168.1.17:1521:hello</dburl> <user>hello</user> <password>kitty</password> <keep-alive>select 1 from dual</keep-alive> <testOnBorrow>true</testOnBorrow> <testOnReturn>true</testOnReturn> <max>50</max> </data-source> 以上用的是oracle数据库,如果是其他数据库Q则需要修改ؓ对应的数据库q接驱动Q以及数据库用户信息?/p>
注意Q一定要记得配置<keep-alive>Q该参数的意思是Q在使用q接池的q接之前Q是否需要验证该q接是否有效。之前,我没有设|该参数Q结果L出现收不到邮件的问题?/p>
4Q优化一下James内存Q在../james-2.3.2/bi/phoenix.sh加入Q?/p>
# Set Heap Size 2007-0818,fix OutOfMemory bug while transporting big mail PHOENIX_JVM_OPTS="$PHOENIX_JVM_OPTS -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M" 修改../james-2.3.2/conf/wrapper.conf的jvm配置Q设|初始内?28M,最大内?12M # Initial Java Heap Size (in MB) #wrapper.java.initmemory=16 wrapper.java.initmemory=128 # Maximum Java Heap Size (in MB) #wrapper.java.maxmemory=64 wrapper.java.maxmemory=512 5Q?复制数据库驱动到../james-2.3.2/lib目录下,我用的是oracle数据库,驱动包ؓQojdbc14.jar 6Q重启Apache James服务?/p>
7Q最后,q入邮gpȝ全局理Q将pȝ的域名改Zq的server name?/p>
8Q如无意外一切OK?/p>
]]>
PHP的数据类型{换属于强制{换,允许转换的PHP数据cd有:
•QintQ、(integerQ:转换成整?
•QfloatQ、(doubleQ、(realQ:转换成Q点型
•QstringQ:转换成字W串
•QboolQ、(booleanQ:转换成布?yu)类?
•QarrayQ:转换成数l?
•QobjectQ:转换成对?
PHP数据cd有三U{换方式:
•在要转换的变量之前加上用括号括v来的目标cd
•使用3个具体类型的转换函数Qintval()、floatval()、strval()
•使用通用cd转换函数settype(mixed var,string type)
W一U{换方式: (int) (bool) (float) (string) (array) (object)
1.<?php
2.$num1=3.14;
3.$num2=(int)$num1;
4.var_dump($num1); //输出float(3.14)
5.var_dump($num2); //输出int(3)
6.?>
W二U{换方式: intval() floatval() strval()
1.<?php
2.$str="123.9abc";
3.$int=intval($str); //转换后数|123
4.$float=floatval($str); //转换后数|123.9
5.$str=strval($float); //转换后字W串Q?123.9"
6.?>
W三U{换方式: settype();
1.<?php
2.$num4=12.8;
3.$flg=settype($num4,"int");
4.var_dump($flg); //输出bool(true)
5.var_dump($num4); //输出int(12)
6.?>
<link rel="stylesheet" type="text/css" media="screen" href="css/screen.css" />
<script src="../lib/jquery.js" type="text/javascript"></script>
<script src="../jquery.validate.js" type="text/javascript"></script>
<script type="text/javascript">
$.validator.setDefaults({
submitHandler: function() { alert("submitted!"); }
});
$().ready(function() {
// validate the comment form when it is submitted
$("#commentForm").validate();
// validate signup form on keyup and submit
$("#signupForm").validate({
rules: {
firstname: "required",
lastname: "required",
username: {
required: true,
minlength: 2
},
password: {
required: true,
minlength: 5
},
confirm_password: {
required: true,
minlength: 5,
equalTo: "#password"
},
email: {
required: true,
email: true
},
topic: {
required: "#newsletter:checked",
minlength: 2
},
agree: "required"
},
messages: {
firstname: "Please enter your firstname",
lastname: "Please enter your lastname",
username: {
required: "Please enter a username",
minlength: "Your username must consist of at least 2 characters"
},
password: {
required: "Please provide a password",
minlength: "Your password must be at least 5 characters long"
},
confirm_password: {
required: "Please provide a password",
minlength: "Your password must be at least 5 characters long",
equalTo: "Please enter the same password as above"
},
email: "Please enter a valid email address",
agree: "Please accept our policy"
}
});
// propose username by combining first- and lastname
$("#username").focus(function() {
var firstname = $("#firstname").val();
var lastname = $("#lastname").val();
if(firstname && lastname && !this.value) {
this.value = firstname + "." + lastname;
}
});
//code to hide topic selection, disable for demo
var newsletter = $("#newsletter");
// newsletter topics are optional, hide at first
var inital = newsletter.is(":checked");
var topics = $("#newsletter_topics")[inital ? "removeClass" : "addClass"]("gray");
var topicInputs = topics.find("input").attr("disabled", !inital);
// show when newsletter is checked
newsletter.click(function() {
topics[this.checked ? "removeClass" : "addClass"]("gray");
topicInputs.attr("disabled", !this.checked);
});
});
</script>
<style type="text/css">
#commentForm { width: 500px; }
#commentForm label { width: 250px; }
#commentForm label.error, #commentForm input.submit { margin-left: 253px; }
#signupForm { width: 670px; }
#signupForm label.error {
margin-left: 10px;
width: auto;
display: inline;
}
#newsletter_topics label.error {
display: none;
margin-left: 103px;
}
</style>
</head>
<body>
<h1 id="banner"><a >jQuery Validation Plugin</a> Demo</h1>
<div id="main">
<p>Default submitHandler is set to display an alert into of submitting the form</p>
<form class="cmxform" id="commentForm" method="get" action="">
<fieldset>
<legend>Please provide your name, email address (won't be published) and a comment</legend>
<p>
<label for="cname">Name (required, at least 2 characters)</label>
<input id="cname" name="name" class="required" minlength="2" />
<p>
<label for="cemail">E-Mail (required)</label>
<input id="cemail" name="email" class="required email" />
</p>
<p>
<label for="curl">URL (optional)</label>
<input id="curl" name="url" class="url" value="" />
</p>
<p>
<label for="ccomment">Your comment (required)</label>
<textarea id="ccomment" name="comment" class="required"></textarea>
</p>
<p>
<input class="submit" type="submit" value="Submit"/>
</p>
</fieldset>
</form>
<form class="cmxform" id="signupForm" method="get" action="">
<fieldset>
<legend>Validating a complete form</legend>
<p>
<label for="firstname">Firstname</label>
<input id="firstname" name="firstname" />
</p>
<p>
<label for="lastname">Lastname</label>
<input id="lastname" name="lastname" />
</p>
<p>
<label for="username">Username</label>
<input id="username" name="username" />
</p>
<p>
<label for="password">Password</label>
<input id="password" name="password" type="password" />
</p>
<p>
<label for="confirm_password">Confirm password</label>
<input id="confirm_password" name="confirm_password" type="password" />
</p>
<p>
<label for="email">Email</label>
<input id="email" name="email" />
</p>
<p>
<label for="agree">Please agree to our policy</label>
<input type="checkbox" class="checkbox" id="agree" name="agree" />
</p>
<p>
<label for="newsletter">I'd like to receive the newsletter</label>
<input type="checkbox" class="checkbox" id="newsletter" name="newsletter" />
</p>
<fieldset id="newsletter_topics">
<legend>Topics (select at least two) - note: would be hidden when newsletter isn't selected, but is visible here for the demo</legend>
<label for="topic_marketflash">
<input type="checkbox" id="topic_marketflash" value="marketflash" name="topic" />
Marketflash
</label>
<label for="topic_fuzz">
<input type="checkbox" id="topic_fuzz" value="fuzz" name="topic" />
Latest fuzz
</label>
<label for="topic_digester">
<input type="checkbox" id="topic_digester" value="digester" name="topic" />
Mailing list digester
</label>
<label for="topic" class="error">Please select at least two topics you'd like to receive.</label>
</fieldset>
<p>
<input class="submit" type="submit" value="Submit"/>
</p>
</fieldset>
</form>
<h3>Syntetic examples</h3>
<ul>
<li><a href="errorcontainer-demo.html">Error message containers in action</a></li>
<li><a href="custom-messages-metadata-demo.html">Custom Messages as Metadata</a></li>
<li><a href="radio-checkbox-select-demo.html">Radio and checkbox buttons and selects</a></li>
<li><a href="ajaxSubmit-intergration-demo.html">Integration with Form Plugin (AJAX submit)</a></li>
<li><a href="custom-methods-demo.html">Custom methods and message display.</a></li>
<li><a href="dynamic-totals.html">Dynamic forms</a></li>
<li><a href="themerollered.html">Forms styled with jQuery UI Themeroller</a></li>
</ul>
<h3>Real-world examples</h3>
<ul>
<li><a href="milk/">Remember The Milk signup form</a></li>
<li><a href="marketo/">Marketo signup form</a></li>
<li><a href="multipart/">Buy and Sell a House multipart form</a></li>
<li><a href="captcha/">Remote captcha validation</a></li>
</ul>
<h3>Testsuite</h3>
<ul>
<li><a href="../test/">Validation Testsuite</a></li>
</ul>
</div>
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2623402-1";
urchinTracker();
</script>
</body>
</html>
SecondaryTables
当一个entity class映射C个主表和多个从表Ӟ用SecondaryTables来定义各个从表的属性?
元数据属性说明:
· valueQ?定义一个SecondaryTable数组Q指定每个从表的属性?
@Table(name = "CUSTOMER")
@SecondaryTables( value = {
@SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),
@SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })
public class Customer {}
UniqueConstraint
UniqueConstraint定义在Table或SecondaryTable元数据里Q用来指定徏表时需要徏唯一U束的列?
元数据属性说明:
· columnNames:定义一个字W串数组Q指定要建唯一U束的列名?
@Entity
@Table(name="EMPLOYEE",
uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})}
)
public class Employee { ... }
Column
Column元数据定义了映射到数据库的列的所有属性:列名Q是否唯一Q是否允ؓI,是否允许更新{?
元数据属性说明:
· name:列名?
· unique: 是否唯一
· nullable: 是否允许为空
· insertable: 是否允许插入
· updatable: 是否允许更新
· columnDefinition: 定义时创建此列的DDL
· secondaryTable: 从表名。如果此列不建在主表上(默认建在主表Q,该属性定义该列所在从表的名字?
public class Person {
@Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)
private String name;
@Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")
private byte[] picture;
JoinColumn
如果在entity class的field上定义了关系Qone2one或one2many{)Q我们通过JoinColumn来定义关pȝ属性。JoinColumn的大部分属性和ColumncM?
元数据属性说明:
· name:列名?
· referencedColumnName:该列指向列的列名Q徏表时该列作ؓ外键列指向关pd一端的指定列)
· unique: 是否唯一
· nullable: 是否允许为空
· insertable: 是否允许插入
· updatable: 是否允许更新
· columnDefinition: 定义时创建此列的DDL
· secondaryTable: 从表名。如果此列不建在主表上(默认建在主表Q,该属性定义该列所在从表的名字?
下面的代码说明Custom和Order是一对一关系。在Order对应的映表Z个名为CUST_ID的列Q该列作为外键指向Custom对应表中名ؓID的列?
public class Custom {
@OneToOne
@JoinColumn(
name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)
public Order getOrder() {
return order;
}
JoinColumns
如果在entity class的field上定义了关系Qone2one或one2many{)Qƈ且关pd在多个JoinColumnQ用JoinColumns定义多个JoinColumn的属性?
元数据属性说明:
· value: 定义JoinColumn数组Q指定每个JoinColumn的属性?
下面的代码说明Custom和Order是一对一关系。在Order对应的映表Z列,一列名为CUST_IDQ该列作为外键指向Custom对应表中名ؓID的列,另一列名为CUST_NAMEQ该列作为外键指向Custom对应表中名ؓNAME的列?
public class Custom {
@OneToOne
@JoinColumns({
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
@JoinColumn(name="CUST_NAME", referencedColumnName="NAME")
})
public Order getOrder() {
return order;
}
Id
声明当前field为映表中的主键列。id值的获取方式有五U:TABLE, SEQUENCE, IDENTITY, AUTO, NONE。Oracle和DB2支持SEQUENCEQSQL Server和Sybase支持IDENTITY,mysql支持AUTO。所有的数据库都可以指定为AUTOQ我们会Ҏ(gu)不同数据库做转换。NONE (默认)需要用戯己指定Id的倹{元数据属性说明:
· generate():主键值的获取cd
· generator():TableGenerator的名字(当generate=GeneratorType.TABLE才需要指定该属性)
下面的代码声明Task的主键列id是自动增长的?Oracle和DB2从默认的SEQUENCE取|SQL Server和Sybase该列建成IDENTITYQmysql该列建成auto increment?
@Entity
@Table(name = "OTASK")
public class Task {
@Id(generate = GeneratorType.AUTO)
public Integer getId() {
return id;
}
}
IdClass
当entity class使用复合主键Ӟ需要定义一个类作ؓid class。id class必须W合以下要求:cdd明ؓpublicQƈ提供一个声明ؓpublic的空构造函数。必d现Serializable接,覆写 equals()和hashCodeQ)Ҏ(gu)。entity class的所有id field在id class都要定义Q且cd一栗?
元数据属性说明:
· value: id class的类?
public class EmployeePK implements Java.io.Serializable{
String empName;
Integer empAge;
public EmployeePK(){}
public boolean equals(Object obj){ ......}
public int hashCode(){......}
}
@IdClass(value=com.acme.EmployeePK.class)
@Entity(access=FIELD)
public class Employee {
@Id String empName;
@Id Integer empAge;
}
MapKey
在一对多Q多对多关系中,我们可以用Map来保存集合对象。默认用主键值做keyQ如果用复合主键,则用id class的实例做keyQ如果指定了name属性,q指定的field的值做key?
元数据属性说明:
· name: 用来做key的field名字
下面的代码说明Person和Book之间是一对多关系。Person的books字段是MapcdQ用Book的isbn字段的g为Map的key?
@Table(name = "PERSON")
public class Person {
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@MapKey(name = "isbn")
private Map books = new HashMap();
}
OrderBy
在一对多Q多对多关系中,有时我们希望从数据库加蝲出来的集合对象是按一定方式排序的Q这可以通过OrderBy来实玎ͼ默认是按对象的主键升序排列?
元数据属性说明:
· value: 字符串类型,指定排序方式。格式ؓ"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......",排序cd可以不指定,默认是ASC?
下面的代码说明Person和Book之间是一对多关系。集合books按照Book的isbn升序Qname降序排列?
@Table(name = "MAPKEY_PERSON")
public class Person {
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@OrderBy(name = "isbn ASC, name DESC")
private List books = new ArrayList();
}
PrimaryKeyJoinColumn
在三U情况下会用到PrimaryKeyJoinColumn?
· l承?
· entity class映射C个或多个从表。从表根据主表的主键列(列名为referencedColumnName值的列)Q徏立一个类型一L主键列,列名由name属性定义?
· one2one关系Q关pȝ护端的主键作为外键指向关p被l护端的主键Q不再新Z个外键列?
元数据属性说明:
· name:列名?
· referencedColumnName:该列引用列的列名
· columnDefinition: 定义时创建此列的DDL
下面的代码说明Customer映射C个表Q主表CUSTOMER,从表CUST_DETAILQ从表需要徏立主键列CUST_IDQ该列和主表的主键列id除了列名不同Q其他定义一栗?
@Entity
@Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"QreferencedColumnName="id"))
public class Customer {
@Id(generate = GeneratorType.AUTO)
public Integer getId() {
return id;
}
}
下面的代码说明Employee和EmployeeInfo是一对一关系QEmployee的主键列id作ؓ外键指向EmployeeInfo的主键列INFO_ID?
@Table(name = "Employee")
public class Employee {
@OneToOne
@PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")
EmployeeInfo info;
}
PrimaryKeyJoinColumns
如果entity class使用了复合主键,指定单个PrimaryKeyJoinColumn不能满要求Ӟ可以用PrimaryKeyJoinColumns来定义多个PrimaryKeyJoinColumn?
元数据属性说明:
· value: 一个PrimaryKeyJoinColumn数组Q包含所有PrimaryKeyJoinColumn?
下面的代码说明了Employee和EmployeeInfo是一对一关系。他们都使用复合主键Q徏表时需要在Employee表徏立一个外键,从Employee的主键列id,name指向EmployeeInfo的主键列INFO_ID和INFO_NAME.
@Entity
@IdClass(EmpPK.class)
@Table(name = "EMPLOYEE")
public class Employee {
private int id;
private String name;
private String address;
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),
@PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})
EmployeeInfo info;
}
@Entity
@IdClass(EmpPK.class)
@Table(name = "EMPLOYEE_INFO")
public class EmployeeInfo {
@Id
@Column(name = "INFO_ID")
private int id;
@Id
@Column(name = "INFO_NAME")
private String name;
}
Transient
Transient用来注释entity的属性,指定的这些属性不会被持久化,也不会ؓq些属性徏表?
@Transient
private String name;
Version
Version指定实体cd乐观事务中的version属性。在实体c重新由EntityManager理q且加入C观事务中Ӟ保证完整性。每一个类只能有一个属性被指定为versionQversion属性应该映到实体cȝ主表上?
下面的代码说明versionNum属性作个类的versionQ映到数据库中主表的列名是OPTLOCK?
@Version
@Column("OPTLOCK")
protected int getVersionNum() { return versionNum; }
Lob
Lob指定一个属性作为数据库支持的大对象cd在数据库中存储。用LobTypeq个枚D来定义Lob是二q制cdq是字符cd?
LobType枚Dcd说明Q?
· BLOB 二进制大对象QByte[]或者Serializable的类型可以指定ؓBLOB?
· CLOB 字符型大对象Qchar[]、Character[]或Stringcd可以指定为CLOB?
元数据属性说明:
· fetchQ?定义q个字段是lazy loadedq是eagerly fetched。数据类型是FetchType枚DQ默认ؓLAZY,即lazy loaded.
· typeQ?定义q个字段在数据库中的JDBC数据cd。数据类型是LobType枚DQ默认ؓBLOB?
下面的代码定义了一个BLOBcd的属性和一个CLOBcd的属性?
@Lob
@Column(name="PHOTO" columnDefinition="BLOB NOT NULL")
protected JPEGImage picture;
@Lob(fetch=EAGER, type=CLOB)
@Column(name="REPORT")
protected String report;
JoinTable
JoinTable在many-to-many关系的所有者一边定义。如果没有定义JoinTableQ用JoinTable的默认倹{?
元数据属性说明:
· table:q个join table的Table定义?
· joinColumns:定义指向所有者主表的外键列,数据cd是JoinColumn数组?
· inverseJoinColumns:定义指向非所有者主表的外键列,数据cd是JoinColumn数组?
下面的代码定义了一个连接表CUST和PHONE的join table。join table的表名是CUST_PHONEQ包含两个外键,一个外键是CUST_IDQ指向表CUST的主键IDQ另一个外键是PHONE_IDQ指向表PHONE的主键ID?
@JoinTable(
table=@Table(name=CUST_PHONE),
joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")
)
TableGenerator
TableGenerator定义一个主键值生成器Q在Idq个元数据的generateQTABLEӞgenerator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义?
生成器是为多个实体类提供q箋的ID值的表,每一行ؓ一个类提供ID|ID值通常是整数?
元数据属性说明:
· name:生成器的唯一名字Q可以被Id元数据用?
· table:生成器用来存储id值的Table定义?
· pkColumnName:生成器表的主键名U?
· valueColumnName:生成器表的ID值的列名U?
· pkColumnValue:生成器表中的一行数据的主键倹{?
· initialValue:id值的初始倹{?
· allocationSize:id值的增量?
下面的代码定义了两个生成器empGen和addressGenQ生成器的表是ID_GEN?
@Entity public class Employee {
...
@TableGenerator(name="empGen",
table=@Table(name="ID_GEN"),
pkColumnName="GEN_KEY",
valueColumnName="GEN_VALUE",
pkColumnValue="EMP_ID",
allocationSize=1)
@Id(generate=TABLE, generator="empGen")
public int id;
...
}
@Entity public class Address {
...
@TableGenerator(name="addressGen",
table=@Table(name="ID_GEN"),
pkColumnValue="ADDR_ID")
@Id(generate=TABLE, generator="addressGen")
public int id;
...
}
SequenceGenerator
SequenceGenerator定义一个主键值生成器Q在Idq个元数据的generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。生成器是数据库支持的sequence对象?
元数据属性说明:
· name:生成器的唯一名字Q可以被Id元数据用?
· sequenceName:数据库中Qsequence对象的名U。如果不指定Q会使用提供商指定的默认名称?
· initialValue:id值的初始倹{?
· allocationSize:id值的增量?
下面的代码定义了一个用提供商默认名称的sequence生成器?
@SequenceGenerator(name="EMP_SEQ", allocationSize=25)
DiscriminatorColumn
DiscriminatorColumn定义在用SINGLE_TABLE或JOINEDl承{略的表中区别不l承层次的列?
元数据属性说明:
· name:column的名字。默认gؓTYPE?
· columnDefinition:生成DDL的sql片断?
· length:Stringcd的column的长度,其他cd使用默认?0?
下面的代码定义了一个列名ؓDISCQ长度ؓ20的Stringcd的区别列?
@Entity
@Table(name="CUST")
@Inheritance(strategy=SINGLE_TABLE,
discriminatorType=STRING,
discriminatorValue="CUSTOMER")
@DiscriminatorColumn(name="DISC", length=20)
public class Customer { ... }
ArrayList其实是包装了一?font color="#800000">数组Object[]Q当实例化一个ArrayListӞ一个数l也被实例化Q当向ArrayList中添加对象是Q数l的大小也相应的改变。这样就带来以下有特点:
快速随卌?/strong> 你可以随卌问每个元素而不用考虑性能问题Q通过调用get(i)Ҏ(gu)来访问下标ؓi的数l元素?/p>
向其中添加对象速度?/strong> 当你创徏数组是ƈ不能定其容量,所以当改变q个数组时就必须在内存中做很多事情?/p>
操作其中对象的速度?/strong> 当你要想数组中Q意两个元素中间添加对象时Q数l需要移动所有后面的对象? LinkedList是通过节点直接彼此q接来实现的。每一个节炚w包含前一个节点的引用Q后一个节点的引用和节点存储的倹{当一个新节点插入Ӟ只需要修改其中保持先后关pȝ节点的引用即可,当删除记录时也一栗这样就带来以下有特点: 操作其中对象的速度?只需要改变连接,新的节点可以在内存中的Q何地?/p>
不能随即讉K 虽然存在get()Ҏ(gu)Q但是这个方法是通过遍历接点来定位的所以速度慢?br />
LinkList:
一些结论:
当一些被定义好的数据需要放C数组对应?/span>List中,ArrayList是很好的选择Q因为它可以动态变化,但是不要在整个应用程序中频繁的用?br />
你要很方便的操作其中的数据而不用随卌问时;LinkList是很好的选择。如果你要频J随问徏议用ArrayList?/span>
]]>