﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-VincentChen‘s Blog-文章分类-Hibernate</title><link>http://www.blogjava.net/Vencent/category/7759.html</link><description>&lt;meta name="verify-v1" content="nLN22jw4ufhlfO/JuewV2fjCvlLyNodcoq3OQqej8xg=" /&gt;
&lt;font color='orange'&gt;本博客仅为收集所用。在此对原作者表示感谢。&lt;/font&gt;
&lt;center&gt;
&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;div class="custom"&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6256612161572960";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
google_ad_channel ="";
google_page_url = document.location;
google_color_border = ["FFFFFF","FFFFFF","FFFFFF","FFFFFF"];
google_color_bg = ["FFFFFF","FFFFFF","FFFFFF","FFFFFF"];
google_color_link = ["0000FF","0000FF","0000FF","0000FF"];
google_color_url = ["999999","0033FF","00008B","FFCC00"];
google_color_text = ["0033FF","AA9999","0033FF","AA9999"];
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;/div&gt;&lt;/center&gt;
&lt;!--bgsound src="http://www.blogjava.net/Files/Vencent/The%20Mass%20Era.zip" volume="10" loop="10"/--&gt;
&lt;script type="text/javascript" src="http://shooter.cn/api/shteapi.js" charset='utf-8'&gt;&lt;/script&gt;
&lt;link rel="stylesheet" type="text/css" href="http://shooter.cn/api/standard.css" /&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 06 Sep 2007 04:49:27 GMT</lastBuildDate><pubDate>Thu, 06 Sep 2007 04:49:27 GMT</pubDate><ttl>60</ttl><item><title>[转] 常用 JPA annotation 参考</title><link>http://www.blogjava.net/Vencent/articles/142143.html</link><dc:creator>Vincent.Chen</dc:creator><author>Vincent.Chen</author><pubDate>Sun, 02 Sep 2007 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/142143.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/142143.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/142143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/142143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/142143.html</trackback:ping><description><![CDATA[<h2><font><font face="Arial" size="2">原文：<a href="http://leelun.javaeye.com/blog/36829" target="_blank">常用的JPA标记</a></font></font></h2>
<h2>
</h2>
<h2><font color="#000000" face="Arial" size="2">Table</font>
</h2>
<p>
<font face="Arial" size="2">Table用来定义entity主表的name，catalog，schema等属性。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">name: 表名 </font>
    </li>
    <li>
    <font face="Arial" size="2">catalog: 对应关系数据库中的catalog </font>
    </li>
    <li>
    <font face="Arial" size="2">schema：对应关系数据库中的schema </font>
    </li>
    <li>
    <font face="Arial" size="2">UniqueConstraints:定义一个UniqueConstraint数组，指定需要建唯一约束的列 </font>
    </li>
</ul>
<div class="source">
<pre>								<font face="Arial" size="2">    <br />
@Entity<br />
@Table(name="CUST")<br />
public class Customer { ... }<br />
</font><br />
</pre>
</div>
<div class="section">
<a name="SecondaryTable">
</a>
<h2>
<font face="Arial" size="2">SecondaryTable</font>
</h2>
<p>
<font face="Arial" size="2">一个entity class可以映射到多表，SecondaryTable用来定义单个从表的名字，主键名字等属性。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">name: 表名 </font>
    </li>
    <li>
    <font face="Arial" size="2">catalog: 对应关系数据库中的catalog </font>
    </li>
    <li>
    <font face="Arial" size="2">schema：对应关系数据库中的schema </font>
    </li>
    <li>
    <font face="Arial" size="2">pkJoin: 定义一个PrimaryKeyJoinColumn数组，指定从表的主键列 </font>
    </li>
    <li>
    <font face="Arial" size="2">UniqueConstraints:定义一个UniqueConstraint数组，指定需要建唯一约束的列 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码说明Customer类映射到两个表，主表名是CUSTOMER，从表名是CUST_DETAIL，从表的主键列和主表的主键列类型相同，列名为CUST_ID。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@Entity<br />
@Table(name="CUSTOMER")<br />
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))<br />
public class Customer { ... }<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="SecondaryTables">
</a>
<h2>
<font face="Arial" size="2">SecondaryTables</font>
</h2>
<p>
<font face="Arial" size="2">当一个entity class映射到一个主表和多个从表时，用SecondaryTables来定义各个从表的属性。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">value： 定义一个SecondaryTable数组，指定每个从表的属性。 </font>
    </li>
</ul>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@Table(name = "CUSTOMER")<br />
@SecondaryTables( value = {<br />
@SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),<br />
@SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })<br />
public class Customer {}<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="UniqueConstraint">
</a>
<h2>
<font face="Arial" size="2">UniqueConstraint</font>
</h2>
<p>
<font face="Arial" size="2">UniqueConstraint定义在Table或SecondaryTable元数据里，用来指定建表时需要建唯一约束的列。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">columnNames:定义一个字符串数组，指定要建唯一约束的列名。 </font>
    </li>
</ul>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@Entity<br />
@Table(name="EMPLOYEE",<br />
uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})}<br />
)<br />
public class Employee { ... }<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="Column">
</a>
<h2>
<font face="Arial" size="2">Column</font>
</h2>
<p>
<font face="Arial" size="2">Column元数据定义了映射到数据库的列的所有属性：列名，是否唯一，是否允许为空，是否允许更新等。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">name:列名。 </font>
    </li>
    <li>
    <font face="Arial" size="2">unique: 是否唯一 </font>
    </li>
    <li>
    <font face="Arial" size="2">nullable: 是否允许为空 </font>
    </li>
    <li>
    <font face="Arial" size="2">insertable: 是否允许插入 </font>
    </li>
    <li>
    <font face="Arial" size="2">updatable: 是否允许更新 </font>
    </li>
    <li>
    <font face="Arial" size="2">columnDefinition: 定义建表时创建此列的DDL </font>
    </li>
    <li>
    <font face="Arial" size="2">secondaryTable: 从表名。如果此列不建在主表上（默认建在主表），该属性定义该列所在从表的名字。 </font>
    </li>
</ul>
<div class="source">
<pre>								<font face="Arial" size="2">        <br />
public class Person {<br />
@Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)<br />
private String name;<br />
<br />
@Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")<br />
private byte[] picture;<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="JoinColumn">
</a>
<h2>
<font face="Arial" size="2">JoinColumn</font>
</h2>
<p>
<font face="Arial" size="2">如果在entity class的field上定义了关系（one2one或one2many等），我们通过JoinColumn来定义关系的属性。JoinColumn的大部分属性和Column类似。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">name:列名。 </font>
    </li>
    <li>
    <font face="Arial" size="2">referencedColumnName:该列指向列的列名（建表时该列作为外键列指向关系另一端的指定列） </font>
    </li>
    <li>
    <font face="Arial" size="2">unique: 是否唯一 </font>
    </li>
    <li>
    <font face="Arial" size="2">nullable: 是否允许为空 </font>
    </li>
    <li>
    <font face="Arial" size="2">insertable: 是否允许插入 </font>
    </li>
    <li>
    <font face="Arial" size="2">updatable: 是否允许更新 </font>
    </li>
    <li>
    <font face="Arial" size="2">columnDefinition: 定义建表时创建此列的DDL </font>
    </li>
    <li>
    <font face="Arial" size="2">secondaryTable: 从表名。如果此列不建在主表上（默认建在主表），该属性定义该列所在从表的名字。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码说明Custom和Order是一对一关系。在Order对应的映射表建一个名为CUST_ID的列，该列作为外键指向Custom对应表中名为ID的列。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
