??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品美女www爽爽爽,国产精品狼人久久影院观看方式,久久精品人人http://www.aygfsteel.com/Crying/category/25484.htmlZ自己zh-cnTue, 18 Sep 2007 00:42:01 GMTTue, 18 Sep 2007 00:42:01 GMT60持久层的3U状?/title><link>http://www.aygfsteel.com/Crying/articles/145964.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 17 Sep 2007 12:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/Crying/articles/145964.html</guid><wfw:comment>http://www.aygfsteel.com/Crying/comments/145964.html</wfw:comment><comments>http://www.aygfsteel.com/Crying/articles/145964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Crying/comments/commentRss/145964.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Crying/services/trackbacks/145964.html</trackback:ping><description><![CDATA[<table width="97%" border="0"> <tbody> <tr> <td width="94%"> <div align="center"><font size="4">持久化层的Java对象可处于哪些状态?q些状态有哪些特征Q?/font><br /> <br /> <font size="2">选自<<_NHibernateQJava对象持久化技术详?gt;> 作者:<a ><font color="#996666">孙卫?/font></a> 来源:www.javathinker.org<br /> </font></div> </td> </tr> <tr> <td width="94%"> <p>当应用程序通过new语句创徏了一个对象,q个对象的生命周期就开始了Q当不再有Q何引用变量引用它Q这个对象就l束生命周期Q它占用的内存就可以被JVM的垃圑֛收器回收。对于需要被持久化的Java对象Q在它的生命周期中,可处于以下三个状态之一Q?br /> <br /> (1) 临时状态(transientQ:刚刚用new语句创徏Q还没有被持久化Q不处于Session的缓存中。处于(f)时状态的Java对象被称Z(f)时对象?br /> (2) 持久化状态(persistentQ:已经被持久化Q加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象?br /> (3) 游离状态(detachedQ:已经被持久化Q但不再处于Session的缓存中。处于游ȝ态的Java对象被称为游d象?br /> <img src="http://www.javathinker.org/image/hibernate_essay_5_1.gif" alt="" /></p> <p>?为Java对象的完整状态{换图QSession的特定方法触发Java对象׃个状态{换到另一个状态。从?看出Q当Java对象处于临时状态或游离状态,只要不被M变量引用Q就会结束生命周期,它占用的内存可以被JVM的垃圑֛收器回收Q当处于持久化状态,׃Session的缓存会引用它,因此它始l处于生命周期中?br /> <br /> <br /> <strong>临时对象的特?/strong><br /> <br /> 临时对象h以下特征Q?br /> (1) 不处于Session的缓存中Q也可以_不被M一个Session实例兌?br /> (2) 在数据库中没有对应的记录?<br /> <br /> 在以下情况下QJava对象q入临时状态:<br /> (1) 当通过new语句刚创Z一个Java对象Q它处于临时状态,此时不和数据库中的Q何记录对应?br /> (2) Session的delete()Ҏ(gu)能一个持久化对象或游d象{变ؓ临时对象。对于游d象,delete()Ҏ(gu)从数据库中删除与它对应的记录Q对于持久化对象Qdelete()Ҏ(gu)从数据库中删除与它对应的记录Qƈ且把它从Session的缓存中删除?/p> <p><strong>持久化对象的特征<br /> </strong><br /> 持久化对象具有以下特征:<br /> (1) 位于一个Session实例的缓存中Q也可以_持久化对象L被一个Session实例兌?br /> (2) 持久化对象和数据库中的相兌录对应?br /> (3) Session在清理缓存时Q会Ҏ(gu)持久化对象的属性变化,来同步更新数据库?br /> <br /> Session的许多方法都能够触发Java对象q入持久化状态:<br /> (1) Session的save()Ҏ(gu)把(f)时对象{变ؓ持久化对象?br /> (2) Session的load()或get()Ҏ(gu)q回的对象L处于持久化状态?br /> (3) Session的find()Ҏ(gu)q回的List集合中存攄都是持久化对象?br /> (4) Session的update()、saveOrUpdate()和lock()Ҏ(gu)使游d象{变ؓ持久化对象?<font color="#ff0000">nate?/font>:Ҏ(gu)hibernate reference的说法当试图用update更新一个持久化对象时会抛异?<br /> (5)当一个持久化对象兌一个(f)时对象,在允许联保存的情况下,Session在清理缓存时会把q个临时对象也{变ؓ持久化对象?<br /> <br /> Hibernate保证在同一个Session实例的缓存中Q数据库表中的每条记录只对应惟一的持久化对象。例如对于以下代码,共创Z两个Session实例Qsession1和session2。session1和session2拥有各自的缓存。在session1的缓存中Q只会有惟一的OID?的Customer持久化对象,在session2的缓存中Q也只会有惟一的OID?的Customer持久化对象。因此在内存中共有两个Customer持久化对象,一个属于session1的缓存,一个属于session2的缓存。引用变量a和b都引用session1~存中的Customer持久化对象,而引用变量c引用session2~存中的Customer持久化对象:<br /> <br /> Session session1=sessionFactory.openSession();<br /> Session session2=sessionFactory.openSession();<br /> Transaction tx1 = session1.beginTransaction();<br /> Transaction tx2 = session2.beginTransaction();</p> <p>Customer a=(Customer)session1.load(Customer.class,new Long(1)); <br /> Customer b=(Customer)session1.load(Customer.class,new Long(1)); <br /> Customer c=(Customer)session2.load(Customer.class,new Long(1)); </p> <p>System.out.println(a= =b); //true<br /> System.out.println(a= =c); //false</p> <p>tx1.commit();<br /> tx2.commit();<br /> session1.close();<br /> session2.close();<br /> <br /> Java对象的持久化状态是相对于某个具体的Session实例的,以下代码试图使一个Java对象同时被两个Session实例兌Q?br /> <br /> Session session1=sessionFactory.openSession();<br /> Session session2=sessionFactory.openSession();<br /> Transaction tx1 = session1.beginTransaction();<br /> Transaction tx2 = session2.beginTransaction();</p> <p>Customer c=(Customer)session1.load(Customer.class,new Long(1)); //Customer对象被session1兌<br /> session2.update(c); //Customer对象被session2兌<br /> c.setName("Jack"); //修改Customer对象的属?/p> <p>tx1.commit(); //执行update语句<br /> tx2.commit(); //执行update语句<br /> session1.close();<br /> session2.close();</p> <p>当执行session1的load()Ҏ(gu)ӞOID?的Customer对象被加入到session1的缓存中Q因此它是session1的持久化对象Q此时它q没有被session2兌Q因此相对于session2Q它处于游离状态。当执行session2的update()Ҏ(gu)ӞCustomer对象被加入到session2的缓存中Q因此也成ؓsession2的持久化对象。接下来修改Customer对象的name属性,会导致两个Session实例在清理各自的~存Ӟ都执行相同的update语句Q?br /> <br /> update CUSTOMERS set NAME='Jack' …… where ID=1;<br /> 在实际应用程序中Q应该避免一个Java对象同时被多个Session实例兌Q因会导致重复执行SQL语句Qƈ且极Ҏ(gu)出现一些ƈ发问题?br /> </p> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/Crying/aggbug/145964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Crying/" target="_blank">Crying</a> 2007-09-17 20:33 <a href="http://www.aygfsteel.com/Crying/articles/145964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的检索策略小l?/title><link>http://www.aygfsteel.com/Crying/articles/145951.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 17 Sep 2007 11:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/Crying/articles/145951.html</guid><wfw:comment>http://www.aygfsteel.com/Crying/comments/145951.html</wfw:comment><comments>http://www.aygfsteel.com/Crying/articles/145951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Crying/comments/commentRss/145951.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Crying/services/trackbacks/145951.html</trackback:ping><description><![CDATA[ Hibernate的检索策略包括类U别索策略和兌U别索策略? <p>  cȝ别检索策略有立即索和延迟索,默认的检索策略是立即索。在Hibernate映射文g中,通过?lt;class>上配|lazy属性来定索策略。对于Session的检索方式,cȝ别检索策略仅适用于loadҎ(gu)Q也pQ对于get、qurey索,持久化对象都会被立即加蝲而不lazy是falseq是true.一般来_我们索对象就是要讉K它,因此立即索是通常的选择。由于loadҎ(gu)在检索不到对象时会抛出异常(立即索的情况下)Q因此我个hq不使用load索;而由?lt;class>中的lazy属性还影响到多对一及一对一的检索策略,因此使用loadҎ(gu)更没必要了?/p> <p>  兌U别索策略有立即索、gq检索和q切左外q接索。对于关联别检索,又可分ؓ一对多和多对多、多对一和一对一两种情况讨论?/p> <p>  一对多和多对多兌关系一般?lt;set>配置?lt;set>有lazy和outer-join属性,它们的不同取值绝对了索策略?/p> <p>  1Q立x索:q是一对多默认的检索策略,此时lazy=falseQouter-join=false.管q是默认的检索策略,但如果关联的集合是无用的Q那么就不要使用q种索方式?/p> <p>  2Qgq检索:此时lazy=trueQouter-join=falseQouter-join=true是无意义的)Q这是优先考虑的检索方式?/p> <p>  3Q迫切左外连接检索:此时 lazy=falseQouter-join=trueQ这U检索策略只适用于依靠id索方式(load、getQ,而不适用于query的集合检索(它会采用立即索策略)。相比于立即索,q种索策略减了一条sql语句Q但在Hibernate中,只能有一?lt;set>配置?outer-join=true.</p> <p>  多对一和一对一索策略一般?lt;many-to-one>?lt;one-to-one>配置?lt;many-to-one>中需要配|的属性是 outer-joinQ同时还需要配|one端关联的<class>的lazy属性(配置的可不是<many-to-one>中的lazy哦)Q它们的l合后的索策略如下:</p> <p>  1Q?outer-join=autoQ这是默认|如果lazy=true为gq检索,如果lazy=false切左外连接检索?/p> <p>  2Q?outer-join=trueQ无关于lazyQ都切左外连接检索?/p> <p>  3Q?outer-join=falseQ如果lazy=true为gq检索,否则为立x索?/p> <p>  可以看到Q在默认的情况下Qouter-join=autoQlazy=falseQ,对关联的one端对象Hibernate采用的迫切左外连接检索。依我看Q很多情况下Q我们ƈ不需要加载one端关联的对象Q很可能我们需要的仅仅是关联对象的idQ;另外Q如果关联对象也采用了迫切左外连接检索,׃出现select语句中有多个外连接表Q如果个数多的话会媄响检索性能Q这也是Z么Hibernate通过hibernate.max_fetch_depth属性来控制外连接的深度。对于迫切左外连接检索,query的集合检索ƈ不适用Q它会采用立x索策略?/p> <p>  对于索策略,需要根据实际情况进行选择。对于立x索和延迟索,它们的优点在于select语句单(每张表一条语句)、查询速度快,~点在于兌表时需要多条select语句Q增加了讉K数据库的频率。因此在选择x索和延迟索时Q可以考虑使用扚w索策略来减少select语句的数量(配置batch-size属性)。对于切左外q接索,优点在于select较少Q但~点是select语句的复杂度提高Q多表之间的兌会是很耗时的操作。另外,配置文g是死的,但程序是zȝQ可以根据需要在E序里显C的指定索策略(可能l常需要在E序中显C指定迫切左外连接检索)。ؓ了清楚检索策略的配置效果如何Q可以配|show_sql属性查看程序运行时Hibernate执行的sql语句?/p> <img src ="http://www.aygfsteel.com/Crying/aggbug/145951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Crying/" target="_blank">Crying</a> 2007-09-17 19:45 <a href="http://www.aygfsteel.com/Crying/articles/145951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>one-to-many 和one-to-onehttp://www.aygfsteel.com/Crying/articles/142039.htmlCryingCryingSun, 02 Sep 2007 02:21:00 GMThttp://www.aygfsteel.com/Crying/articles/142039.htmlhttp://www.aygfsteel.com/Crying/comments/142039.htmlhttp://www.aygfsteel.com/Crying/articles/142039.html#Feedback0http://www.aygfsteel.com/Crying/comments/commentRss/142039.htmlhttp://www.aygfsteel.com/Crying/services/trackbacks/142039.html创徏 db_iteam?nbsp;

    create table db_iteam(
          id  int identity not null,
         iteamNum"char(10) not null,
         paId int null,
         primary key ("id")
    )
go

/*************/
创徏db_user?br />
    create table db_user (
        id   int identity not null,
       name char(10) not null,
       iteamId int null,
        primary key ("id")
    )
/***********************/
创徏db_passport
 create table db_passport(
        "id" int not null,  //主键兌与db_user
       "number" char(10) not null,
        primary key ("id")
    )
go
*******************
               vo:
*******************
package wsq.vo;

import java.util.HashSet;
import java.util.Set;

public class DbIteam implements java.io.Serializable {

 private Integer id;

 private String iteamNum;
 private DbIteam subIteam;

 private Set subIteams=new HashSet();
 
 private Set users=new HashSet();

 public Set getUsers() {
  return users;
 }

 public void setUsers(Set users) {
  this.users = users;
 }
 public DbIteam() {
 }
 public DbIteam(String iteamNum) {
  this.iteamNum = iteamNum;
 }

 public Integer getId() {
  return this.id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getIteamNum() {
  return this.iteamNum;
 }

 public void setIteamNum(String iteamNum) {
  this.iteamNum = iteamNum;
 }

 public DbIteam getSubIteam() {
  return subIteam;
 }

 public void setSubIteam(DbIteam subIteam) {
  this.subIteam = subIteam;
 }

 public Set getSubIteams() {
  return subIteams;
 }

 public void setSubIteams(Set subIteams) {
  this.subIteams = subIteams;
 }

}


******************

package wsq.vo;

public class DbUser implements java.io.Serializable {