public class Custom {<br />
<br />
@OneToOne<br />
@JoinColumn(<br />
name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)<br />
public Order getOrder() {<br />
return order;<br />
}<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="JoinColumns">
</a>
<h2>
<font face="Arial" size="2">JoinColumns</font>
</h2>
<p>
<font face="Arial" size="2">如果在entity class的field上定义了关系（one2one或one2many等），并且关系存在多个JoinColumn，用JoinColumns定义多个JoinColumn的属性。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">value: 定义JoinColumn数组，指定每个JoinColumn的属性。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码说明Custom和Order是一对一关系。在Order对应的映射表建两列，一列名为CUST_ID，该列作为外键指向Custom对应表中名为ID的列,另一列名为CUST_NAME，该列作为外键指向Custom对应表中名为NAME的列。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
public class Custom {<br />
@OneToOne<br />
@JoinColumns({<br />
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),<br />
@JoinColumn(name="CUST_NAME", referencedColumnName="NAME")<br />
})<br />
public Order getOrder() {<br />
return order;<br />
}<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="Id">
</a>
<h2>
<font face="Arial" size="2">Id</font>
</h2>
<p>
<font face="Arial" size="2">声
明当前field为映射表中的主键列。id值的获取方式有五种：TABLE, SEQUENCE, IDENTITY, AUTO,
NONE。Oracle和DB2支持SEQUENCE，SQL
Server和Sybase支持IDENTITY,mysql支持AUTO。所有的数据库都可以指定为AUTO，我们会根据不同数据库做转换。NONE
(默认)需要用户自己指定Id的值。元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">generate():主键值的获取类型 </font>
    </li>
    <li>
    <font face="Arial" size="2">generator():TableGenerator的名字（当generate=GeneratorType.TABLE才需要指定该属性） </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码声明Task的主键列id是自动增长的。(Oracle和DB2从默认的SEQUENCE取值，SQL Server和Sybase该列建成IDENTITY，mysql该列建成auto increment。)</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@Entity<br />
@Table(name = "OTASK")<br />
public class Task {<br />
@Id(generate = GeneratorType.AUTO)<br />
public Integer getId() {<br />
return id;<br />
}<br />
}<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="IdClass">
</a>
<h2>
<font face="Arial" size="2">IdClass</font>
</h2>
<p>
<font face="Arial" size="2">当entity
class使用复合主键时，需要定义一个类作为id class。id
class必须符合以下要求:类必须声明为public，并提供一个声明为public的空构造函数。必须实现Serializable接，覆写
equals()和hashCode（）方法。entity class的所有id field在id class都要定义，且类型一样。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">value: id class的类名 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">&nbsp;&nbsp; public class EmployeePK implements java.io.Serializable{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String empName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer empAge;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public EmployeePK(){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public boolean equals(Object obj){ ......}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int hashCode(){......}<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; @IdClass(value=com.acme.EmployeePK.class)<br />
&nbsp;&nbsp;&nbsp; @Entity(access=FIELD)<br />
&nbsp;&nbsp;&nbsp; public class Employee {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Id String empName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Id Integer empAge;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
</div>
<div class="section">
<a name="MapKey">
</a>
<h2>
<font face="Arial" size="2">MapKey</font>
</h2>
<p>
<font face="Arial" size="2">在一对多，多对多关系中，我们可以用Map来保存集合对象。默认用主键值做key，如果使用复合主键，则用id class的实例做key，如果指定了name属性，就用指定的field的值做key。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">name: 用来做key的field名字 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码说明Person和Book之间是一对多关系。Person的books字段是Map类型，用Book的isbn字段的值作为Map的key。</font>
</p>
<div class="source">
<pre>								<font face="Arial"><br />
<font size="2">                <br />
@Table(name = "PERSON")<br />
public class Person {<br />
<br />
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")<br />
@MapKey(name = "isbn")<br />
private Map<string> books = new HashMap<string>();<br />
}<br />
<br />
</string></string></font><br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="OrderBy">
</a>
<h2>
<font face="Arial" size="2">OrderBy</font>
</h2>
<p>
<font face="Arial" size="2">在一对多，多对多关系中，有时我们希望从数据库加载出来的集合对象是按一定方式排序的，这可以通过OrderBy来实现，默认是按对象的主键升序排列。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">value: 字符串类型，指定排序方式。格式为"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......",排序类型可以不指定，默认是ASC。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码说明Person和Book之间是一对多关系。集合books按照Book的isbn升序，name降序排列。</font>
</p>
<div class="source">
<pre>								<font face="Arial"><br />
<font size="2">                <br />
@Table(name = "MAPKEY_PERSON")<br />
public class Person {<br />
<br />
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")<br />
@OrderBy(name = "isbn ASC, name DESC")<br />
private List<book> books = new ArrayList<book>();<br />
}<br />
</book></book></font><br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="PrimaryKeyJoinColumn">
</a>
<h2>
<font face="Arial" size="2">PrimaryKeyJoinColumn</font>
</h2>
<p>
<font face="Arial" size="2">在三种情况下会用到PrimaryKeyJoinColumn。 </font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">继承。 </font>
    </li>
    <li>
    <font face="Arial" size="2">entity class映射到一个或多个从表。从表根据主表的主键列（列名为referencedColumnName值的列），建立一个类型一样的主键列，列名由name属性定义。 </font>
    </li>
    <li>
    <font face="Arial" size="2">one2one关系，关系维护端的主键作为外键指向关系被维护端的主键，不再新建一个外键列。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">name:列名。 </font>
    </li>
    <li>
    <font face="Arial" size="2">referencedColumnName:该列引用列的列名 </font>
    </li>
    <li>
    <font face="Arial" size="2">columnDefinition: 定义建表时创建此列的DDL </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码说明Customer映射到两个表，主表CUSTOMER,从表CUST_DETAIL，从表需要建立主键列CUST_ID，该列和主表的主键列id除了列名不同，其他定义一样。 </font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">  @Entity<br />
@Table(name="CUSTOMER")<br />
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"，referencedColumnName="id"))<br />
public class Customer { <br />
@Id(generate = GeneratorType.AUTO)<br />
public Integer getId() {<br />
return id;<br />
}<br />
}<br />
</font><br />
</pre>
</div>
<p>
<font face="Arial" size="2">下面的代码说明Employee和EmployeeInfo是一对一关系，Employee的主键列id作为外键指向EmployeeInfo的主键列INFO_ID。 </font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">            <br />
@Table(name = "Employee")<br />
public class Employee {<br />
@OneToOne<br />
@PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")<br />
EmployeeInfo info;<br />
}<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="PrimaryKeyJoinColumns">
</a>
<h2>
<font face="Arial" size="2">PrimaryKeyJoinColumns</font>
</h2>
<p>
<font face="Arial" size="2">如果entity class使用了复合主键，指定单个PrimaryKeyJoinColumn不能满足要求时，可以用PrimaryKeyJoinColumns来定义多个PrimaryKeyJoinColumn。 </font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">value: 一个PrimaryKeyJoinColumn数组，包含所有PrimaryKeyJoinColumn。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码说明了Employee和EmployeeInfo是一对一关系。他们都使用复合主键，建表时需要在Employee表建立一个外键，从Employee的主键列id,name指向EmployeeInfo的主键列INFO_ID和INFO_NAME. </font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">            <br />
@Entity<br />
@IdClass(EmpPK.class)<br />
@Table(name = "EMPLOYEE")<br />
public class Employee {<br />
<br />
private int id;<br />
<br />
private String name;<br />
<br />
private String address;<br />
<br />
@OneToOne(cascade = CascadeType.ALL)<br />
@PrimaryKeyJoinColumns({<br />
@PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),<br />
@PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})<br />
EmployeeInfo info;<br />
}<br />
<br />
@Entity<br />
@IdClass(EmpPK.class)<br />
@Table(name = "EMPLOYEE_INFO")<br />
public class EmployeeInfo {<br />
<br />
@Id<br />
@Column(name = "INFO_ID")<br />
private int id;<br />
<br />
@Id<br />
@Column(name = "INFO_NAME")<br />
private String name;<br />
}<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="Transient">
</a>
<h2>
<font face="Arial" size="2">Transient</font>
</h2>
<p>
<font face="Arial" size="2">Transient用来注释entity的属性，指定的这些属性不会被持久化，也不会为这些属性建表。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">    <br />
@Transient<br />
private String name;<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="Version">
</a>
<h2>
<font face="Arial" size="2">Version</font>
</h2>
<p>
<font face="Arial" size="2">Version指定实体类在乐观事务中的version属性。在实体类重新由EntityManager管理并且加入到乐观事务中时，保证完整性。每一个类只能有一个属性被指定为version，version属性应该映射到实体类的主表上。</font>
</p>
<p>
<font face="Arial" size="2">下面的代码说明versionNum属性作为这个类的version，映射到数据库中主表的列名是OPTLOCK。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@Version<br />
@Column("OPTLOCK")<br />
protected int getVersionNum() { return versionNum; }<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="Lob">
</a>
<h2>
<font face="Arial" size="2">Lob</font>
</h2>
<p>
<font face="Arial" size="2">Lob指定一个属性作为数据库支持的大对象类型在数据库中存储。使用LobType这个枚举来定义Lob是二进制类型还是字符类型。</font>
</p>
<p>
<font face="Arial" size="2">LobType枚举类型说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">BLOB 二进制大对象，Byte[]或者Serializable的类型可以指定为BLOB。 </font>
    </li>
    <li>
    <font face="Arial" size="2">CLOB 字符型大对象，char[]、Character[]或String类型可以指定为CLOB。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">fetch： 定义这个字段是lazy loaded还是eagerly fetched。数据类型是FetchType枚举，默认为LAZY,即lazy loaded. </font>
    </li>
    <li>
    <font face="Arial" size="2">type： 定义这个字段在数据库中的JDBC数据类型。数据类型是LobType枚举，默认为BLOB。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码定义了一个BLOB类型的属性和一个CLOB类型的属性。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@Lob<br />
@Column(name="PHOTO" columnDefinition="BLOB NOT NULL")<br />
protected JPEGImage picture;<br />
<br />
@Lob(fetch=EAGER, type=CLOB)<br />
@Column(name="REPORT")<br />
protected String report;<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="JoinTable">
</a>
<h2>
<font face="Arial" size="2">JoinTable</font>
</h2>
<p>
<font face="Arial" size="2">JoinTable在many-to-many关系的所有者一边定义。如果没有定义JoinTable，使用JoinTable的默认值。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">table:这个join table的Table定义。 </font>
    </li>
    <li>
    <font face="Arial" size="2">joinColumns:定义指向所有者主表的外键列，数据类型是JoinColumn数组。 </font>
    </li>
    <li>
    <font face="Arial" size="2">inverseJoinColumns:定义指向非所有者主表的外键列，数据类型是JoinColumn数组。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码定义了一个连接表CUST和PHONE的join table。join table的表名是CUST_PHONE，包含两个外键，一个外键是CUST_ID，指向表CUST的主键ID，另一个外键是PHONE_ID，指向表PHONE的主键ID。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@JoinTable(<br />
table=@Table(name=CUST_PHONE),<br />
joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),<br />
inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")<br />
)<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="TableGenerator">
</a>
<h2>
<font face="Arial" size="2">TableGenerator</font>
</h2>
<p>
<font face="Arial" size="2">TableGenerator定义一个主键值生成器，在Id这个元数据的generate＝TABLE时，generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。</font>
</p>
<p>
<font face="Arial" size="2">生成器是为多个实体类提供连续的ID值的表，每一行为一个类提供ID值，ID值通常是整数。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">name:生成器的唯一名字，可以被Id元数据使用。 </font>
    </li>
    <li>
    <font face="Arial" size="2">table:生成器用来存储id值的Table定义。 </font>
    </li>
    <li>
    <font face="Arial" size="2">pkColumnName:生成器表的主键名称。 </font>
    </li>
    <li>
    <font face="Arial" size="2">valueColumnName:生成器表的ID值的列名称。 </font>
    </li>
    <li>
    <font face="Arial" size="2">pkColumnValue:生成器表中的一行数据的主键值。 </font>
    </li>
    <li>
    <font face="Arial" size="2">initialValue:id值的初始值。 </font>
    </li>
    <li>
    <font face="Arial" size="2">allocationSize:id值的增量。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码定义了两个生成器empGen和addressGen，生成器的表是ID_GEN。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@Entity public class Employee {<br />
...<br />
@TableGenerator(name="empGen",<br />
table=@Table(name="ID_GEN"),<br />
pkColumnName="GEN_KEY",<br />
valueColumnName="GEN_VALUE",<br />
pkColumnValue="EMP_ID",<br />
allocationSize=1)<br />
@Id(generate=TABLE, generator="empGen")<br />
public int id;<br />
...<br />
}<br />
<br />
@Entity public class Address {<br />
...<br />
@TableGenerator(name="addressGen",<br />
table=@Table(name="ID_GEN"),<br />
pkColumnValue="ADDR_ID")<br />
@Id(generate=TABLE, generator="addressGen")<br />
public int id;<br />
...<br />
}<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="SequenceGenerator">
</a>
<h2>
<font face="Arial" size="2">SequenceGenerator</font>
</h2>
<p>
<font face="Arial" size="2">SequenceGenerator定义一个主键值生成器，在Id这个元数据的generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。生成器是数据库支持的sequence对象。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">name:生成器的唯一名字，可以被Id元数据使用。 </font>
    </li>
    <li>
    <font face="Arial" size="2">sequenceName:数据库中，sequence对象的名称。如果不指定，会使用提供商指定的默认名称。 </font>
    </li>
    <li>
    <font face="Arial" size="2">initialValue:id值的初始值。 </font>
    </li>
    <li>
    <font face="Arial" size="2">allocationSize:id值的增量。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码定义了一个使用提供商默认名称的sequence生成器。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@SequenceGenerator(name="EMP_SEQ", allocationSize=25)	<br />
<br />
</font><br />
</pre>
</div>
</div>
<div class="section">
<a name="DiscriminatorColumn">
</a>
<h2>
<font face="Arial" size="2">DiscriminatorColumn</font>
</h2>
<p>
<font face="Arial" size="2">DiscriminatorColumn定义在使用SINGLE_TABLE或JOINED继承策略的表中区别不继承层次的列。</font>
</p>
<p>
<font face="Arial" size="2">元数据属性说明：</font>
</p>
<ul>
    <li>
    <font face="Arial" size="2">name:column的名字。默认值为TYPE。 </font>
    </li>
    <li>
    <font face="Arial" size="2">columnDefinition:生成DDL的sql片断。 </font>
    </li>
    <li>
    <font face="Arial" size="2">length:String类型的column的长度，其他类型使用默认值10。 </font>
    </li>
</ul>
<p>
<font face="Arial" size="2">下面的代码定义了一个列名为DISC，长度为20的String类型的区别列。</font>
</p>
<div class="source">
<pre>								<font face="Arial" size="2">                <br />
@Entity<br />
@Table(name="CUST")<br />
@Inheritance(strategy=SINGLE_TABLE,<br />
discriminatorType=STRING,<br />
discriminatorValue="CUSTOMER")<br />
@DiscriminatorColumn(name="DISC", length=20)<br />
public class Customer { ... }</font><br />
</pre>
</div>
</div>
<img src ="http://www.blogjava.net/Vencent/aggbug/142143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent.Chen</a> 2007-09-02 22:14 <a href="http://www.blogjava.net/Vencent/articles/142143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate性能调优---Robbin 摘自http://www.javaeye.com/topic/73652</title><link>http://www.blogjava.net/Vencent/articles/139548.html</link><dc:creator>Vincent.Chen</dc:creator><author>Vincent.Chen</author><pubDate>Sun, 26 Aug 2007 10:31:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/139548.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/139548.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/139548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/139548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/139548.html</trackback:ping><description><![CDATA[<font face="Arial">Robbin总结的Hibernate性能优化要点：</font>
<p><font face="Arial">1.尽量使用many-to-one，避免使用单项one-to-many<br>
2.灵活使用单向one-to-many<br>
3.不用一对一，使用多对一代替一对一<br>
4.配置对象缓存，不使用集合缓存<br>
5.一对多使用Bag 多对一使用Set<br>
6.继承使用显示多态&nbsp; HQL:from object&nbsp; polymorphism="exlicit" 避免查处所有对象<br>
7.消除大表，使用二级缓存<br>
&nbsp;&nbsp;&nbsp; 对于上面这些，Robbin进行了详细的讲解。<br>
<strong>one-to-many：</strong><br>
&nbsp;&nbsp;&nbsp;&nbsp; 使用inverse=false(default)，对象的关联关系是由parent对象来维护的<br>
&nbsp;&nbsp;&nbsp;&nbsp; 而inverse=true的情况下，一般用户双向多对多关联，由子对象维护关联关系，增加子对象的时候需要显示：child.setParent(child)<br>
&nbsp;&nbsp;&nbsp;&nbsp; 为了提高性能，应该尽量使用双向one-to-many inverse=true，在MVC结构中的DAO接口中应该直接用Session持久化对象，避免通过关联关系（这句话有点不理解），而在单项关系中正确使用二级缓存，则可以大幅提高以查询为主的应用。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 多对一性能问题比较少，但是要避免经典N+1问题。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 通过主键进行关联，相当于大表拆分小表。（这个是区分面向对象设计和面向过程设计的一个关键点）<br>
<strong>list、bag、set的正确运用</strong><br>
&nbsp;&nbsp;&nbsp;&nbsp; one-to-many：<br>
&nbsp;&nbsp;&nbsp;&nbsp; A、使用list 需要维护Index Column字段，不能被用于双向关联，而且必须使用inverse=false，需要谨慎使用在某些稀有场合（基本上是不予考虑使用）<br>
&nbsp;&nbsp;&nbsp;&nbsp; B、bag/set在one-to-many中语义基本相同，推荐使用bag<br>
&nbsp;&nbsp;&nbsp;&nbsp; many-to-one：<br>
&nbsp;&nbsp;&nbsp;&nbsp; A、bag和set不同，bag允许重复插入，建议使用set<br>
<strong>在庞大的集合分页中应该使用session.createFilter</strong><br>
&nbsp;&nbsp;&nbsp; session.createFilter(parent.getChildren(),""),setFirstResult(0),setMaxResult(10))<br>
<strong>避免N+1 参考（http://www.javaeye.com/post/266972）</strong><br>
&nbsp;&nbsp;&nbsp; 在多对一的情况下，查询child对象，当在页面上显示每个子类的父类对象的时候会导致N+1次查询，需要采用下面的方法避免：many-to-one fetch="join|select"（该方法可能有问题）<br>
<strong>inverse=true 无法维护集合缓存（还不是很理解集合缓存和对象缓存）</strong><br>
<strong>OLTP类型的web应用，可以群集水平扩展，不可避免的出现数据库瓶颈</strong><br>
&nbsp;&nbsp;&nbsp; 框架能降低访问数据库的压力，采用缓存是衡量一个框架是否优秀的重要标准，从缓存方面看Hibernate<br>
&nbsp;&nbsp;&nbsp; A、对象缓存，细颗粒度，是针对表的级别，透明化访问，因为有不改变代码的好处，所以是ORM提高性能的法宝<br>
&nbsp;&nbsp;&nbsp; B、Hibernate是目前ORM框架中缓存性能最好的框架<br>
&nbsp;&nbsp;&nbsp; C、查询缓存<br>
<strong>最后Robbin还针对大家经常出现的Hibernate vs iBatis的讨论进行了一个总结：<br>
</strong>&nbsp;&nbsp; 对于OLTP应用，使用ORM框架 而OLEB应用（不确定是什么应用）最好采用JDBC或者其他方法处理<br>
&nbsp;&nbsp; Hibernate倾向于细颗粒度设计，面向对象，将大表拆分为多个小表，消除冗余字段，通过二级缓存提升性能。<br>
&nbsp; iBatis倾向于粗颗粒度设计，面向关系，尽量把表合并，通过Column冗余，消除关联关系，但是iBatis没有有效的缓存手段。</font></p><img src ="http://www.blogjava.net/Vencent/aggbug/139548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent.Chen</a> 2007-08-26 18:31 <a href="http://www.blogjava.net/Vencent/articles/139548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring + hibernate + webwork + freemarker 整合配置</title><link>http://www.blogjava.net/Vencent/articles/40757.html</link><dc:creator>Vincent.Chen</dc:creator><author>Vincent.Chen</author><pubDate>Wed, 12 Apr 2006 16:31:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/40757.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/40757.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/40757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/40757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/40757.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<div class="postText">
						<p>web.xml  <br />// 这里不需要配置字符过滤，网上有的例子加了，实际上<br />webwork.properties里设置如下就可以了页面也是GBK<br />webwork.locale=zh_CN<br />webwork.i18n.encoding=GBK<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /></p>
						<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="color: rgb(0, 0, 255);">&lt;!</span>
								<span style="color: rgb(255, 0, 255);">DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" <br />         "http://java.sun.com/dtd/web-app_2_3.dtd"</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />
								</span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">web-app</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />  </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">context-param</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />     </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">param-name</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">contextConfigLocation</span>
								<span style="color: rgb(0, 0, 255);">&lt;/</span>
								<span style="color: rgb(128, 0, 0);">param-name</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />     </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">param-value</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">/WEB-INF/classes/applicationContext.xml</span>
								<span style="color: rgb(0, 0, 255);">&lt;/</span>
								<span style="color: rgb(128, 0, 0);">param-value</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />  </span>
								<span style="color: rgb(0, 0, 255);">&lt;/</span>
								<span style="color: rgb(128, 0, 0);">context-param</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br /> </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">listener</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />  </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">listener-class</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />     org.springframework.web.context.ContextLoaderListener</span>
								<br />   <span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">listener-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">listener</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /> </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">listener</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">listener-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />     com.atlassian.xwork.ext.ResolverSetupServletContextListener</span><span style="color: rgb(0, 0, 255);"><br />   &lt;/</span><span style="color: rgb(128, 0, 0);">listener-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">listener</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 128, 0);">&lt;!--</span><span style="color: rgb(0, 128, 0);"><br />    &lt;servlet&gt;<br />    &lt;servlet-name&gt;context&lt;/servlet-name&gt;<br />             &lt;servlet-class&gt;<br />                org.springframework.web.context.ContextLoaderServlet<br />             &lt;/servlet-class&gt;<br />             &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />     &lt;/servlet&gt;<br />     </span><span style="color: rgb(0, 128, 0);">--&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">webwork</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            com.opensymphony.webwork.dispatcher.ServletDispatcher</span><br />         <span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">load-on-startup</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">load-on-startup</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /> </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">freemarker</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><br />      <span style="color: rgb(0, 0, 0);">com.opensymphony.webwork.views.freemarker.FreemarkerServlet</span><span style="color: rgb(0, 0, 255);"><br />   &lt;/</span><span style="color: rgb(128, 0, 0);">servlet-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">load-on-startup</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">load-on-startup</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">webwork</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">*.action</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /> </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">freemarker</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">*.ftl</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">welcome-file-list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">welcome-file</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">index.html</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">welcome-file</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">welcome-file-list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">taglib</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">taglib-uri</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">webwork</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">taglib-uri</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">taglib-location</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">/WEB-INF/webwork.tld</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">taglib-location</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">taglib</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">web-app</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /><br /></span></div>
						<br />
						<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /><br />xwork.xml<br /><br />==================---------------------------------------------</p>
						<p>
						</p>
						<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="color: rgb(0, 0, 255);">&lt;?</span>
								<span style="color: rgb(255, 0, 255);">xml version="1.0"</span>
								<span style="color: rgb(0, 0, 255);">?&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />
								</span>
								<span style="color: rgb(0, 0, 255);">&lt;!</span>
								<span style="color: rgb(255, 0, 255);">DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" <br />          "http://www.opensymphony.com/xwork/xwork-1.0.dtd"</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />
										<br />
								</span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">xwork</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />
										<br />  </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">include </span>
								<span style="color: rgb(255, 0, 0);">file</span>
								<span style="color: rgb(0, 0, 255);">="webwork-default.xml"</span>
								<span style="color: rgb(0, 0, 255);">/&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />    </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">package </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="users"</span>
								<span style="color: rgb(255, 0, 0);"> extends</span>
								<span style="color: rgb(0, 0, 255);">="webwork-default"</span>
								<span style="color: rgb(255, 0, 0);">
										<br />        externalReferenceResolver</span>
								<span style="color: rgb(0, 0, 255);">=<br />                       "com.atlassian.xwork.ext.SpringServletContextReferenceResolver"</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />
										<br />        </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">interceptors</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />            </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">interceptor </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="reference-resolver"</span>
								<span style="color: rgb(255, 0, 0);">
										<br />               class</span>
								<span style="color: rgb(0, 0, 255);">="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"</span>
								<span style="color: rgb(0, 0, 255);">/&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />            </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">interceptor-stack </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="myDefaultWebStack"</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />                </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">interceptor-ref </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="defaultStack"</span>
								<span style="color: rgb(0, 0, 255);">/&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />                </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">interceptor-ref </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="reference-resolver"</span>
								<span style="color: rgb(0, 0, 255);">/&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />                </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">interceptor-ref </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="model-driven"</span>
								<span style="color: rgb(0, 0, 255);">/&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />       </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">interceptor-ref </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="params"</span>
								<span style="color: rgb(0, 0, 255);">/&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />            </span>
								<span style="color: rgb(0, 0, 255);">&lt;/</span>
								<span style="color: rgb(128, 0, 0);">interceptor-stack</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />        </span>
								<span style="color: rgb(0, 0, 255);">&lt;/</span>
								<span style="color: rgb(128, 0, 0);">interceptors</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />
										<br />
								</span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">default-interceptor-ref </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="myDefaultWebStack"</span>
								<span style="color: rgb(0, 0, 255);">/&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />        </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">action </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="blogUser"</span>
								<span style="color: rgb(255, 0, 0);"> class</span>
								<span style="color: rgb(0, 0, 255);">="com.jsblog.action.BlogUserAction"</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />   </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">external-ref </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="baseDao"</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">baseDaoTarget</span>
								<span style="color: rgb(0, 0, 255);">&lt;/</span>
								<span style="color: rgb(128, 0, 0);">external-ref</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">     <br />    //这里是把applicationContext里配置的DAO 注入action里 action里要有baseDao属性<br />   </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">result </span>
								<span style="color: rgb(255, 0, 0);">name</span>
								<span style="color: rgb(0, 0, 255);">="success"</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">/add.htm</span>
								<span style="color: rgb(0, 0, 255);">&lt;/</span>
								<span style="color: rgb(128, 0, 0);">result</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />  </span>
								<span style="color: rgb(0, 0, 255);">&lt;/</span>
								<span style="color: rgb(128, 0, 0);">action</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
						</div>
						<br />
						<p>-------------------------------------------------------------------------<br /><br />applicationContext.xml<br /><br />---------------------------------------------------------------------------</p>
						<p>
						</p>
						<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="color: rgb(0, 0, 255);">&lt;?</span>
								<span style="color: rgb(255, 0, 255);">xml version="1.0"</span>
								<span style="color: rgb(0, 0, 255);">?&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />
								</span>
								<span style="color: rgb(0, 0, 255);">&lt;!</span>
								<span style="color: rgb(255, 0, 255);">DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" <br />           "http://www.springframework.org/dtd/spring-beans.dtd"</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />
								</span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">beans </span>
								<span style="color: rgb(255, 0, 0);">default-autowire</span>
								<span style="color: rgb(0, 0, 255);">="no"</span>
								<span style="color: rgb(255, 0, 0);"> default-dependency-check</span>
								<span style="color: rgb(0, 0, 255);">="none"</span>
								<span style="color: rgb(255, 0, 0);">
										<br />         default-lazy-init</span>
								<span style="color: rgb(0, 0, 255);">="false"</span>
								<span style="color: rgb(0, 0, 255);">&gt;</span>
								<span style="color: rgb(0, 0, 0);">
										<br />    </span>
								<span style="color: rgb(0, 0, 255);">&lt;</span>
								<span style="color: rgb(128, 0, 0);">bean </span>
								<span style="color: rgb(255, 0, 0);">id</span>
								<span style="color: rgb(0, 0, 255);">="dataSource"</span>
								<span style="color: rgb(255, 0, 0);"> class</span>
								<span style="color: rgb(0, 0, 255);">="org.apache.commons.dbcp.BasicDataSource"</span> 
								<span style="color: rgb(255, 0, 0);"><br />         destroy-method</span><span style="color: rgb(0, 0, 255);">="close"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="driverClassName"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">com.microsoft.jdbc.sqlserver.SQLServerDriver</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="url"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;<br />              </span><span style="color: rgb(0, 0, 0);">jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jsblog;SelectMethod=cursor<br />            </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="username"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">sa</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="password"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">jfy</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">bean </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="sessionFactory"</span><span style="color: rgb(255, 0, 0);"><br />          class</span><span style="color: rgb(0, 0, 255);">="org.springframework.orm.hibernate.LocalSessionFactoryBean"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="dataSource"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ref </span><span style="color: rgb(255, 0, 0);">local</span><span style="color: rgb(0, 0, 255);">="dataSource"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="mappingResources"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">com/jsblog/BlogUserForm.hbm.xml</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="hibernateProperties"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">props</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">prop </span><span style="color: rgb(255, 0, 0);">key</span><span style="color: rgb(0, 0, 255);">="hibernate.dialect"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />                    net.sf.hibernate.dialect.SQLServerDialect<br />                </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">prop</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">prop </span><span style="color: rgb(255, 0, 0);">key</span><span style="color: rgb(0, 0, 255);">="hibernate.show_sql"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">prop</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">props</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">bean </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="transactionManager"</span><span style="color: rgb(255, 0, 0);"><br />          class</span><span style="color: rgb(0, 0, 255);">="org.springframework.orm.hibernate.HibernateTransactionManager"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="sessionFactory"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ref </span><span style="color: rgb(255, 0, 0);">local</span><span style="color: rgb(0, 0, 255);">="sessionFactory"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">bean </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="baseDaoTarget"</span><span style="color: rgb(255, 0, 0);"> class</span><span style="color: rgb(0, 0, 255);">="com.jsblog.dao.BlogUserDao"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="sessionFactory"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ref </span><span style="color: rgb(255, 0, 0);">local</span><span style="color: rgb(0, 0, 255);">="sessionFactory"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">beans</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
						<br />
						<p>---------------------------------------------------------------------------<br /><br />BlogUserDao.java<br />---------------------------------------------------------------------------<br /></p>
						<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
								<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
								<span style="color: rgb(0, 0, 255);">package</span>
								<span style="color: rgb(0, 0, 0);"> com.jsblog.dao;<br /><br /></span>
								<span style="color: rgb(0, 0, 255);">import</span>
								<span style="color: rgb(0, 0, 0);"> org.springframework.orm.hibernate.support.HibernateDaoSupport;<br /></span>
								<span style="color: rgb(0, 0, 255);">import</span>
								<span style="color: rgb(0, 0, 0);"> org.springframework.orm.hibernate.HibernateCallback;<br /></span>
								<span style="color: rgb(0, 0, 255);">import</span>
								<span style="color: rgb(0, 0, 0);"> org.springframework.orm.hibernate.SessionFactoryUtils;<br /></span>
								<span style="color: rgb(0, 0, 255);">import</span>
								<span style="color: rgb(0, 0, 0);"> com.jsblog.BlogUserForm;<br /><br /></span>
								<span style="color: rgb(0, 0, 255);">import</span>
								<span style="color: rgb(0, 0, 0);"> java.io.Serializable;<br /></span>
								<span style="color: rgb(0, 0, 255);">import</span>
								<span style="color: rgb(0, 0, 0);"> java.util.List;<br /><br /></span>
								<span style="color: rgb(0, 0, 255);">import</span>
								<span style="color: rgb(0, 0, 0);"> net.sf.hibernate.HibernateException;<br /></span>
								<span style="color: rgb(0, 0, 255);">import</span>
								<span style="color: rgb(0, 0, 0);"> net.sf.hibernate.Session;<br /><br /></span>
								<span style="color: rgb(0, 0, 255);">public</span>
								<span style="color: rgb(0, 0, 0);"> </span>
								<span style="color: rgb(0, 0, 255);">class</span>
								<span style="color: rgb(0, 0, 0);"> BlogUserDao </span>
								<span style="color: rgb(0, 0, 255);">extends</span>
								<span style="color: rgb(0, 0, 0);"> HibernateDaoSupport </span>
								<span style="color: rgb(0, 0, 255);">implements</span>
								<span style="color: rgb(0, 0, 0);"> BaseDao {<br /><br />    </span>
								<span style="color: rgb(0, 0, 255);">public</span>
								<span style="color: rgb(0, 0, 0);"> </span>
								<span style="color: rgb(0, 0, 255);">void</span>
								<span style="color: rgb(0, 0, 0);"> insert(BlogUserForm bloguser) {<br />        getHibernateTemplate().save(bloguser);<br />    }<br />}</span>
						</div>
						<br />
				</div>
		</div>
<img src ="http://www.blogjava.net/Vencent/aggbug/40757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent.Chen</a> 2006-04-13 00:31 <a href="http://www.blogjava.net/Vencent/articles/40757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 3 Formulas</title><link>http://www.blogjava.net/Vencent/articles/32763.html</link><dc:creator>Vincent.Chen</dc:creator><author>Vincent.Chen</author><pubDate>Mon, 27 Feb 2006 15:36:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32763.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32763.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32763.html</trackback:ping><description><![CDATA[<p><font color="#000000"><strong><font face="宋体" size="2">译者：Rosen Jiang <br></font></strong></font></p><p><font color="#000000"><strong><font face="宋体" size="2">出处：</font></strong><a href="../../rosen/rosen/rosen/rosen"><font face="宋体" size="2"><strong>http://www.blogjava.net/rosen</strong></font></a></font></p><p>&nbsp;&nbsp;&nbsp; <a href="http://www.hibernate.org/">Hibernate</a> 和 <a href="http://www.springframework.org/">Spring</a> 这两个突出的开源框架被越来越多的应用到 J2EE 中。尽管目标有着不同的问题空间，它们却共享一个关键特性：<a href="http://martinfowler.com/articles/injection.html">依赖注入</a>。
在对象返回到客户端之前 Spring 协助挑选出这些对象间依赖关系，减少客户端代码量。而 Hibernate
专门挑选出在完整的对象模型返回客户端之前由数据模型表现的依赖关系。当使用 JDBC
直接从数据模型映射到对象模型时，我们通常需要书写大量的代码来构建对象模型。Hibernate 的出现淘汰了这种繁琐的编码工作。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;
Hibernate 2.x 提供基本的表到对象的映射，标准关联映射（包括 one-to-one, one-to-many 以及
many-to-many 关系），多态映射，等等。Hibernate 3.x
沿着路线继续前进，formula、filter、subselect 等，使映射更加灵活，提供用细粒度的解释特性。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;
在本文中，将阐述 formula 到底有哪些特性可帮助我们进行模型转换。Hibernate 3.x 之前，formula 属性只能出现在
property 元素中。但是到了现在，你可以在许多元素中使用 Hibernate 3.x 提供的 formula 属性或元素（formula
用法方面都是一样的），包括
discriminator、element、many-to-many、map-key、map-key-many-to-many、以及
property。它增加了 OR 映射的灵活性，因此允许对复杂数据模型更加细粒的解释。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 下面有两个 formula 应用场景：<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 1. formula 用于评估结果的场合。在 discriminator、element、map-key、map-key-many-to-many以及 property 元素中注入 formula。<br>&nbsp;&nbsp;&nbsp; 2. formula 用于连接目的的场合。在 many-to-one、one-to-one 以及 many-to-many 元素中注入 formula。<br>&nbsp;&nbsp;&nbsp; <br><font size="4"><strong>范畴 1：从 formula 获得评估结果</strong><br></font>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <strong>Discriminator<br></strong>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 在真实的数据 schema 中，经常出现一个表被用于描述其他表的情况。formula 可协助提供灵活的多态 OR 映射。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;
在图 1 的范例中，有两个表：Product 和 ProductRelease。每条 product 记录都有一个
ProductReleaseID 参考相应的产品出厂记录，包括 product release name、type、release date
等等。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="Product and Product Release Data Model" src="http://www.onjava.com/onjava/2005/08/03/graphics/image001.jpg" height="338" width="344"><br>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 1. Product 和 product release<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ProductRelease 表中有个有趣的属性 SubProductAllowable，该属性的值为 1 或 0。值为 1 代表允许任何的次品出厂，但是 0 不允许次品出厂。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;
图 2 展示了由数据模型解释的对象模型。Nested 接口定义了 getSubProducts 和 setSubProducts
方法。NestedProduct 类继承 Product 基类并实现 Nested 接口。无论产品数据记录是 Product 或
NestedProduct，都取决于产品出厂记录中 SubProductAllowable 的值。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="Product and Product Release Object Domain Model" src="http://www.onjava.com/onjava/2005/08/03/graphics/image002.jpg" height="333" width="375"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 2. Product 和产品出厂对象域模型<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 为了完成模型转换，我们使用如下的 Hibernate 3.x 映射：<br>&nbsp;&nbsp;&nbsp;&nbsp;<br><font color="#000080"><hibernate-mapping></hibernate-mapping></font></p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><font color="#000080"><img src="../../Images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="Product"</span><span style="color: rgb(255, 0, 0);">&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;discriminator-value</span><span style="color: rgb(0, 0, 255);">="0"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;lazy</span><span style="color: rgb(0, 0, 255);">="false"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);">&nbsp;type</span><span style="color: rgb(0, 0, 255);">="long"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">discriminator&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 0, 0);">formula</span><span style="color: rgb(0, 0, 255);">="(select&nbsp;pr.SubProductAllowable&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;ProductRelease&nbsp;pr&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;pr.productReleaseID=<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;productReleaseID)"</span><span style="color: rgb(255, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: rgb(0, 0, 255);">="integer"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">subclass&nbsp;&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="NestedProduct"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;discriminator-value</span><span style="color: rgb(0, 0, 255);">="1"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top"></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></font></div>
<p>&nbsp;&nbsp;&nbsp; 如果 formula 表达式评估结果为 0 时－－也就是不允许次品出厂－－那么对象将是 Product 类。如果结果是
1，那么对象将是 NestedProduct。在表 1 和 2 中，表 Product
的第一条记录（ProductID=10000001），已初始化的类将是 NestedProduct，因为它参考一条
SubProductAllowable=1 的 ProductRelease 记录。表 Product
的第二条记录（ProductID=20000001），已初始化的类将是 Product，因为它参考一条
SubProductAllowable=0 的 ProductRelease 记录。<br>&nbsp;&nbsp;&nbsp; 
<table border="1" width="46%">
<tbody>
<tr>
<td width="10%">S/N</td>
<td width="35%"><code><font color="#003366">ProductReleaseID</font></code></td>
<td width="35%"><code><font color="#003366">SubProductAllowable</font></code></td>
<td width="20%">...</td></tr>
<tr>
<td>1</td>
<td>11</td>
<td>1</td>
<td>¡­</td></tr>
<tr>
<td>2</td>
<td>601</td>
<td>0</td>
<td>¡­</td></tr></tbody></table>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表 1. ProductRelease 表中的记录<br>&nbsp;&nbsp;&nbsp; 
<table border="1" width="46%">
<tbody>
<tr>
<td width="10%">S/N</td>
<td width="35%"><code><font color="#003366">ProductID</font></code></td>
<td width="35%"><code><font color="#003366">ProductReleaseID</font></code></td>
<td width="20%">...</td></tr>
<tr>
<td>1</td>
<td>10000001</td>
<td>11</td>
<td>¡­</td></tr>
<tr>
<td>2</td>
<td>20000001</td>
<td>601</td>
<td>...</td></tr></tbody></table>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表 2. Product 表中的记录<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <strong>Property<br></strong>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 在 property 元素中的 formula 允许对象属性包含特定引伸值，比如对结果进行 sum、average、max 等等。</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="../../Images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="averagePrice"</span><span style="color: rgb(255, 0, 0);">&nbsp;formula</span><span style="color: rgb(0, 0, 255);">="(select&nbsp;avg(pc.price)&nbsp;from&nbsp;PriceCatalogue&nbsp;pc,&nbsp;SelectedItems&nbsp;si&nbsp;where&nbsp;si.priceRefID=pc.priceID)"</span><span style="color: rgb(0, 0, 255);">/&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp; 此外，formula 也能协助从基于当前记录的特定值向其它表检索数据。例如：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="../../Images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="currencyName"</span><span style="color: rgb(255, 0, 0);">&nbsp;formula</span><span style="color: rgb(0, 0, 255);">="(select&nbsp;cur.name&nbsp;from&nbsp;currency&nbsp;cur&nbsp;where&nbsp;cur.id=&nbsp;currencyID)"</span><span style="color: rgb(0, 0, 255);">/&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp; 这将由助于从 currency 表检索 currency name。正如你所看到的，这样直接映射可消除许多转换编码。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <strong>map-key</strong><br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; formula 允许 map-key 持有任何可能的值。下列范例（图 3），我们想让 Role_roleID 成为对象模型的 map-key（图 4）。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="User Role Data Schema" src="http://www.onjava.com/onjava/2005/08/03/graphics/image003.jpg" height="417" width="316">&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 3. 用户角色数据 schema<br><br>&nbsp;&nbsp; <img alt="User Role Object Model" src="http://www.onjava.com/onjava/2005/08/03/graphics/image004.jpg" height="180" width="431"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图 4. 用户角色对象模型<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 在前面的数据 schema 中，User 和 Role 由 User_has_Role 通过 many-to-many 关系关联调用。为了获取某个 User 所有的指派角色，我们进行如下映射：<font color="#000080"><hibernate-mapping></hibernate-mapping></font></p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><font color="#000080"><img src="../../Images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="User"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="userID"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">map&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="roles"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: rgb(0, 0, 255);">="UserRole"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">key&nbsp;</span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="User_userID"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">map-key&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 0, 0);">formula</span><span style="color: rgb(0, 0, 255);">="Role_RoleID"</span><span style="color: rgb(255, 0, 0);">&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: rgb(0, 0, 255);">="string"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">many-to-many&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="Role_RoleID"</span><span style="color: rgb(255, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: rgb(0, 0, 255);">="Role"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">map</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="Role"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="roleID"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top"></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></font></div>
<p>&nbsp;&nbsp;&nbsp; Role_RoleID 通常用于连接 many-to-many 元素的栏位值。Hibernate 通常不允许
Role_RoleID 出现在 map-key 和 many-to-many 的栏位属性中。但是有了 formula，Role_RoleID
也能用于 map-key。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <strong>element、map-key-many-to-many 以及其他<br></strong>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; element 和 property 类似，能从任何有效的 formula 表达式赋予评估值。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; map-key-many-to-many 中 formula 的用法类似于 map-key。但是，map-key-many-to-many 通常用于三重关系，map key 是一个被自己参考的对象，而不是被参考的属性。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;
那么，到底哪些情况下 formula 不支持呢？有些数据库（例如 Oracle 7）就不支持嵌入式 select 语句（也就是说一条
select SQL 内嵌在另外一条 select SQL 语句中），这种情况 formula 就不支持评估结果。因此，你应该首先检查嵌入式
select SQL 语句是否被支持。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 一旦 Hibernate 的映射拿 formula 表达式作为 select SQL 选取的一部分，请确认数据库 SQL 方言是否允许使用 formula，尽管这样将降低代码轻便性。<br>&nbsp;&nbsp;&nbsp; <br><strong><font size="4">范畴 2：formula 用于连接</font></strong></p>
<p>&nbsp;&nbsp;&nbsp; <strong>many-to-one<br></strong>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;
另一个普遍的场景是真实世界的数据模型是所有者关系映射，这意味着映射是不同于 one-to-one、one-to-many 以及
many-to-many 关系的，formula 是提供所有者关系管理元素中的一个。图 5
展示了某公司可有多个联系人，但是其中只有一个为默认联系人的范例。一个公司有多个联系人是典型的 one-to-many
关系。但是，为了标识默认联系人，ContactPerson 表使用了 defaultFlag 参数（1 是 yes, 0是 no）。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.onjava.com/onjava/2005/08/03/graphics/image005.jpg" height="327" width="272"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图 5. 用户角色数据 schema<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.onjava.com/onjava/2005/08/03/graphics/image006.jpg" height="121" width="281"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 6. 用户角色对象模型<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 为了说明对象模型（图 6）中默认联系人关系，我们使用如下映射文件：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><font color="#000080"><img src="../../Images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="Company"</span><span style="color: rgb(255, 0, 0);">&nbsp;table</span><span style="color: rgb(0, 0, 255);">="Company"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">many-to-one&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="defaultContactPerson"</span><span style="color: rgb(255, 0, 0);">&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property-ref</span><span style="color: rgb(0, 0, 255);">="defaultContactPerson"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">column&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">formula</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">formula</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">many-to-one</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="Person"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">properties&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="defaultContactPerson"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="companyID"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="defaultFlag"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">properties</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top"></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></font></div>
<p>&nbsp;&nbsp;&nbsp; 如上，我们把 companyID 和 defaultFlag 组织到名为 defaultContactPerson 的
properties 元素中，做为 Person 表的 unique key。Company 类中的 many-to-one 元素连接
Person 表的 defaultContactPerson properties 元素。输出的 SQL 像这样：<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <font color="#000080">select c.id, p.id from Company c, Person p where p.companyID=c.id and p.defaultFlag=1<br></font>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <strong>one-to-one</strong><br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;
Hibernate 中，one-to-one 主要用于两张表共享同一主键的情况。对于外键关联，我们通常使用 many-to-one
来代替。但是，有了 formula，one-to-one 可以通过外键连接表。上面的 many-to-one 范例可以通过
one-to-one 来映射：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="../../Images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="Company"</span><span style="color: rgb(255, 0, 0);">&nbsp;table</span><span style="color: rgb(0, 0, 255);">="Company"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">one-to-one&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="defaultContactPerson"</span><span style="color: rgb(255, 0, 0);">&nbsp;<br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property-ref</span><span style="color: rgb(0, 0, 255);">="defaultContactPerson"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">formula</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">formula</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">formula</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">formula</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">one-to-one</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="Person"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">properties&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="defaultContactPerson"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="companyID"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="defaultFlag"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">properties</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br><img src="../../Images/OutliningIndicators/None.gif" align="top"></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp; <strong>many-to-many<br></strong>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; formula 用于当 many-to-many 元素为关系表和实体表连接的特殊关系，尽管通常没有必要这样用。<br>&nbsp;&nbsp;&nbsp; <br><strong><font size="4">总结</font></strong></p>
&nbsp;&nbsp;&nbsp; 文章范例展示了大部分 formula 的适用情景。当需要 formula 评估值时，formula 表达式将出现在 产生的
SQL 语句的 select 部分。当 formula 用于连接时，它出现在产生的 SQL 语句的 where 部分。此外，formula
表达式可用于任何 SQL 方言，只要目标数据库支持。最后，formula 可协助完成从数据模型到对象模型的无代码细粒度映射。<br><img src ="http://www.blogjava.net/Vencent/aggbug/32763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent.Chen</a> 2006-02-27 23:36 <a href="http://www.blogjava.net/Vencent/articles/32763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中实体对象与数据的映射方式</title><link>http://www.blogjava.net/Vencent/articles/32006.html</link><dc:creator>Vincent.Chen</dc:creator><author>Vincent.Chen</author><pubDate>Wed, 22 Feb 2006 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32006.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32006.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32006.html</trackback:ping><description><![CDATA[总结了Hibernate中实体对象与数据的映射方式……图文并茂，配置实例代码，为david吃饱了撑着之大作。<br><a href="http://static.flickr.com/27/102127089_612ffcc5ab_o.jpg"><img src="http://static.flickr.com/27/102127089_612ffcc5ab.jpg?v=0" border="0"></a> 
<p class="MMTopic1" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>1 </span></span><span lang="EN-US">Entity's relation</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>1.1 </span></span><span lang="EN-US">One to One</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: 宋体;">一个</span><span style="font-size: 10pt; font-family: 宋体;">对象的一个实例对应另一个对象的一个实例从数据库角度描述，一个表中的一条记录对应另外一个表中唯一一条记录</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">public class Image{<br>private Long id;<br>private String imgName;<br>private Blog value; //to store binary of image<br>......<br>}<br>Image.hbm.xml<br>&lt;class name="Image" dynamic-update="true"&gt;<br>&lt;id...<br>&lt;property...<br>&lt;/class&gt;<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">public class Product{<br>private Long id;<br>private String name;<br>private double price;<br>private Image photo;<br>}<br>&lt;class name=...dynamic-update="true" lazy="true"<br>&lt;id...<br>&lt;property...<br>&lt;one-to-one name="photo" class="package.Image" cascade="all" outer-join="auto" constrained="false"/&gt;<br>&lt;/class&gt;<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>1.2 </span></span><span lang="EN-US">Many to One</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: 宋体;">一个</span><span style="font-size: 10pt; font-family: 宋体;">对象对应另一个对象的多个实例，从数据库角度描述，是在一个数据表中的一条记录对应另外一个数据表中对条记录</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">.<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">public class PersonalCompute{<br>private Long computerId;<br>private String cpu;<br>......<br>private Programmer owner;<br>}<br>&lt;class name="Programmer" table="Programmer"&gt;<br>&lt;id...<br>&lt;property...<br>&lt;/class&gt;<br><br>&lt;class name="PersonalCompute" table="PCS"&gt;<br>&lt;id....<br>&lt;property...<br>&lt;many-to-one name="owner" column="programmerId" class="Programmer"&gt;<br>&lt;/many-to-one&gt;<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>1.3 </span></span><span lang="EN-US">One to Many</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">The same example as Many to One.But we stand at Programmer class's view point.<br>public class Programmer{<br>...<br>private Set computers = new HashSet();<br>}<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="Programmer" table="Programmer"&gt;<br>&lt;id...<br>&lt;property...<br>&lt;set name="computers" <span style="color: red;">inverse="true" </span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">cascade="all"&gt;<br>&lt;key column="programmerId" /&gt;<br>&lt;one-to-many class="PersonalComputers"&gt;<br>&lt;/one-to-many&gt;<br>&lt;/set&gt;<o></o></span></p>
<p class="MMTopic1" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2 </span></span><span lang="EN-US">Collection</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.1 </span></span><span lang="EN-US">Map</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="Team"&gt;<br>...<br>&lt;map name="members"&gt;<br>&lt;key foreign-key="fk"&gt;<br>&lt;column name="teamNumber"&gt;<br>&lt;/key&gt;<br>&lt;index column="teamRole" type="string"/&gt;<br>&lt;element column="name" ...<br>&lt;/map&gt;<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><br>showcase:<br>Team team1 = new Team();<br>team1.setName(xx);<br>team1.getMembers.put("index","content");<br>......<br>sess.save...<o></o></span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.1.1 </span></span><span lang="EN-US">many-to-any</span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.1.2 </span></span><span lang="EN-US">One to many</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: 宋体;">单单</span><span style="font-size: 10pt; font-family: 宋体;">使用</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Map</span><span style="font-size: 10pt; font-family: 宋体;">做存储往往无法表达复杂的对象</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">,</span><span style="font-size: 10pt; font-family: 宋体;">如果要讲对象</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"> map</span><span style="font-size: 10pt; font-family: 宋体;">进行映射</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">:<br>One Team,multi-members<br>Public class Member{<br>...<br>private Team team;<br>}<br>&lt;class name="Team"&gt;<br>...<br>&lt;map name="members" inverse="false"&gt;<br>&lt;key column="team" foreign-key="fk"/&gt;<br>&lt;index type="string" column="teamRole"/&gt;<br>&lt;one-to-many class="Member"/&gt;<br>&lt;/map&gt;<br>&lt;class name="member"&gt;<br>&lt;id...<br>&lt;property...<br>&lt;many-to-one name="team" /&gt;<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">showcase:<br>Team team = new Team();<br>team.setName("xx");<br>Member mem1 = new Member();<br>mem1.setXX<br>mem1.setXX<br>Member mem2 = new Member();<br>mem2.setXX<br>mem2.setXX<br>team.getMembers().put("xx",mem1);<br>team.getMembers().put("xx2",mem2);<o></o></span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.1.3 </span></span><span lang="EN-US">many to many</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="Team"&gt;<br>&lt;id<br>&lt;propery<br>&lt;map name="members" inverse="false" table="teamHasMembers"&gt;<br>&lt;key column="team" foreign-key="fk"/&gt;<br>&lt;index type="string" column="teamRole"/&gt;<br>&lt;many-to-many class="member" outer-join="auto"&gt;<br>&lt;column name="member"/&gt;<br>&lt;/many-to-many&gt;<br>&lt;/map&gt;<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="Member"&gt;<br>&lt;id<br>&lt;property<br>&lt;map name="teams" table="memberAtTeams"&gt;<br>&lt;key....<br><br><o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">teamRole is their common key of Map.<br>Team<o></o></span></p>
<table class="MsoNormalTable" style="margin-left: 4.5pt; border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="border: 1pt solid black; padding: 0cm 4.5pt; width: 79.9pt;" valign="top" width="107">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">id<o></o></span></p></td>
<td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 4.5pt; width: 239.6pt;" valign="top" width="319">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">name<o></o></span></p></td></tr>
<tr>
<td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0cm 4.5pt; width: 79.9pt;" valign="top" width="107">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">2<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 239.6pt;" valign="top" width="319">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">team2<o></o></span></p></td></tr></tbody></table>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Member<o></o></span></p>
<table class="MsoNormalTable" style="margin-left: 4.5pt; border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="border: 1pt solid black; padding: 0cm 4.5pt; width: 79.5pt;" valign="top" width="106">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">di<o></o></span></p></td>
<td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 4.5pt; width: 194.8pt;" valign="top" width="260">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">name<o></o></span></p></td>
<td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 4.5pt; width: 123.25pt;" valign="top" width="164">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">age<o></o></span></p></td></tr>
<tr>
<td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0cm 4.5pt; width: 79.5pt;" valign="top" width="106">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 194.8pt;" valign="top" width="260">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">davy<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 123.25pt;" valign="top" width="164">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">23<o></o></span></p></td></tr></tbody></table>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">memberAtTeams<o></o></span></p>
<table class="MsoNormalTable" style="margin-left: 4.5pt; border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="border: 1pt solid black; padding: 0cm 4.5pt; width: 80.25pt;" valign="top" width="107">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">member<o></o></span></p></td>
<td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 4.5pt; width: 80.25pt;" valign="top" width="107">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">team<o></o></span></p></td>
<td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 4.5pt; width: 236.9pt;" valign="top" width="316">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">teamRole<o></o></span></p></td></tr>
<tr>
<td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0cm 4.5pt; width: 80.25pt;" valign="top" width="107">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 80.25pt;" valign="top" width="107">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">2<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 236.9pt;" valign="top" width="316">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">coach<o></o></span></p></td></tr></tbody></table>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">teamHasMembers<o></o></span></p>
<table class="MsoNormalTable" style="margin-left: 4.5pt; border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="border: 1pt solid black; padding: 0cm 4.5pt; width: 132.5pt;" valign="top" width="177">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">team<o></o></span></p></td>
<td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 4.5pt; width: 132.5pt;" valign="top" width="177">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">member<o></o></span></p></td>
<td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 4.5pt; width: 132.5pt;" valign="top" width="177">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">teamRole<o></o></span></p></td></tr>
<tr>
<td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0cm 4.5pt; width: 132.5pt;" valign="top" width="177">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">2<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 132.5pt;" valign="top" width="177">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">1<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 132.5pt;" valign="top" width="177">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">coach<o></o></span></p></td></tr></tbody></table>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><o></o></span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.1.4 </span></span><span lang="EN-US">Composite-index</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: 宋体;">复</span><span style="font-size: 10pt; font-family: 宋体;">杂</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Index </span><span style="font-size: 10pt; font-family: 宋体;">可以是一个类。</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><br></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">public class Position{<br>private String role;<br>private String scene;<br>public Position()....<br>getter...<br>setter...<br>}<br>&lt;class name="Team"&gt;<br>&lt;id...<br>&lt;property...<br>&lt;map name="members" inverse="false"&gt;<br>&lt;key column="team" foreign-key="fk"/&gt;<br>&lt;composite-index class="Position"&gt;<br>&lt;key-property..<br>&lt;key-property...<br>&lt;/composite-index&gt;<br>&lt;one-to-many class="Member"/&gt;<br>&lt;/map&gt;<br>...<br><br>&lt;class name="Member"&gt;<br>&lt;id...<br>&lt;property...<br>&lt;many-to-one name="team"/&gt;<br>&lt;/class&gt;<o></o></span></p>
<p class="MMTopic4"><span lang="EN-US">index-many-to-one</span></p>
<p class="MMTopic4"><span lang="EN-US">index-many-to-many</span></p>
<p class="MMTopic4"><span lang="EN-US">index-many-to-any</span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.1.5 </span></span><span lang="EN-US">composite-element</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;import class="Member"/&gt;<br>&lt;class name="Team"&gt;<br>&lt;id...<br>&lt;property...<br>&lt;map name="members" table="teamMembers"&gt;<br>&lt;key column="teamId"/&gt;<br>&lt;index...<br>&lt;composite-element class="Member"&gt;<br>&lt;parent name="parent"/&gt;<br>&lt;property...<br>&lt;property...<br>&lt;/composite-element&gt;<br>&lt;/map&gt;<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.2 </span></span><span lang="EN-US">Set</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="Team"&gt;<br>&lt;..<br>&lt;set name="members" inverse="false"&gt;<br>&lt;key column="team" foreign-key="fk"/&gt;<br>&lt;elemnet column="name" type="string"/&gt;<br>&lt;/set&gt;<o></o></span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.2.1 </span></span><span lang="EN-US">one-to-many</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;set name="xx" column=""&gt;<br>&lt;key column="" foreign-key="fk"/&gt;<br>&lt;one-to-many class="BB"/&gt;<br>&lt;/set&gt;<o></o></span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.2.2 </span></span><span lang="EN-US">many-to-many</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="Team"&gt;<br>&lt;id..<br>&lt;property...<br>&lt;set name="members" inverse="false" table="teamHasMembers"&gt;<br>&lt;key column="team" foreign-key="fk"&gt;<br>&lt;many-to-many class="Member" outer-join="auto"&gt;<br>&lt;column name="member"/&gt;<br>&lt;/set&gt;<br>&lt;/class&gt;<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="Member"&gt;<br>&lt;id..<br>&lt;property...<br>&lt;set name="members" inverse="true" table="memberAtTeams"&gt;<br>&lt;key column="member" foreign-key="fk"&gt;<br>&lt;many-to-many class="Member" outer-join="auto"&gt;<br>&lt;column name="team"/&gt;<br>&lt;/set&gt;<br>&lt;/class&gt;<o></o></span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.2.3 </span></span><span lang="EN-US">many-to-any</span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.2.4 </span></span><span lang="EN-US">composite-element</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.3 </span></span><span lang="EN-US">List</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;list name="members" inverse="false"&gt;<br>&lt;key column="team" foreign-key="fk"/&gt;<br>&lt;index column="teamMember"/&gt;<br>&lt;element column="name" type="string"/&gt;<br>&lt;/list&gt;<o></o></span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.3.1 </span></span><span lang="EN-US">one-to-many</span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.3.2 </span></span><span lang="EN-US">many-to-many</span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.3.3 </span></span><span lang="EN-US">many-to-many</span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.3.4 </span></span><span lang="EN-US">composite-element</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.4 </span></span><span lang="EN-US">Bag</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">It can contains JDK's Collection and List interface type's object.<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.5 </span></span><span lang="EN-US">idBag</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: 宋体;">与</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">bag</span><span style="font-size: 10pt; font-family: 宋体;">相比多出了</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">collection-id</span><span style="font-size: 10pt; font-family: 宋体;">属性</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;ibdbag name=""&gt;<br>&lt;collection-id column="mbid" type="long"&gt;<br>&lt;generator class="<st1><st1>hilo</st1></st1>"/&gt;<br>&lt;/collection-id&gt;<br>&lt;key..<br>&lt;element..<br>&lt;/idbag&gt;<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>2.6 </span></span><span lang="EN-US">array</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">public class Team{<br>//...<br>private String[] members;<br>}<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;array name="members" inverse="false"&gt;<br>&lt;key column="team" foreign-key="fk"/&gt;<br>&lt;index column="teamNumber"/&gt;<br>&lt;element column="name" type="string"/&gt;<br>&lt;/array&gt;<o></o></span></p>
<p class="MMTopic1" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>3 </span></span><span lang="EN-US">Component</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="Country"&gt;<br>&lt;id..<br>&lt;property...<br>&lt;component name="position"&gt;<br>&lt;property...<br>&lt;/component&gt;<br>Public class Country{<br>//..<br>private Position position;<br>}<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>3.1 </span></span><span lang="EN-US">One-to-one</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>3.2 </span></span><span lang="EN-US">many-to-one</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>3.3 </span></span><span lang="EN-US">dynamic-component</span></p>
<p class="MMTopic1" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>4 </span></span><span lang="EN-US">Dynamic class</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;dynamic-class entity-name="Country"&gt;<br>&lt;id name="id" type="long"&gt;<br>&lt;generator class="<st1><st1>hilo</st1></st1>"/&gt;<br>&lt;/id&gt;<br>&lt;property name="name" column="NAME" type="string"/&gt;<br>&lt;/..<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>4.1 </span></span><span lang="EN-US">One-to-one</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>4.2 </span></span><span lang="EN-US">many-to-one</span></p>
<p class="MMTopic1" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>5 </span></span><span lang="EN-US">Mapping type</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>5.1 </span></span><span lang="EN-US">Java type to SQL type</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>5.2 </span></span><span lang="EN-US">3.0 enmu</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>5.3 </span></span><span lang="EN-US">user defined data type</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">need implements org.hibernate.usertype.CompositeUserType or org.hibernate.usertype.UserType interface.<o></o></span></p>
<p class="MMTopic1" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>6 </span></span><span lang="EN-US">Class Hierarchy's mapping</span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>6.1 </span></span><span lang="EN-US">Subclasses are saved in on Table</span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>6.1.1 </span></span><span lang="EN-US">discriminator</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Sapmle:<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Class AbstractParent{<br>String id;<br>/*important*/<br>String discriminator<br>}<br>Class ChildA{<br>String childA;<br>}<br>Class ChildB{<br>String childB;<br>}<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">=========DB=========<o></o></span></p>
<table class="MsoNormalTable" style="margin-left: 4.5pt; border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="border: 1pt solid black; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">colum name<o></o></span></p></td>
<td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">data type<o></o></span></p></td>
<td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">memo<o></o></span></p></td></tr>
<tr>
<td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">id<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">varchar<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><o></o></span></p><br></td></tr>
<tr>
<td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">childA<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">varchar<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><o></o></span></p><br></td></tr>
<tr>
<td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">childB<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">varchar<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><o></o></span></p><br></td></tr>
<tr>
<td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">class_type<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">varchar<o></o></span></p></td>
<td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 4.5pt; width: 190.75pt;" valign="top" width="254">
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">used to identify subclass:A B<o></o></span></p></td></tr></tbody></table>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">========mapping config file====<br>&lt;class name="AbstractParent" table="PARENT" abstract="true"&gt;<br>&lt;id...<br>&lt;discriminator column="CLASS_TYPE" type="string"/&gt;<br>&lt;property......<br>&lt;subclass name="ChildA" discriminator-value="A"&gt;<br>&lt;property name="childA"/&gt;<br>&lt;/subclass&gt;<br>&lt;subclass......<o></o></span></p>
<p class="MMTopic4"><span lang="EN-US">id generator</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">increment<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">identity<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">sequence<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><st1><st1><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">hilo</span></st1></st1><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">seqhilo<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">uuid<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">guid<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">native<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">assigned<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt 18.5pt; text-indent: -18.75pt;"><span style="font-size: 10pt; font-family: Symbol;" lang="EN-US"><span>·<span> </span></span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">foreign<o></o></span></p>
<p class="MMTopic4"><span lang="EN-US">composite id</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;composite-id&gt;<br><span></span>&lt;key-property name=""/&gt;<br><span></span>&lt;key-property name=""/&gt;<br>&lt;/composite-id&gt;<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>6.2 </span></span><span lang="EN-US">Subclasses are saved in separated Table</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: 宋体;">并</span><span style="font-size: 10pt; font-family: 宋体;">不为父类</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Container</span><span style="font-size: 10pt; font-family: 宋体;">建立映射文件</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"> Box</span><span style="font-size: 10pt; font-family: 宋体;">与</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Bottle</span><span style="font-size: 10pt; font-family: 宋体;">的映射文件也如没有关系一样普通的建立</span><span style="font-size: 10pt; font-family: Arial;"> </span><span style="font-size: 10pt; font-family: 宋体;">但是对</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Container</span><span style="font-size: 10pt; font-family: 宋体;">取得操作</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><br><br></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">List pcs = sess.createQuery("from com.be.david.Container").list();<br>if(!cs.isEmpty()){<br>...<br>}<br></span><span style="font-size: 10pt; font-family: 宋体;">会将</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Box</span><span style="font-size: 10pt; font-family: 宋体;">与</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Container</span><span style="font-size: 10pt; font-family: 宋体;">数据都取出来</span><span style="font-size: 10pt; font-family: Arial;"> </span><span style="font-size: 10pt; font-family: 宋体;">这是</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">Hibernate</span><span style="font-size: 10pt; font-family: 宋体;">默认隐式完成的</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"><o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>6.3 </span></span><span lang="EN-US">Parent Class and Subclasses are saved in separated Table</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="Container" table="CONTAINER"&gt;<br>&lt;id...<br>&lt;property...<br>&lt;joined-subclass name="Box" table="CONTAINER_BOX"&gt;<br>&lt;key column="ContainerId"/&gt;<br>&lt;property...<br>&lt;/joined-subclass&gt;<br>&lt;joined-subclass name="Bottle" table="CONTAINER_BOTTLE"&gt;<br>&lt;key...<br>&lt;property...<br>&lt;/joined-subclass&gt;<br>&lt;/class&gt;<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>6.4 </span></span><span lang="EN-US">One <st1>PO</st1> multi-table</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">public Class Person{<br></span><span style="font-size: 10pt; font-family: 宋体;">public S</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">tring id;<br></span><span style="font-size: 10pt; font-family: 宋体;">public S</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">tring name;<br></span><span style="font-size: 10pt; font-family: 宋体;">public S</span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">tring sex;<br></span><span style="font-size: 10pt; font-family: 宋体;">public S</span><span style="font-size: 10pt; color: blue; font-family: Arial;" lang="EN-US">tring address;<br></span><span style="font-size: 10pt; font-family: 宋体;">public S</span><span style="font-size: 10pt; color: blue; font-family: Arial;" lang="EN-US">tring city;<br></span><span style="font-size: 10pt; font-family: 宋体;">public S</span><span style="font-size: 10pt; color: blue; font-family: Arial;" lang="EN-US">tring zipcode;<br></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">}<br>we wanna save address related attributes(blue ones).Use <span style="color: red;">join<br></span>&lt;class name="Person" table="PERSON"&gt;<br><span></span>&lt;id...<br><span></span>&lt;property ...<br><span></span>&lt;join table="ADDRESS"&gt;<br></span><span style="font-size: 10pt; font-family: 宋体;"></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US"> &lt;key column="addressID"/&gt;<br></span><span style="font-size: 10pt; font-family: 宋体;"></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&nbsp;&lt;property name="address"/&gt;<br></span><span style="font-size: 10pt; font-family: 宋体;"></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&nbsp;...<br></span><span style="font-size: 10pt; font-family: 宋体;"></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&nbsp;&lt;/join&gt;<br>&lt;/class&gt;<o></o></span></p>
<p class="MMTopic2" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>6.5 </span></span><span lang="EN-US">Class A Class B not inherited from Parent Class</span></p>
<p class="MMTopic3" style="margin-left: 0cm; text-indent: 0cm;"><span lang="EN-US"><span>6.5.1 </span></span><span lang="EN-US">subselect</span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">We can use <span style="color: rgb(51, 51, 153);">subselct </span></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">to make ChildA and ChildB standalone.So how can we get all data including ChindA and ChildB?<o></o></span></p>
<p class="MsoNormal" style="margin: 2.8pt 0cm 5.65pt;"><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">&lt;class name="ChildA" table="parent"&gt;<br><span></span>&lt;id...<br><span></span>&lt;property...<br>&lt;/class&gt;<br>&lt;class name="ChildB" table="parent"&gt;<br><span></span>&lt;id...<br><span></span>&lt;property...<br>&lt;/class&gt;<br>&lt;class name="Parent" mutable="false"&gt;<br><span></span>&lt;subselect&gt;<br></span><span style="font-size: 10pt; font-family: 宋体;"></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">select * from ChildA<br></span><span style="font-size: 10pt; font-family: 宋体;"></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">union<br></span><span style="font-size: 10pt; font-family: 宋体;"></span><span style="font-size: 10pt; font-family: Arial;" lang="EN-US">select * from ChildB<br><span></span>&lt;/subselect&gt;<br><span></span>&lt;sychronize table="ChildA"/&gt;<br><span></span>&lt;sychronize table="ChildB"/&gt;<br><span></span>&lt;id...<br><span></span>&lt;property...<br>&lt;/class&gt;</span></p><img src ="http://www.blogjava.net/Vencent/aggbug/32006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent.Chen</a> 2006-02-22 20:14 <a href="http://www.blogjava.net/Vencent/articles/32006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用xdoclet开发hibernate3的ant通用代码</title><link>http://www.blogjava.net/Vencent/articles/31551.html</link><dc:creator>Vincent.Chen</dc:creator><author>Vincent.Chen</author><pubDate>Sun, 19 Feb 2006 13:12:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/31551.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/31551.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/31551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/31551.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/31551.html</trackback:ping><description><![CDATA[<p>不知道为什么，复制到这里颜色没了，所以就成下面的了。还可以凑或着看吧<br>不用多说了，已经注释很详细了，希望对你有帮助<br><br>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br>&lt;project name="利用工具开发Hibernate" default="help" basedir="."&gt;</p>
<p>&nbsp;&lt;!-- ******&nbsp; 环境设置,可以根据自己的实际配置自行更改 ***** --&gt;<br>&nbsp;&lt;!-- ******&nbsp; <a href="http://blog.csdn.net/fasttalk">http://blog.csdn.net/fasttalk</a>&nbsp;&nbsp;&nbsp; ***** --&gt;<br>&nbsp;&lt;!-- ******&nbsp; <a href="../../asktalk">http://www.blogjava.net/asktalk</a>&nbsp; ***** --&gt;<br>&nbsp;&lt;!-- 源文件目录, 可以通过 项目-&gt;属性-&gt;Java构建路径 更改 --&gt;<br>&nbsp;&lt;property name="src.dir" value="./src" /&gt;<br>&nbsp;&lt;!-- 输出的class文件目录,可以通过 项目-&gt;属性-&gt;Java构建路径 更改 --&gt;<br>&nbsp;&lt;property name="class.dir" value="./bin" /&gt;<br>&nbsp;&lt;!-- 库文件目录&nbsp; --&gt;<br>&nbsp;&lt;property name="lib.dir" value="E:/workspace/java/hibernate3" /&gt;</p>
<p>&nbsp;&lt;!-- 定义类路径 --&gt;<br>&nbsp;&lt;path id="project.class.path"&gt;<br>&nbsp;&nbsp;&lt;fileset dir="${lib.dir}"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;include name="*.jar"/&gt; <br>&nbsp;&nbsp;&lt;/fileset&gt;<br>&nbsp;&nbsp;&lt;pathelement location="${class.dir}" /&gt;<br>&nbsp;&lt;/path&gt;</p>
<p>&nbsp;&lt;!-- ************************************************************** --&gt;<br>&nbsp;&lt;!-- 使用说明 --&gt;<br>&nbsp;&lt;!-- ************************************************************** --&gt;<br>&nbsp;&lt;target name="help"&gt; <br>&nbsp;&nbsp;&lt;echo message="利用工具开发Hibernate" /&gt;<br>&nbsp;&nbsp;&lt;echo message="-----------------------------------" /&gt;<br>&nbsp;&nbsp;&lt;echo message="" /&gt;<br>&nbsp;&nbsp;&lt;echo message="提供以下任务：" /&gt;<br>&nbsp;&nbsp;&lt;echo message="" /&gt;<br>&nbsp;&nbsp;&lt;echo message="generate-hbm&nbsp;&nbsp;&nbsp;&nbsp; --&gt; 运行HibernateDoclet，生成 Hibernate 类的映射文件" /&gt;<br>&nbsp;&nbsp;&lt;echo message="schemaexport&nbsp;&nbsp;&nbsp;&nbsp; --&gt; 运行SchemaExport,利用 hbm.xml 文件生成数据表" /&gt;<br>&nbsp;&nbsp;&lt;echo message="" /&gt;<br>&nbsp;&lt;/target&gt;</p>
<p><br>&nbsp;&lt;!-- ************************************************************** --&gt;<br>&nbsp;&lt;!-- Hbm2Java 任务 在hibernate3中无法实现 --&gt;<br>&nbsp;&lt;!-- ************************************************************** --&gt;<br>&nbsp;&lt;target name="generate-code" &gt;<br>&nbsp;&nbsp;&lt;echo message="运行 Hbm2Java 任务， 利用 hbm.xml 文件生成Java类文件"/&gt;</p>
<p>&nbsp;&nbsp;&lt;taskdef name="hbm2java"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classname="org.hibernate.tool.instrument.InstrumentTask"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpathref="project.class.path"&gt;<br>&nbsp;&nbsp;&lt;/taskdef&gt;</p>
<p>&nbsp;&nbsp;&lt;hbm2java output="${src.dir}"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;fileset dir="${src.dir}"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="**/*.hbm.xml"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;<br>&nbsp;&nbsp;&lt;/hbm2java&gt;<br>&nbsp;&lt;/target&gt;</p>
<p><br>&nbsp;&lt;!-- ************************************************************** --&gt;<br>&nbsp;&lt;!-- HibernateDoclet 任务 --&gt;<br>&nbsp;&lt;!-- ************************************************************** --&gt;<br>&nbsp;&lt;target name="generate-hbm" &gt;<br>&nbsp;&nbsp;&lt;echo message="运行HibernateDoclet，生成 Hibernate 类的映射文件"/&gt;</p>
<p>&nbsp;&nbsp;&lt;taskdef name="hibernatedoclet" <br>&nbsp;&nbsp;&nbsp;classname="xdoclet.modules.hibernate.HibernateDocletTask" <br>&nbsp;&nbsp;&nbsp;classpathref="project.class.path"&gt;<br>&nbsp;&nbsp;&lt;/taskdef&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destdir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出目录；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; force,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每次都强行执行，覆盖原有文件；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br>&nbsp;&nbsp;&lt;hibernatedoclet destdir="${src.dir}" <br>&nbsp;&nbsp;&nbsp;excludedtags="@version,@author,@todo" force="true" encoding="GBK" <br>&nbsp;&nbsp;&nbsp;verbose="true"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&lt;fileset dir="${src.dir}"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="**/*.java"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&lt;hibernate version="3.0" xmlencoding="utf-8" /&gt;<br>&nbsp;&nbsp;&lt;/hibernatedoclet&gt;<br>&nbsp;&lt;/target&gt;</p>
<p><br>&nbsp;&lt;!-- ************************************************************** --&gt;<br>&nbsp;&lt;!-- SchemaExport 任务 --&gt;<br>&nbsp;&lt;!-- ************************************************************** --&gt;<br>&nbsp;&lt;target name="schemaexport"&gt;<br>&nbsp;&nbsp;&lt;echo message="运行SchemaExport,利用 hbm.xml 文件生成数据表"/&gt;</p>
<p>&nbsp;&nbsp;&lt;taskdef name="schemaexport" <br>&nbsp;&nbsp;&nbsp;classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" <br>&nbsp;&nbsp;&nbsp;classpathref="project.class.path"&gt;<br>&nbsp;&nbsp;&lt;/taskdef&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; quiet=true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不要把脚本输出到stdout;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drop=true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只进行drop tables的步骤 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text=true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不执行在数据库中运行的步骤 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output=my_schema.ddl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把输出的ddl脚本输出到一个文件 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config=hibernate.cfg.xml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从XML文件读入Hibernate配置 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; properties=hibernate.properties&nbsp; 从文件读入数据库属性 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format=true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把脚本中的SQL语句对齐和美化 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delimiter=x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为脚本设置行结束符 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br>&nbsp;&nbsp;&lt;schemaexport properties="src/hibernate.properties" <br>&nbsp; quiet="no"&nbsp;text="no" drop="no"&nbsp; output="schema-export.sql" &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fileset dir="${src.dir}"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include name="**/*.hbm.xml"/&gt;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/fileset&gt;<br>&nbsp;&nbsp;&lt;/schemaexport&gt;<br>&nbsp;&lt;/target&gt;</p>
<p>&lt;/project&gt;</p><img src ="http://www.blogjava.net/Vencent/aggbug/31551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent.Chen</a> 2006-02-19 21:12 <a href="http://www.blogjava.net/Vencent/articles/31551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何把Hibernate2.1升级到Hibernate3.0？</title><link>http://www.blogjava.net/Vencent/articles/31463.html</link><dc:creator>Vincent.Chen</dc:creator><author>Vincent.Chen</author><pubDate>Sun, 19 Feb 2006 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/31463.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/31463.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/31463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/31463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/31463.html</trackback:ping><description><![CDATA[<p align="left"><font size="2">选自&lt;&lt;精通Hibernate：Java对象持久化技术详解&gt;&gt; 
        作者：<a href="http://www.javathinker.org/main.jsp?bc=weiqin/weiqin.jsp">孙卫琴</a> 来源:www.javathinker.org<br>
        如果转载，请标明出处，谢谢<br>
        </font></p>
    
  
   
     
      <p><br>
        <a HREF="/Vencent/articles/31463.html">1.1 Hibernate API 变化 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#111">1.1.1 包名 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#112">1.1.2 org.hibernate.classic包 
        </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#113">1.1.3 Hibernate所依赖的第三方软件包</a> 
        <br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#114">1.1.4 异常模型 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#115">1.1.5 Session接口</a> <br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#116">1.1.6 createSQLQuery() </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#117">1.1.7 Lifecycle 和 Validatable 
        接口 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#118">1.1.8 Interceptor接口 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#119">1.1.9 UserType和CompositeUserType接口 
        </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#1110">1.1.10 FetchMode类 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#1111">1.1.11 PersistentEnum类 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#1112">1.1.12 对Blob 和Clob的支持 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#1113">1.1.13 Hibernate中供扩展的API的变化 
        </a><br>
        <a HREF="/Vencent/articles/31463.html">1.2 元数据的变化 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#121">1.2.1 检索策略 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#122">1.2.2 对象标识符的映射 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#123">1.2.3 集合映射 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#124">1.2.4 DTD</a> <br>
        <a HREF="/Vencent/articles/31463.html">1.3 查询语句的变化 </a><br>
        <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_version_upgrade.htm#131">1.3.1 indices()和elements()函数</a> 
      </p>
      <p><br>
尽管Hibernate 3.0
与Hibernate2.1的源代码是不兼容的，但是当Hibernate开发小组在设计Hibernate3.0时，为简化升级Hibernate版本
作了周到的考虑。对于现有的基于Hibernate2.1的Java项目，可以很方便的把它升级到Hibernate3.0。<br>
        <br>
        本文描述了Hibernate3.0版本的新变化，Hibernate3.0版本的变化包括三个方面：<br>
        （1）API的变化，它将影响到Java程序代码。<br>
        （2）元数据，它将影响到对象-关系映射文件。<br>
        （3）HQL查询语句。<br>
        <br>
        值得注意的是， Hibernate3.0并不会完全取代Hibernate2.1。在同一个应用程序中，允许Hibernate3.0和Hibernate2.1并存。<br>
        <br>
        <a name="11"></a> 1.1 Hibernate API 变化<br>
        <br>
        <a name="111"></a>1.1.1 包名<br>
        <br>
Hibernate3.0的包的根路径为: “org.hibernate”
，而在Hibernate2.1中为“net.sf.hibernate”。这一命名变化使得Hibernate2.1和Hibernate3.0能够同
时在同一个应用程序中运行。<br>
        <br>
        如果希望把已有的应用升级到Hibernate3.0，那么升级的第一步是把Java源程序中的所有“net.sf.hibernate”替换为“org.hibernate”。<br>
        <br>
        Hibernate2.1中的“net.sf.hibernate.expression”包被改名为“org.hibernate.criterion”。假如应用程序使用了Criteria 
        API，那么在升级的过程中，必须把Java源程序中的所有“net.sf.hibernate.expression”替换为“org.hibernate.criterion”。<br>
        <br>
        如果应用使用了除Hibernate以外的其他外部软件，而这个外部软件又引用了Hibernate的接口，那么在升级时必须十分小心。例如EHCache拥有自己的CacheProvider： 
        net.sf.ehcache.hibernate.Provider，在这个类中引用了Hibernate2.1中的接口，在升级应用时，可以采用以下办法之一来升级EHCache:<br>
        <br>
        （1）手工修改net.sf.ehcache.hibernate.Provider类，使它引用Hibernate3.0中的接口。<br>
        （2）等到EHCache软件本身升级为使用Hibernate3.0后，使用新的EHCache软件。<br>
        （3）使用Hibernate3.0中内置的CacheProvider：org.hibernate.cache.EhCacheProvider。<br>
        <br>
        <a name="112"></a> 1.1.2 org.hibernate.classic包<br>
        <br>
        Hibernate3.0把一些被废弃的接口都转移到org.hibernate.classic中。<br>
        <br>
        <a name="113"></a> 1.1.3 Hibernate所依赖的第三方软件包<br>
        <br>
        在Hibernate3.0的软件包的lib目录下的README.txt文件中，描述了Hibernate3.0所依赖的第三方软件包的变化。<br>
        <br>
        <a name="114"></a> 1.1.4 异常模型<br>
        <br>
        在Hibernate3.0中，HibernateException异常以及它的所有子类都继承了java.lang.RuntimeException。因此在编译时，编译器不会再检查HibernateException。<br>
        <br>
        <a name="115"></a>1.1.5 Session接口<br>
        <br>
        在Hibernate3.0中，原来Hibernate2.1的Session接口中的有些基本方法也被废弃，但为了简化升级，这些方法依然是可用的，可以通过org.hibernate.classic.Session子接口来访问它们，例如：<br>
      </p>
      <p><font size="2">org.hibernate.classic.Session session=sessionFactory.openSession();<br>
        session.delete("delete from Customer ");<br>
        </font> </p>
      <p>在Hibernate3.0
中，org.hibernate.classic.Session接口继承了org.hibernate.Session接口，在
org.hibernate.classic.Session接口中包含了一系列被废弃的方法，如find()、interate()等。
SessionFactory接口的openSession()方法返回org.hibernate.classic.Session类型的实例。如果希
望在程序中完全使用Hibernate3.0，可以采用以下方式创建Session实例：<br>
        <br>
        <font size="2">org.hibernate.Session session=sessionFactory.openSession();</font><br>
        <br>
        如果是对已有的程序进行简单的升级，并且希望仍然调用Hibernate2.1中Session的一些接口，可以采用以下方式创建Session实例：<br>
        <br>
        <font size="2">org.hibernate.classic.Session session=sessionFactory.openSession();</font><br>
        <br>
        在Hibernate3.0中，Session接口中被废弃的方法包括：<br>
        * 执行查询的方法：find()、iterate()、filter()和delete(String hqlSelectQuery) <br>
        * saveOrUpdateCopy()<br>
        <br>
        Hibernate3.0一律采用createQuery()方法来执行所有的查询语句，采用DELETE 查询语句来执行批量删除，采用merge()方法来替代 
        saveOrUpdateCopy()方法。</p>
      <p><br>
        <i>提
示：在Hibernate2.1中，Session的delete()方法有几种重载形式，其中参数为HQL查询语句的delete()方法在
Hibernate3.0中被废弃，而参数为Ojbect类型的的delete()方法依然被支持。delete(Object
o)方法用于删除参数指定的对象，该方法支持级联删除。</i></p>
      <p>Hibernate2.1没有对批量更
新和批量删除提供很好的支持，参见&lt;&lt;精通Hibernate&gt;&gt;一书的第13章的13.1.1节（批量更新和批量删除），而
Hibernate3.0对批量更新和批量删除提供了支持，能够直接执行批量更新或批量删除语句，无需把被更新或删除的对象先加载到内存中。以下是通过
Hibernate3.0执行批量更新的程序代码：</p>
      <p><font size="2">Session session = sessionFactory.openSession();<br>
        Transaction tx = session.beginTransaction();</font></p>
      <p><font size="2">String hqlUpdate = "update Customer set name = :newName 
        where name = :oldName";<br>
        int updatedEntities = s.createQuery( hqlUpdate )<br>
        .setString( "newName", newName )<br>
        .setString( "oldName", oldName )<br>
        .executeUpdate();<br>
        tx.commit();<br>
        session.close();</font></p>
      <p>以下是通过Hibernate3.0执行批量删除的程序代码：</p>
      <p><font size="2">Session session = sessionFactory.openSession();<br>
        Transaction tx = session.beginTransaction();</font></p>
      <p><font size="2">String hqlDelete = "delete Customer where name = 
        :oldName";<br>
        int deletedEntities = s.createQuery( hqlDelete )<br>
        .setString( "oldName", oldName )<br>
        .executeUpdate();<br>
        tx.commit();<br>
        session.close();</font><br>
        <br>
        <a name="116"></a>1.1.6 createSQLQuery()<br>
        <br>
        在Hibernate3.0中，Session接口的createSQLQuery()方法被废弃，被移到org.hibernate.classic.Session接口中。Hibernate3.0采用新的SQLQuery接口来完成相同的功能。<br>
        <br>
        <a name="117"></a> 1.1.7 Lifecycle 和 Validatable 接口<br>
        <br>
        Lifecycle和Validatable 接口被废弃，并且被移到org.hibernate.classic包中。<br>
        <br>
        <a name="118"></a> 1.1.8 Interceptor接口<br>
        <br>
在Interceptor 接口中加入了两个新的方法。
用户创建的Interceptor实现类在升级的过程中，需要为这两个新方法提供方法体为空的实现。此外，instantiate()方法的参数作了修
改，isUnsaved()方法被改名为isTransient()。<br>
        <br>
        <a name="119"></a>1.1.9 UserType和CompositeUserType接口<br>
        <br>
        在UserType和CompositeUserType接口中都加入了一些新的方法，这两个接口被移到org.hibernate.usertype包中，用户定义的UserType和CompositeUserType实现类必须实现这些新方法。</p>
      <p>Hibernate3.0提供了ParameterizedType接口，用于更好的重用用户自定义的类型。</p>
      <p><a name="1110"></a>1.1.10 FetchMode类<br>
        <br>
        FetchMode.LAZY 和 FetchMode.EAGER被废弃。取而代之的分别为FetchMode.SELECT 和FetchMode.JOIN。<br>
        <br>
        <a name="1111"> </a>1.1.11 PersistentEnum类<br>
        <br>
        PersistentEnum被废弃并删除。已经存在的应用应该采用UserType来处理枚举类型。<br>
        <br>
        <a name="1112"></a>1.1.12 对Blob 和Clob的支持<br>
        <br>
        Hibernate对Blob和Clob实例进行了包装，使得那些拥有Blob或Clob类型的属性的类的实例可以被游离、序列化或反序列化，以及传递到merge()方法中。<br>
        <br>
        <a name="1113"></a>1.1.13 Hibernate中供扩展的API的变化<br>
        <br>
        org.hibernate.criterion、 org.hibernate.mapping、 org.hibernate.persister和org.hibernate.collection 
        包的结构和实现发生了重大的变化。多数基于Hibernate <br>
        2.1 的应用不依赖于这些包，因此不会被影响。如果你的应用扩展了这些包中的类，那么必须非常小心的对受影响的程序代码进行升级。<br>
        <br>
        <a name="12"></a> 1.2 元数据的变化<br>
        <br>
        <a name="121"></a>1.2.1 检索策略<br>
        <br>
在Hibernate2.1中，lazy属性的默认值为“false”，而在Hibernate3.0中，lazy属性的默认值为“true”。在升级映
射文件时，如果原来的映射文件中的有关元素，如&lt;set&gt;、&lt;class&gt;等没有显式设置lazy属性，那么必须把它们都显式的
设置为lazy=“true”。如果觉得这种升级方式很麻烦，可以采取另一简单的升级方式：在&lt;hibernate-mapping&gt;元素中
设置: default-lazy=“false”。 <br>
        <br>
        <a name="122"></a> 1.2.2 对象标识符的映射<br>
        <br>
        unsaved-value属性是可选的，在多数情况下，Hibernate3.0将把unsaved-value="0" 作为默认值。<br>
        <br>
在Hibernate3.0中，当使用自然主键和游离对象时，不再强迫实现Interceptor.isUnsaved()方法。
如果没有设置这个方法，当Hibernate3.0无法区分对象的状态时，会查询数据库，来判断这个对象到底是临时对象，还是游离对象。不过，显式的使用
Interceptor.isUnsaved()方法会获得更好的性能，因为这可以减少Hibernate直接访问数据库的次数。<br>
        <br>
        <a name="123"></a>1.2.3 集合映射<br>
        <br>
        &lt;index&gt;元素在某些情况下被&lt;list-index&gt;和&lt;map-key&gt;元素替代。此外，Hibernate3.0用&lt;map-key-many-to-many&gt; 
        元素来替代原来的&lt;key-many-to-many&gt;.元素，用&lt;composite-map-key&gt;元素来替代原来的&lt;composite-index&gt;元素。<br>
        <br>
        <a name="124"></a>1.2.4 DTD<br>
        <br>
        对象-关系映射文件中的DTD文档，由原来的：<br>
        http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd <br>
        改为：<br>
        http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd<br>
        <br>
        <a name="13"></a>1.3 查询语句的变化<br>
        <br>
Hibernate3.0
采用新的基于ANTLR的HQL/SQL查询翻译器，不过，Hibernate2.1的查询翻译器也依然存在。在Hibernate的配置文件中，
hibernate.query.factory_class属性用来选择查询翻译器。例如：<br>
        （1）选择Hibernate3.0的查询翻译器：<br>
        hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory<br>
        （2）选择Hibernate2.1的查询翻译器<br>
        hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory</p>
      <p><br>
        <i>提示：ANTLR是用纯Java语言编写出来的一个编译工具，它可生成Java语言或者是C++的词法和语法分析器，并可产生语法分析树并对该树进行遍历。ANTLR由于是纯Java的，因此可以安装在任意平台上，但是需要JDK的支持。</i></p>
      Hibernate开发小组尽力保证Hibernate3.0的查询翻译器能够支持Hibernate2.1的所有查询语句。不过，对于许多已经存在的应用，在升级过程中，也不妨仍然使用Hibernate2.1的查询翻译器。<br>
值得注意的是，
Hibernate3.0的查询翻译器存在一个Bug：不支持某些theta-style连结查询方言：如Oracle8i的OracleDialect
方言、Sybase11Dialect。解决这一问题的办法有两种：（1）改为使用支持ANSI-style连结查询的方言，如
Oracle9Dialect,（2）如果升级的时候遇到这一问题，那么还是改为使用Hibernate2.1的查询翻译器。<br>
        <br>
        <a name="131"></a>1.3.1 indices()和elements()函数<br>
        <br>
        在HQL的select子句中废弃了indices()和elements()函数，因为这两个函数的语法很让用户费解，可以用显式的连接查询语句来替代 
        select elements(...) 。而在HQL的where子句中，仍然可以使用elements()函数。<img src ="http://www.blogjava.net/Vencent/aggbug/31463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent.Chen</a> 2006-02-19 14:31 <a href="http://www.blogjava.net/Vencent/articles/31463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈hibernate性能优化的几点建议</title><link>http://www.blogjava.net/Vencent/articles/31333.html</link><dc:creator>Vincent.Chen</dc:creator><author>Vincent.Chen</author><pubDate>Sat, 18 Feb 2006 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/31333.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/31333.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/31333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/31333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/31333.html</trackback:ping><description><![CDATA[1、针对oracle数据库而言，Fetch Size
是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数，一般设置为30、50、100。Oracle数据库的JDBC驱动默认
的Fetch Size=15，设置Fetch
Size设置为：30、50，性能会有明显提升，如果继续增大，超出100，性能提升不明显，反而会消耗内存。<br>&nbsp;&nbsp;&nbsp; 即在hibernate配制文件中进行配制：<br>&nbsp;
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">property&nbsp;name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">hibernateProperties</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">props</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">prop&nbsp;key</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">hibernate.dialect</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">org.hibernate.dialect.Oracle9Dialect</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">prop</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">prop&nbsp;key</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">hibernate.show_sql</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">prop</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;!--</span><span style="color: rgb(0, 0, 0);">&nbsp;Create</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">update&nbsp;the&nbsp;database&nbsp;tables&nbsp;automatically&nbsp;when&nbsp;the&nbsp;JVM&nbsp;starts&nbsp;up<br></span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">prop&nbsp;key</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">hibernate.hbm2ddl.auto</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">update</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">prop</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">--&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;!--</span><span style="color: rgb(0, 0, 0);">&nbsp;Turn&nbsp;batching&nbsp;off&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;better&nbsp;error&nbsp;messages&nbsp;under&nbsp;PostgreSQL&nbsp;<br></span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">prop&nbsp;key</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">hibernate.jdbc.batch_size</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">prop</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">--&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">prop&nbsp;key</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">hibernate.jdbc.batch_size</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">50</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">prop</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">props</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">property</span><span style="color: rgb(0, 0, 0);">&gt;</span></div>Fetch Size设的越大，读数据库的次数越少，速度越快；Fetch Size越小，读数据库的次数越多，速度越慢。<br>2、如果是超大的系统，建议生成htm文件。加快页面提升速度。<br>3、不要把所有的责任推在hibernate上，对代码进行重构，减少对数据库的操作，尽量避免在数据库查询时使用in操作，以及避免递归查询操作，代码质量、系统设计的合理性决定系统性能的高低。<br>4、&nbsp;对大数据量查询时，慎用list()或者iterator()返回查询结果， <br>&nbsp;&nbsp;&nbsp;&nbsp; （1）. 使用List()返回结果时，Hibernate会所有查询结果初始化为持久化对象，结果集较大时，会占用很多的处理时间。 <br>&nbsp;&nbsp;&nbsp;&nbsp;
（2）.
而使用iterator()返回结果时，在每次调用iterator.next()返回对象并使用对象时，Hibernate才调用查询将对应的对象初始
化，对于大数据量时，每调用一次查询都会花费较多的时间。当结果集较大，但是含有较大量相同的数据，或者结果集不是全部都会使用时，使用iterator
()才有优势。<br>5、在一对多、多对一的关系中，使用延迟加载机制，会使不少的对象在使用时方会初始化，这样可使得节省内存空间以及减少数据库的负荷，而且若PO中的集合没有被使用时，就可减少互数据库的交互从而减少处理时间。 <br>6、对含有关联的PO（持久化对象）时，若default-cascade="all"或者 “save-update”，新增PO时，请注意对PO中的集合的赋值操作，因为有可能使得多执行一次update操作。&nbsp;<br>7、
对于大数据量新增、修改、删除操作或者是对大数据量的查询，与数据库的交互次数是决定处理时间的最重要因素，减少交互的次数是提升效率的最好途径，所以在
开发过程中，请将show_sql设置为true，深入了解Hibernate的处理过程，尝试不同的方式，可以使得效率提升。尽可能对每个页面的显示，
对数据库的操作减少到100----150条以内。越少越好。<br>以上是在进行struts+hibernate+spring进行项目开发中，对hibernate性能优化的几点心得。<img src ="http://www.blogjava.net/Vencent/aggbug/31333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent.Chen</a> 2006-02-18 12:40 <a href="http://www.blogjava.net/Vencent/articles/31333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>