 private Integer id;

 private String name;
   
 private DbIteam dbIteam;
 private DbPassport  dbPassport;

    
 public DbPassport getDbPassport() {
  return dbPassport;
 }

 public void setDbPassport(DbPassport dbPassport) {
  this.dbPassport = dbPassport;
 }

  public DbUser() {
 }
 public DbUser(String name) {
  this.name = name;
 }

 public Integer getId() {
  return this.id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

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

 public void setName(String name) {
  this.name = name;
 }
 public String toString()
 {
  return name+"   试Q?;
 }

 public DbIteam getDbIteam() {
  return dbIteam;
 }

 public void setDbIteam(DbIteam dbIteam) {
  this.dbIteam = dbIteam;
 }

}

/**********************************/

package wsq.vo;

public class DbPassport implements java.io.Serializable {

 private Integer id;

 private String number;

 private DbUser dbUser;

 public DbUser getDbUser() {
  return dbUser;
 }

 public void setDbUser(DbUser dbUser) {
  this.dbUser = dbUser;
 }

 public DbPassport() {
 }
 public DbPassport(String number) {
  this.number = number;
 }

 public Integer getId() {
  return this.id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getNumber() {
  return this.number;
 }

 public void setNumber(String number) {
  this.number = number;
 }

}

/******************************/
配置DbIteam.hbm.xml

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
 Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
 <class name="wsq.vo.DbIteam" table="db_iteam" schema="dbo"
  catalog="dbs" >
  <id name="id" type="java.lang.Integer">
   <column name="id" />
   <generator class="native" />
  </id>
  <property name="iteamNum" type="java.lang.String">
   <column name="iteamNum" length="10" not-null="true" />
  </property>
  
   <many-to-one name="subIteam" class="wsq.vo.DbIteam" column="paId"  /> 
 
  
  <set name="users" cascade="all" table="db_user" lazy="true" batch-size="5">
   <key column="iteamId"></key>
   <one-to-many class="wsq.vo.DbUser" />
  </set>
  <set name="subIteams" cascade="all" table="db_iteam" lazy="true" batch-size="5">
   <key column="paId"></key>
   <one-to-many class="wsq.vo.DbIteam" />
  </set>
 </class>
</hibernate-mapping>


配置DbUser.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="wsq.vo.DbUser" table="db_user" schema="dbo" catalog="dbs">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="10" not-null="true" />
        </property>
        
        <many-to-one name="dbIteam" class="wsq.vo.DbIteam" column="iteamId" outer-join="true"  ></many-to-one>
       
        <one-to-one name="dbPassport" class="wsq.vo.DbPassport" cascade="all" ></one-to-one>
    </class>
</hibernate-mapping>

配置DbPassport.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
 Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
 <class name="wsq.vo.DbPassport" table="db_passport" schema="dbo"
  catalog="dbs">
  <id name="id" type="java.lang.Integer">
   <column name="id" />
   <generator class="foreign" >
   <param name="property">dbUser</param>
   </generator>
  </id>
  <property name="number" type="java.lang.String">
   <column name="number" length="10" not-null="true" />
  </property>
  <one-to-one name="dbUser" class="wsq.vo.DbUser" constrained="true"></one-to-one>
 </class>
</hibernate-mapping>


/*******************
试c?br />

package wsq.vo;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Transaction;

public class Test {
 private static final Log log = LogFactory.getLog(Test.class);

 Test() {

 }

 public static void main(String[] args) {
  BaseHibernateDAO basedao = new BaseHibernateDAO( );
  DbIteamDAO iteamDAO = new DbIteamDAO( );
  DbUserDAO userDAO = new DbUserDAO( );

  DbIteam iteam = new DbIteam( );
  DbIteam iteam3 = new DbIteam( );
  
  DbUser user = new DbUser( );
  DbPassport ps = new DbPassport( );
  
  Transaction tx = basedao.getSession( ).beginTransaction( );
  
  iteam.setIteamNum("2");
  
  iteam.setSubIteam(iteamDAO.findById(16));   //iteamDAO.findById(16)扑ֈ的是一U?nbsp; 此处d?U?br />   
  
  
  iteam3.setIteamNum("3");
  
  iteam3.setSubIteam(iteam);//3U?br />   
  user.setName("djg");

  user.setDbIteam(iteam3);

  ps.setNumber("48");

  user.setDbPassport(ps);

  ps.setDbUser(user);

  
  // iteamDAO.delete(iteamDAO.findById(23));
  iteamDAO.save(iteam);
  iteamDAO.save(iteam3);
  userDAO.save(user);
  log.info("ok!!!!!!    !!ok!!!  ok!     111111111111111111  !!  !");
  tx.commit(  );

 }

}








 



Crying 2007-09-02 10:21 发表评论
]]>
Hibernate中的一个表对应多个VOhttp://www.aygfsteel.com/Crying/articles/142038.htmlCryingCryingSun, 02 Sep 2007 01:54:00 GMThttp://www.aygfsteel.com/Crying/articles/142038.htmlhttp://www.aygfsteel.com/Crying/comments/142038.htmlhttp://www.aygfsteel.com/Crying/articles/142038.html#Feedback0http://www.aygfsteel.com/Crying/comments/commentRss/142038.htmlhttp://www.aygfsteel.com/Crying/services/trackbacks/142038.html      PersonOne
         id;   role;   username;   password; sex;  birthday;   grade;  schoolage;

  ////////////////////// /****///////////////****///////////////////********/////////////////////////////
VO :

 

package wsq.po;

import java.util.Date;

public class PersonOne implements java.io.Serializable {

 private static final long serialVersionUID = 3694568337955384021L;

 private Integer id;

 private String role;

 private String username;

 private String password;

 private String sex;

 private Date birthday;

// private String grade;
// private String schoolage;

 public PersonOne() {
 }

 
 public PersonOne(String role, String username, String password, String sex,
   Date birthday, String grade, String schoolage) {
  this.role = role;
  this.username = username;
  this.password = password;
  this.sex = sex;
  this.birthday = birthday;
  //this.grade = grade;
  //this.schoolage = schoolage;
 }
 public Integer getId() {
  return this.id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getRole() {
  return this.role;
 }

 public void setRole(String role) {
  this.role = role;
 }

 public String getUsername() {
  return this.username;
 }

 public void setUsername(String username) {
  this.username = username;
 }

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

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

 public String getSex() {
  return this.sex;
 }

 public void setSex(String sex) {
  this.sex = sex;
 }

 public Date getBirthday() {
  return this.birthday;
 }

 public void setBirthday(Date birthday) {
  this.birthday = birthday;
 }

// public String getGrade() {
//  return this.grade;
// }
//
// public void setGrade(String grade) {
//  this.grade = grade;
// }
//
// public String getSchoolage() {
//  return this.schoolage;
// }
//
// public void setSchoolage(String schoolage) {
//  this.schoolage = schoolage;
// }

}


Student:  
    

package wsq.po;

public class Student extends PersonOne implements java.io.Serializable {

 private static final long serialVersionUID = -2981420482383402755L;

 
 private String grade;

    public String getGrade() {
  return this.grade;
 }

 public void setGrade(String grade) {
  this.grade = grade;
 }

}

Teacher :
package wsq.po;

public class Teacher extends PersonOne implements java.io.Serializable {


 private static final long serialVersionUID = -8404469876025711535L;

 private String schoolage;

 public String getSchoolage() {
  return schoolage;
 }

public void setSchoolage(String schoolage) {
  this.schoolage = schoolage;
 }
}

配置Q?br />

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
 Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
 <class name="wsq.po.PersonOne" table="personOne" schema="dbo"
  catalog="J2EE">
  <id name="id" type="java.lang.Integer">
   <column name="id" />
   <generator class="increment" />
  </id>
            <!--  important   -->
  <discriminator column="role" type="java.lang.String"/>

  
  <property name="username" type="java.lang.String">
   <column name="username" length="20" not-null="true" />
  </property>
  <property name="password" type="java.lang.String">
   <column name="password" length="20" not-null="true" />
  </property>
  <property name="sex" type="java.lang.String">
   <column name="sex" length="5" not-null="true" />
  </property>
  <property name="birthday" type="java.util.Date">
   <column name="birthday" length="23" not-null="true" />
  </property>
  
  
  
  <subclass name="wsq.po.Student" discriminator-value="1">
   <property name="grade" column="grade" type="java.lang.String" />
  </subclass>
  <subclass name="wsq.po.Teacher" discriminator-value="2">
   <property name="schoolage" column="schoolage" type="java.lang.String" />
  </subclass>

 </class>
</hibernate-mapping>


 




Crying 2007-09-02 09:54 发表评论
]]>
Hibernate中?/title><link>http://www.aygfsteel.com/Crying/articles/142033.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sun, 02 Sep 2007 01:30:00 GMT</pubDate><guid>http://www.aygfsteel.com/Crying/articles/142033.html</guid><wfw:comment>http://www.aygfsteel.com/Crying/comments/142033.html</wfw:comment><comments>http://www.aygfsteel.com/Crying/articles/142033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Crying/comments/commentRss/142033.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Crying/services/trackbacks/142033.html</trackback:ping><description><![CDATA[首先<br />      创徏表(mssqlQ?nbsp; 及vo      <p><span style="color: #ff00ff">person ?/span><br />        id;(主键) int;<br />        username  varchar;<br />        password  varchar;<br />          sex   varchar;<br />        birthday  DateTime;<br /> *******************<br /> <span style="color: #ff00ff">student?nbsp;</span> <br />     id;(主键)<br />     <br />     grade  varchar;</p> <p>*******************<br /> <span style="color: #ff00ff">teacher?/span><br />     id;(主键)<br />    schoolage varchar;</p> <p>/////////////////////******////////////////////////////////<br /> 再创建VO<br /> <span style="color: #ff00ff">Person  </span></p> <p>package wsq.po;</p> <p>import java.util.Date;<br /> public class Person implements java.io.Serializable {<br />  private static final long serialVersionUID = -4431851578811178858L;</p> <p> private Integer id;</p> <p> private String username;</p> <p> private String password;</p> <p> private String sex;</p> <p> private Date birthday;<br />  public Person() {<br />  }<br />  public Person(String username, String password, String sex, Date birthday) {<br />   this.username = username;<br />   this.password = password;<br />   this.sex = sex;<br />   this.birthday = birthday;<br />  }</p> <p> public Integer getId() {<br />   return this.id;<br />  }</p> <p> public void setId(Integer id) {<br />   this.id = id;<br />  }</p> <p> public String getUsername() {<br />   return this.username;<br />  }</p> <p> public void setUsername(String username) {<br />   this.username = username;<br />  }</p> <p> public String getPassword() {<br />   return this.password;<br />  }</p> <p> public void setPassword(String password) {<br />   this.password = password;<br />  }</p> <p> public String getSex() {<br />   return this.sex;<br />  }</p> <p> public void setSex(String sex) {<br />   this.sex = sex;<br />  }</p> <p> public Date getBirthday() {<br />   return this.birthday;<br />  }</p> <p> public void setBirthday(Date birthday) {<br />   this.birthday = birthday;<br />  }</p> <p>}</p> <p style="color: #ff00ff"> Student  </p>     注意id属性没有了 <p>package wsq.po;<br /> public class Student extends Person implements java.io.Serializable {</p> <p> private static final long serialVersionUID = -2981420482383402755L;<br />  private String grade;<br />  public Student() {<br />  }</p> <p> public String getGrade() {<br />   return this.grade;<br />  }</p> <p> public void setGrade(String grade) {<br />   this.grade = grade;<br />  }</p> <p>}</p> <p style="color: #ff00ff">Teacher <br />    </p> <p>package wsq.po;</p> <p>public class Teacher extends Person implements java.io.Serializable {</p> <p><br />  private static final long serialVersionUID = -8404469876025711535L;</p> <p> private String schoolage;</p> <p>  public Teacher() {<br />  }</p> <p> public String getSchoolage() {<br />   return this.schoolage;<br />  }</p> <p> public void setSchoolage(String schoolage) {<br />   this.schoolage = schoolage;<br />  }</p> <p>}<br /> <span style="color: #000080">////////////////////****************/////////////////////////<br /> 最关键的就是配|了<br />   <?xml version="1.0" encoding="utf-8"?><br /> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br /> "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><br /> <!-- <br />     Mapping file autogenerated by MyEclipse Persistence Tools<br /> --><br /> <hibernate-mapping><br />     <class name="wsq.po.Person" table="person" schema="dbo" catalog="J2EE"><br />         <id name="id" type="java.lang.Integer"><br />             <column name="id" /><br />             <generator class="increment" /><br />         </id><br />         <property name="username" type="java.lang.String"><br />             <column name="username" length="20" not-null="true" /><br />         </property><br />         <property name="password" type="java.lang.String"><br />             <column name="password" length="20" not-null="true" /><br />         </property><br />         <property name="sex" type="java.lang.String"><br />             <column name="sex" length="2" not-null="true" /><br />         </property><br />         <property name="birthday" type="java.util.Date"><br />             <column name="birthday" length="8" not-null="true" /><br />         </property><br />    <span style="color: #0000ff">  <joined-subclass name="wsq.po.Student" table="student"><br />          <key column="id"/><br />          <property name="grade" type="java.lang.String" column="grade" /><br />      </joined-subclass><br />      <joined-subclass name="wsq.po.Teacher" table="teacher"><br />          <key column="id"/><br />         <property name="schoolage" type="java.lang.String" column="schoolage" /><br />      </joined-subclass><br /> </span>    </class><br /> </hibernate-mapping><br /> </span></p> <img src ="http://www.aygfsteel.com/Crying/aggbug/142033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Crying/" target="_blank">Crying</a> 2007-09-02 09:30 <a href="http://www.aygfsteel.com/Crying/articles/142033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PO VO BO DTO POJO DAO 之间的关p(转蝲Q?/title><link>http://www.aygfsteel.com/Crying/articles/141927.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sat, 01 Sep 2007 06:44:00 GMT</pubDate><guid>http://www.aygfsteel.com/Crying/articles/141927.html</guid><wfw:comment>http://www.aygfsteel.com/Crying/comments/141927.html</wfw:comment><comments>http://www.aygfsteel.com/Crying/articles/141927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Crying/comments/commentRss/141927.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Crying/services/trackbacks/141927.html</trackback:ping><description><![CDATA[<div><font size="2">J2EE开发中大量的专业羃略语很是让hqhQ尤其是跟一些高手讨论问题的时候,三分钟就被h家满口的专业术语h了,</font> </div> <div><font size="2">                                    PO VO BO DTO POJO </font>   </div> <div><font size="+0">POQ?/font> </div> <div><font size="+0">persistant object持久对象</font> </div> <div><font size="+0">最形象的理解就是一个PO是数据库中的一条记录?/font> </div> <div><font size="+0">好处是可以把一条记录作Z个对象处理,可以方便的{为其它对象?/font> </div> <div><font size="+0">BOQ?/font> </div> <div><font size="+0">business object业务对象</font> <font size="+0">主要作用是把业务逻辑装Z个对象。这个对象可以包括一个或多个其它的对象?/font> </div> <div><font size="+0">比如一个简历,有教育经历、工作经历、社会关pȝ{?/font> </div> <div><font size="+0">我们可以把教育经历对应一个POQ工作经历对应一个POQ社会关pd应一个PO?/font> </div> <div><font size="+0">建立一个对应简历的BO对象处理历,每个BO包含q些PO?/font> </div> <div><font size="+0">q样处理业务逻辑Ӟ我们可以针对BOd理?/font> </div> <div><font size="+0">VO Q?/font> </div> <div><font size="+0">value object值对?/font> </div> <div><font size="+0">ViewObject表现层对?/font> </div> <div><font size="+0">主要对应界面昄的数据对象。对于一个WEB面Q或者SWT、SWING的一个界面,用一个VO对象对应整个界面的倹{?/font> </div> <div><font size="+0">DTO Q?/font> </div> <div><font size="+0">Data Transfer Object数据传输对象</font> </div> <div><font size="+0">主要用于q程调用{需要大量传输对象的地方?/font> </div> <div><font size="+0">比如我们一张表?00个字D,那么对应的PO有100个属性?/font> </div> <div><font size="+0">但是我们界面上只要显C?0个字D,</font> </div> <div><font size="+0">客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,</font> </div> <div><font size="+0">q时我们可以用只有q?0个属性的DTO来传递结果到客户端,q样也不会暴露服务端表结?到达客户端以后,如果用这个对象来对应界面昄Q那此时它的w䆾p{为VO</font> ­</div> <div><font size="+0">POJO Q?/font> </div> <div><font size="+0"><font color="#333333">plain ordinary java object 单ava对象</font> </div> <div>个h感觉POJO是最参见最多变的对象,是一个中间对象,也是我们最常打交道的对象?/font> </div> <div><font size="+0">一个POJO持久化以后就是PO</font> </div> <div><font size="+0">直接用它传递、传递过E中是DTO</font> </div> <div><font size="+0">直接用来对应表示层就是VO</font> </div> <div><font size="+0">DAOQ?/font> </div> <div><font size="+0">data access object数据讉K对象</font> </div> <div><font size="+0">q个大家最熟?zhn)Q和上面几个O区别最大,基本没有互相转化的可能性和必要.</font> </div> <div><font size="+0">主要用来装Ҏ(gu)据库的访问。通过它可以把POJO持久化ؓPOQ用POl装出来VO、DTO</font> </div> <div><font size="+0">       ȝ下我认ؓ一个对象究竟是什么O要看具体环境Q在不同的层、不同的应用场合Q对象的w䆾也不一P而且对象w䆾的{化也是很自然的。就像你对老婆来说是老公Q对父母来说是子女。设计这些概늚初衷不是Z唬h而是Z更好的理解和处理各种逻辑Q让大家能更好的ȝ<font color="#ff0000">面向对象</font>的方式处理问?</font> </div> <div><font size="+0">       大家千万不要陷入q度设计Q大可不必ؓ了设计而设计一定要在代码中区分各个对象。一句话技术是为应用服务的?/font> </div> <div><font size="+0">M个图Q感觉没有完全表辑և自己的意思。。。。。谁帮忙完善下,最好能体现各个O在MVC中的位置</font> </div> <div><font size="+0"><img height="480" src="http://www.aygfsteel.com/images/blogjava_net/vip01/snap20070108.jpg" width="557" border="0" alt="" /></font>  </div> <img src ="http://www.aygfsteel.com/Crying/aggbug/141927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Crying/" target="_blank">Crying</a> 2007-09-01 14:44 <a href="http://www.aygfsteel.com/Crying/articles/141927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORMhttp://www.aygfsteel.com/Crying/articles/141928.htmlCryingCryingSat, 01 Sep 2007 06:44:00 GMThttp://www.aygfsteel.com/Crying/articles/141928.htmlhttp://www.aygfsteel.com/Crying/comments/141928.htmlhttp://www.aygfsteel.com/Crying/articles/141928.html#Feedback0http://www.aygfsteel.com/Crying/comments/commentRss/141928.htmlhttp://www.aygfsteel.com/Crying/services/trackbacks/141928.html对象关系映射Q?/font>Object Relational MappingQ简U?/font>ORMQ是一Uؓ了解?/font>面向对象与关p?/font>数据?/font>存在的互不匹配的现象的技术?单的_ORM是通过使用描述对象和数据库之间映射?/font>元数?/font>Q将javaE序中的对象自动持久化到关系数据库中。本质上是数据从一UŞ式{换到另外一UŞ式?q也同时暗示者额外的执行开销Q然而,如果ORM作ؓ一U?/font>中间?/font>实现Q则会有很多Z做优化,而这些在手写的持久层q不存在?更重要的是用于控制{换的元数据需要提供和理Q但是同Pq些p要比l护手写的方案要;而且q是遵守ODMG规范的对象数据库依然需?/font>c?/font>U别的元数据?对象-关系映射Q?/font>Object/Relation MappingQ简UORMQ,是随着面向对象?/font>软g开?/font>Ҏ(gu)发展而生的。面向对象的开发方法是当今企业U应用开发环境中的主开发方法,关系数据库是企业U应用环境中怹存放数据的主数据存储系l。对象和关系数据?/font>业务实体的两U表现Ş式,业务实体在内存中表现为对象,在数据库中表Cؓ关系数据。内存中的对象之间存在关联和l承关系Q而在数据库中Q关pL据无法直接表辑֤对多兌和承关pR因此,对象-关系映射(ORM)pȝ一般以中间件的形式存在Q主要实现程序对象到关系数据库数据的映射?/font>
      面向对象是从软g工程基本原则(如耦合、聚合、封?的基上发展v来的Q而关pL据库则是从数学理论发展而来的,两套理论存在显著的区别。ؓ了解册个不匚w的现?对象关系映射技术应q而生?
      让我们从O/R开始。字母Oh?对象"(Object),而R则来自于"关系"(Relational)。几乎所有的E序里面Q都存在对象和关pL据库。在业务逻辑层和用户界面?/font>中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中?
      当你开发一个应用程序的时?不用O/R Mapping),你可能会写不数据访问层的代码,用来从数据库保存Q删除,d对象信息Q等{。你在DAL中写了很多的Ҏ(gu)来读取对象数据,改变状态对象等{Q务。而这些代码写hL重复的?br />  
  如果打开你最q的E序Q看看DAL代码Q你肯定会看到很多近似的通用?/font>模式。我们以保存对象的方法ؓ例,你传入一个对象,为SqlCommand对象dSqlParameterQ把所有属性和对象对应Q设|SqlCommand的CommandText属性ؓ存储q程Q然后运行SqlCommand。对于每个对象都要重复的写这些代码?
  除此之外Q还有更好的办法吗?有,引入一个O/R Mapping。实质上Q一个O/R Mapping会ؓ你生成DAL。与其自己写DAL代码Q不如用O/R Mapping。你用O/R Mapping保存Q删除,d对象QO/R Mapping负责生成SQLQ你只需要关心对象就好?/font>
      对象关系映射成功q用在不同的面向对象持久层品中Q如:Torque,OJB,Hibernate,TopLink,CastorJDO, TJDO {?
      一般的ORM包括以下四部分:
      一个对持久cd象进行CRUD操作?/font>APIQ?
      一个语a或API用来规定与类和类属性相关的查询Q?
      一个规定mapping metadata的工P
      一U技术可以让ORM的实现同事务对象一赯行dirty checking, lazy association fetching以及其他的优化操作?

一、目前流行的 ORM 产品
      目前众多厂商?/font>开?/font>C֌都提供了持久?/font>框架的实玎ͼ常见的有Q?/font>
      Apache OJB Qhttp://db.apache.org/ojb/Q?
      Cayenne Qhttp://objectstyle.org/cayenne/Q?
      Jaxor Qhttp://jaxor.sourceforge.netQ?
      Hibernate Qhttp://www.hibernate.orgQ?
      iBatis Qhttp://www.ibatis.comQ?
      jRelationalFramework Qhttp://ijf.sourceforge.netQ?
      mirage Qhttp://itor.cq2.org/en/oss/mirage/toonQ?
      SMYLE Qhttp://www.drjava.de/smyleQ?
      TopLink Qhttp://otn.
oracle.com/products/ias/toplink/index.htmlQ?
      其中 TopLink ?Oracle 的商业品,其他均ؓ开源项目?
      其中 Hibernate 的轻量 ORM 模型逐步立了在 Java ORM 架构中领导地位,甚至取代复杂而又J琐?EJB 模型而成Z实上?Java ORM 工业标准。而且其中的许多设计均?J2EE 标准l织吸纳而成为最?EJB 3.0 规范的标准,q也是开源项目媄响工业领域标准的有力见证?
二、对象-关系映射模式
      从《公׃库元模型Q开发指南》一书第8章CWM元仓库中摘录出来的内容,实现了公׃库元模型(CWM)?/font>UML囑ֈMicrosoft SQL Server数据库的映射Q是一U将对象层次l构映射成关pdl构的方法。个为可以作为将本体(Ontology)文g存储到关pd数据库中的一U可借鉴Ҏ(gu)?/font>
      基本情况Q公׃库元模型(CWM)是对象管理组l?OMG)的一U和数据仓库相关的元模型标准Q采用UML表示的对象层ơ结构,在保存到数据库中时由于面向对象的数据库技术的不完?理论研究和商业应用都不是L)Q所以该书的作者們֐于用成熟的关系型数据库来保存-q也是存储本体时所遇到的问题?/font>
      采用Ҏ(gu)Q将UML模型中的各种元素通过转换Q保存ؓ数据库模式。由于CWM是一U元模型Q因此模型的实例也是一U模型,这U实例以数据库数据的形式保存。用数据库中比较成熟的存储q程技术提高开发和执行效率?/font>
      1、数?/font>cd映射模式
      1.1单数据类型模式:建立UML和关pd数据库中单数据类型的映射表以指导映射?br />       1.2枚D数据cd模式Q每U枚丄型对应一个表Q只有一个列(_EnumLiteral)表示枚D倹{?br />       1.3Zcȝ数据cd模式Q用外键约束,基列与Zcȝcd实例相关联?/font>
      2、类映射模型
      每个cd应一个表。单值属性、多值属性、承关pd以用下述Ҏ(gu)映射Q而引用属性将在关联映模式中提到?/font>
      2.1单值属性模式:是cardinality的上界ؓ1的属性,映射到类所对应的表的列上。若其下界也?Q必L的属性)Q列属性ؓNOT NULL?br />       2.2多值属性模式:每个多值属性映成一个独立的表,使用外键q接到类所对应的表上?br />       2.3l承模式Q每加入一个类的实例时Q根据其l承关系自顶向下生成每个cȝ对象Q这些对象具有相同的IDQ根对象对应记录的主键)。删除对象实例时Q自底向上删除数据。遇C中间删的情况怎么办?多重l承怎么处理Q(金龙飞)
      3、关联映模?/strong>
      3.1一对一兌模式Q在兌两端各加一列?br />       3.2一对多兌模式Q和3.1一栗如果多q端是有序的Q还需加入一列表C序受?br />       3.3多对多关联模式:关联单独作一个表?br />       3.4l合兌模式Q注意联式删除?br />       3.5反演兌模式Q关联两端指向相关的cdQ和普通关联一栗?br />       3.6成对兌模式Q关联记录两个类间的关系Q用交集c表C关联,表示成一个单独的表,每个兌对应一个表Q用外键表示它们间的关系?br />       3.7兌上的OCL需要分析成对应的存储过E代码?br />       3.8保证兌的cardinality也需要分析成对应的存储过E代码?/font>
      4、引用映模?/font>

      在UML中不存在的MOF特征Q指属性是声明为引用类型的实例。用存储q程实现?/font>

Crying 2007-09-01 14:44 发表评论
]]>
HIBERNATE中重要的接口http://www.aygfsteel.com/Crying/articles/141926.htmlCryingCryingSat, 01 Sep 2007 06:42:00 GMThttp://www.aygfsteel.com/Crying/articles/141926.htmlhttp://www.aygfsteel.com/Crying/comments/141926.htmlhttp://www.aygfsteel.com/Crying/articles/141926.html#Feedback0http://www.aygfsteel.com/Crying/comments/commentRss/141926.htmlhttp://www.aygfsteel.com/Crying/services/trackbacks/141926.htmlHibernate 使用了J2EE 架构中的如下技术:JDBC 、JTA 、JNDI 。其中JDBC 是一个支持关p?数据库操作的一个基层;它与JNDI 和JTA 一L(fng)合,使得Hibernate 可以方便地集成到J2EE 应用服务器中厅R?/font>
讨论Hibernate API 接口中的所有方法,只简要讲一下每个主?接口的功能,如果你想了解得更多的话,你可以在Hibernate 的源码包中的net.sf.hibernate 子包?L看这些接口的源代码。下面我们依ơ讲一下所有的主要接口Q?
核心接口
以下5 个核心接口几乎在M实际开发中都会用到。通过q些接口Q你不仅可以存储和获得持 久对象,q且能够q行事务控制?/font>
Configuration 接口
Configuration 接口的作用是对Hibernate q行配置Q以及对它进行启动。在Hibernate 的启?
q程中,Configuration cȝ实例首先定位映射文的位|,dq些配置Q然后创Z?
SessionFactory 对象?/font>
虽然Configuration 接口在整个Hibernate 目中只扮演着一个很的角色Q但它是启动
hibernate 时你所遇到的每一个对象?/font>
 
SessionFactory 接口
q里用到了一个设计模式――工厂模式,用户E序从工厂类SessionFactory 中取得Session ?实例?/font> 令你感到奇怪的是SessionFactory q不是轻量的!实际上它的设计者的意图是让它能在整?应用中共享。典型地来说Q一个项目通常只需要一个SessionFactory 够了,但是当你的项目要?作多个数据库Ӟ那你必须为每个数据库指定一个SessionFactory 。SessionFactory 在Hibernate 中实际vC一个缓冲区的作用,它缓冲了Hibernate 自动生成的SQL 语句和一些其它的映射数据Q还~冲了一些将来有可能重复利用的数据?/font>
 
Session 接口
Session 接口对于Hibernate 开发h员来说是一个最重要的接口。然而在Hibernate 中,实例 化的Session 是一个轻量的类Q创建和销毁它都不会占用很多资源。这在实际项目中实很重要,
因ؓ在客L(fng)序中Q可能会不断地创Z及销毁Session 对象Q如果Session 的开销太大Q会l系
l带来不良媄响。但值得注意的是Session 对象是非U程安全的,因此在你的设计中Q最好是一?U程只创Z个Session 对象?/font>
在Hibernate 的设计者的头脑中,他们session 看作介于数据q接与事务管理一U中间接口?
我们可以session 惌成一个持久对象的~冲区,Hibernate 能检到q些持久对象的改变,q及 时刷新数据库。我们有时也USession 是一个持久层理器,因ؓ它包含这一些持久层相关的操作,
诸如存储持久对象x据库Q以及从数据库从获得它们。请注意QHibernate 的session 不同于JSP
应用中的HttpSession 。当我们使用session q个术语Ӟ我们指的是Hibernate 中的sessionQ?我们以后会将HttpSesion 对象UCؓ用户session ?/font>
 
Transaction 接口
Transaction 接口是一个可选的APIQ你可以选择不用这个接口,取而代之的是Hibernate ?
设计者自己写的底层事务处理代码。Transaction 接口是对实际事务实现的一个抽象,q些实现?
括JDBC 的事务、JTA 中的UserTransaction 、甚臛_以是CORBA 事务。之所以这栯计是能让开
发者能够用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移倹{?/font>
 
Query 和Criteria 接口
Query 接口让你方便地对数据库及持久对象q行查询Q它可以有两U表达方式:HQL 语言或本
地数据库的SQL 语句。Query l常被用来绑定查询参数、限制查询记录数量,q最l执行查询操作?/font>

Criteria 接口与Query 接口非常cMQ它允许你创建ƈ执行面向对象的标准化查询?/font>
值得注意的是Query 接口也是轻量U的Q它不能在Session 之外使用?/font>
 
Callback 接口
当一些有用的事g发生时――例如持久对象的载入、存储、删除时QCallback 接口会通知
Hibernate L收一个通知消息。一般而言QCallback 接口在用L(fng)序中q不是必ȝQ但你要在你
的项目中创徏审计日志Ӟ你可能会用到它?/font>
一个重要的术语QType
Hibernate 的设计者们发明了一个术语:Type Q它在整个构架中是一个非常基、有着强大?
能的元素。一个Type 对象能将一个Java cd映射到数据库中一个表的字D中去(实际上,它可?映射到表的多个字D中去)。持久类的所有属性都对应一个type 。这U设计思想使用Hibernate 有着 高度的灵zL和扩展性?/font>
Hibernate 内置很多type cdQ几乎包括所有的Java 基本cdQ例如Java.util.Currency ?
Java.util.calendar 、byte[] 和Java.io.Serializable ?/font>
不仅如此Q?Hibernate q支持用戯定义的type Q通过实现接口UserType 和接?
CompositeUserType Q你可以加入自己的type 。你可以利用q种特色让你的项目中使用自定义的?如Address 、Name q样的typeQ这样你可以获得更大的便利Q让你的代码更优雅。自定义type 在Hibernate 中是一Ҏ(gu)心特Ԍ它的设计者鼓׃多多使用它来创徏一个灵zR优雅的目Q?

{略接口
Hibernate 与某些其它开源Y件不同的q有一点――高度的可扩展性,q通过它的内置{略机制 来实现。当你感觉到Hibernate 的某些功能不I或者有某些~陷Ӟ你可以开发一个自q{略 来替换它Q而你所要做的仅仅只是承它的某个策略接口,然后实现你的新策略就可以了,以下?
它的{略接口Q?

· 主键的生?IdentifierGenerator 接口)
· 本地SQL 语言支持(Dialect 抽象c?
· ~冲机制(Cache 和CacheProvider 接口)
· JDBC q接理(ConnectionProvider 接口)
· 事务理(TransactionFactory, Transaction, 和TransactionManagerLookup 接口)
· ORM {略(ClassPersister 接口)
· 属性访问策?PropertyAccessor 接口)
· 代理对象的创?ProxyFactory 接口)
Hibernate Z上所列的机制分别创徏了一个缺省的实现Q因此如果你只是要增强它的某个策?
的功能的话,只需单地l承q个cd可以了,没有必要从头开始写代码?/font>
以上是Hibernate 的一些核心接口,但当我们真正开始用它进行开发时Q你的脑里可能?
会有一个疑问:我是通过什么方式,q从哪里取得Session 的呢Q以下我们就解答q个问题?/font>

创徏一个SessionFactory 对象
Z能创Z个SessionFactory 对象Q你必须在Hibernate 初始化时创徏一个Configuration
cȝ实例Qƈ已写好的映文件交由它处理。这P Configuration 对象可以创Z?
SessionFactory 对象Q当SessionFactory 对象创徏成功后,Configuration 对象没有用了,你可以简单地抛弃它。如下是CZ代码Q?/font>
Configuration cfg = new Configuration();

SessionFactory sessionFactory = cfg.buildSessionFactory();

Session session=sessionFactory.openSession();


Transaction ts=session.beginTransaction();

session.save(..);

ts.commit() 

Crying 2007-09-01 14:42 发表评论
]]>
վ֩ģ壺 | | | | | ̨| ˮ| ǡ| | | | | | | Ϫ| | Ļ| ɽʡ| | ͩ| ʯ| ƽ| | ѳ| | | ˳| ͸| | | | ƽ| | ͨ| ϲ| ɽ| | ͷ| | ɳ| |