??xml version="1.0" encoding="utf-8" standalone="yes"?>国产影视精品一区二区三区,亚洲精品一区二区三区四区高清,亚洲一区视频在线观看视频http://www.aygfsteel.com/liubijin/category/44662.htmlzh-cnWed, 05 May 2010 04:19:51 GMTWed, 05 May 2010 04:19:51 GMT60hibernate中Criteria的用法示?/title><link>http://www.aygfsteel.com/liubijin/archive/2010/05/04/320039.html</link><dc:creator>無所?/dc:creator><author>無所?/author><pubDate>Tue, 04 May 2010 06:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/liubijin/archive/2010/05/04/320039.html</guid><wfw:comment>http://www.aygfsteel.com/liubijin/comments/320039.html</wfw:comment><comments>http://www.aygfsteel.com/liubijin/archive/2010/05/04/320039.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liubijin/comments/commentRss/320039.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liubijin/services/trackbacks/320039.html</trackback:ping><description><![CDATA[<p>hibernate支持一Ujava~写习惯的查询apiQ用session建立net.sf.hibernate.CriteriaQ您可以在不用sql甚至hql的情况下q行查询?<br />      如果我们要查询User的所有信息我们可以如下用CriteriaQ?/p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">Criteria crit </span><span style="color: #000000">=</span><span style="color: #000000"> session.createCriteria(User.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />         List users </span><span style="color: #000000">=</span><span style="color: #000000"> crit.list();<br />         </span><span style="color: #0000ff">for</span><span style="color: #000000"> (ListIterator iterator </span><span style="color: #000000">=</span><span style="color: #000000"> users.listIterator(); iterator.hasNext(); ) {<br />             User user </span><span style="color: #000000">=</span><span style="color: #000000"> (User) iterator.next();<br />             System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">name: </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> user.getName());<br />             System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">age: </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> user.getAge());           <br />         }</span></div> <p><br /> 我们要ؓ查询限定条gQ可以通过net.sf.hibernate.expression.Expression讄Expression有很多的条g查询Ҏ下面举一些例子:<br /> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">Criteria crit </span><span style="color: #000000">=</span><span style="color: #000000"> session.createCriteria(User.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />         crit.add(Expression.ge(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> Integer(</span><span style="color: #000000">25</span><span style="color: #000000">)));<br />         List users </span><span style="color: #000000">=</span><span style="color: #000000"> crit.list();</span></div> <p><br /> geQ)表示大于{于Q即age大于{于25的user?/p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">crit.add(Expression.gt(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> Integer(</span><span style="color: #000000">20</span><span style="color: #000000">)));<br /> crit.add(Expression.between(</span><span style="color: #000000">"</span><span style="color: #000000">weight</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> Integer(</span><span style="color: #000000">60</span><span style="color: #000000">)Q?/span><span style="color: #0000ff">new</span><span style="color: #000000"> Integer(</span><span style="color: #000000">80</span><span style="color: #000000">)));<br /> List users </span><span style="color: #000000">=</span><span style="color: #000000"> crit.list();</span></div> <p><br /> between表示weight?0?0之间?br /> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" /><span style="color: #000000">crit.add(Expression.or(<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" />                   Expression.eq(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> Integer(</span><span style="color: #000000">20</span><span style="color: #000000">)),<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" />                   Expression.isNull(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">)<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" />               ));<br /> <img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" />List users </span><span style="color: #000000">=</span><span style="color: #000000"> crit.list();</span></div> <p><br /> eq表示age?0的user?br /> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">Criteria crit </span><span style="color: #000000">=</span><span style="color: #000000"> session.createCriteria(User.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br /> crit.setFirstResult(</span><span style="color: #000000">51</span><span style="color: #000000">);<br /> crit.setMaxResult(</span><span style="color: #000000">50</span><span style="color: #000000">);<br /> List users </span><span style="color: #000000">=</span><span style="color: #000000"> crit.list();</span></div> <p> </p> <p>setMaxResultQ)讄q回的信息条敎ͼsetFirstResultQ)讄查询l果的初始位|,上面的程序段可以实现分页?/p> <p> </p> <p>在hibernate的Session里面使用createCriteria可以创徏一个Criteria实例帮助我们q行条g查询Q不用自׃hql语句Q很方便?br /> 用法很简单,首先传Class实例创徏CriteriaQClass实例对应你想要查询的那个实体:<br /> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">Criteria c </span><span style="color: #000000">=</span><span style="color: #000000"> session.createCriteria(Person.</span><span style="color: #0000ff">class</span><span style="color: #000000">);</span></div> <p><br /> 然后调用Criteria的addҎ加入条gQRestrictionsQ。常用的条g有:<br />  <br /> Ҏ说明Q?Restrictions.eq {于 <br />                      Restrictions.allEq 使用MapQ用key/valueq行多个{于的对?br />                      Restrictions.gt 大于 > <br />                      Restrictions.ge 大于{于 >= <br />                      Restrictions.lt 于 <<br />                     Restrictions.le 于{于 <= <br />                     Restrictions.between 对应SQL的BETWEEN子句 <br />                     Restrictions.like 对应SQL的LIKE子句 <br />                     Restrictions.in 对应SQL的in子句<br />                     Restrictions.and   and关系<br />                      Restrictions.or   or关系 <br />                    Restrictions.sqlRestriction    SQL限定查詢  <br /> <br /> <br /> 例如Q我惌回Person实体里面q龄(age)大于20的记录,那么׃ؓCriteria加入Restrictions.gt条gQ?br /> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">List list </span><span style="color: #000000">=</span><span style="color: #000000"> c.add(Restrictions.gt(“age”,</span><span style="color: #0000ff">new</span><span style="color: #000000"> Integer(</span><span style="color: #000000">20</span><span style="color: #000000">))).list();</span></div> <p><br />  <br /> Restrictions.and和Restrictions.or很有用,表示and查询q是or查询Q例如我要查询Person实体里面q龄(age)大于20Q或者性别 (sex)为man<br /> 的记录,那么׃ؓCriteria加入:<br /> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">List list </span><span style="color: #000000">=</span><span style="color: #000000"> c.add(Restrictions.or(<br /> Restrictions.gt(“age”,</span><span style="color: #0000ff">new</span><span style="color: #000000"> Integer(</span><span style="color: #000000">20</span><span style="color: #000000">)),<br /> Restrictions.eq(“sex”,”man”)<br /> )).list();<br />  </span></div> <p><br /> 如果需要关联查询的话,可以使用Criteria的createCriteriaҎ创徏一个CriteriaQ例如部?Department)和h?Person)是一对多的关p,我要查询Person实体里面q龄(age)大于20Q性别 (sex)为manQ?br /> 备注包含应届生,<br /> 且所在部?department)是开发部的记?<br /> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">List list </span><span style="color: #000000">=</span><span style="color: #000000"> c.add(Restrictions.gt(“age”,  </span><span style="color: #0000ff">new</span><span style="color: #000000"> Integer(</span><span style="color: #000000">20</span><span style="color: #000000">)))<br /> .add(Restrictions.eq(“sex”,”man”))<br /> .add(Restrictions.like(“Memo”,”</span><span style="color: #000000">%</span><span style="color: #000000">应届?/span><span style="color: #000000">%</span><span style="color: #000000">”))<br /> .createCriteria(“department”)<br /> .add(Restrictions.eq(“departmentname”,”开发部”))<br /> .list();</span></div> <p><br />  <br /> 其他条g的用法也很简单,׃列D了?br />  <br /> 另外QHibernate3Z一个org.hibernate.criterion.DetachedCriteriaQ即ȝCriteriaQ它允许你可以先创徏DetachedCriteriaQ然后传到Session里面才真正返回一个CriteriaQ用法如下:<br /> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000"> <br /> DetachedCriteria detchedCriteria </span><span style="color: #000000">=</span><span style="color: #000000"> DetachedCriteria.forClass(Person.</span><span style="color: #0000ff">class</span><span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000"> 先徏立DetchedCriteria物g</span><span style="color: #008000"><br /> </span><span style="color: #000000">detchedCriteria.add(Restrictions.ge(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">new</span><span style="color: #000000"> Integer(</span><span style="color: #000000">25</span><span style="color: #000000">)));    </span><span style="color: #008000">//</span><span style="color: #008000"> 加入查询条g</span><span style="color: #008000"><br /> </span><span style="color: #000000">Session session </span><span style="color: #000000">=</span><span style="color: #000000"> sessionFactory.openSession();<br /> Criteria criteria </span><span style="color: #000000">=</span><span style="color: #000000"> detchedCriteria.getExecutableCriteria(session);    </span><span style="color: #008000">//</span><span style="color: #008000"> l定Session並返回一个Criteria实例List list = criteria.list(); </span></div> <p><br />  <br />  <br /> 最后,需要注意,Criteriaq提供了setFirstResult和setMaxResultsҎq行分页查询?br />  <br /> </p> <img src ="http://www.aygfsteel.com/liubijin/aggbug/320039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liubijin/" target="_blank">無所?/a> 2010-05-04 14:07 <a href="http://www.aygfsteel.com/liubijin/archive/2010/05/04/320039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate基本介绍+一个简单的E序http://www.aygfsteel.com/liubijin/archive/2010/05/04/320028.html無所?/dc:creator>無所?/author>Tue, 04 May 2010 04:26:00 GMThttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320028.htmlhttp://www.aygfsteel.com/liubijin/comments/320028.htmlhttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320028.html#Feedback0http://www.aygfsteel.com/liubijin/comments/commentRss/320028.htmlhttp://www.aygfsteel.com/liubijin/services/trackbacks/320028.html一、基入门

从一个最基本的对象关pL像自动化E序Q了解Hibernatel成的基本元素,q进一步了解Hibernate的基语义、配|等概念?/p>

1QO/R映像入门W一个HibernateE序很简单,一个对象映像至一个数据表

1Q?配置Hibernate
Hibernate是ORM的解x案,其底层对数据库的操作依赖于JDBCQ所以您必须先取得JDBC驱动E序Q在q边所使用的是MySQLQ所以您必须至MySQL®Connector/J取得MySQL的JDBC驱动E序?/p>

接下来至Hibernate官方|站取得hibernate 3.0?/p>

解开zip档案后,当中的hibernate3.jar是必要的Q而在lib目录中还包括了许多jar档案Q您可以在Hibernate 3.0官方的参考手册上扑ֈq些jar的相兌明,其中必要的是antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging?EHCacheQHibernate底层q需要Java Transaction APIQ所以您q需要jta.jarQ到q边为止Qd需要以下的jar档案Q?/p>

Hibernate可以q行于单Z上,也可以运行于Web应用E序之中Q如果是q行于单机,则将所有用到的jar档案Q包括JDBC驱动E序Q设定至CLASSPATH中,如果是运行于Web应用E序中,则将jar档案|放于WEB-INF/lib中?/p>

如果您还需要额外的LibraryQ再依需求加入,例如JUnit、Proxool{等Q接下来可以etc目录下的log4j.properties复制至Hibernate目的Classpath下,q修改一下当中的log4j.logger.org.hibernate为errorQ也是只在错误发生时显C必要的讯息?/p>

接着讄基本的Hibernate配置文gQ可以用XML或Properties档案Q这边先使用XMLQ档名预设ؓhibernate.cfg.xmlQ?/p>

hibernate.cfg.xml

 

            

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
" <hibernate-configuration>
<session-factory>
<!-- 昄实际操作数据库时的SQL -->
<property name="show_sql">true</property>
<!-- SQL 方言Q这边设定的是MySQL -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- JDBC 驱动E序 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/demo</property>
<!-- 数据库用?-->
<property name="connection.username">caterpillar</property>
<!-- 数据库密?-->
<property name="connection.password">123456</property>
<!-- 以下讄对象与数据库表格映像文g -->
</session-factory>
</hibernate-configuration>

 

配置文g中已l加上批注ؓ每一个项目作了说明,其中对象与数据库表格映像文gq有待加入?/p>

1Q?W一个Hibernate
q边以一个简单的单机E序来示范Hibernate的配|与功能Q首先作数据库的准备工作Q在MySQL中新增一个demo数据库,q徏立user表格Q?/p>

CreateUser2MySQL.sql

 

            

CREATE TABLE user (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(100) NOT NULL default '',
age INT
);

 

对于q个表格Q您有一个Usercd与之对应Q表g的每一个字D将对应至User实例上的Field成员?/p>

User.java

 

            

package onlyfun.caterpillar;
public class User {
private Integer id;
private String name;
private Integer age;
// 必须要有一个预讄建构Ҏ
// 以得Hibernate 可以使用Constructor.newInstance()建立对象
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}

 

其中id是个Ҏ的属性,Hibernate会用它来作Z键识别,您可以定义主键生的方式Q这是在XML映像文g中完成,Z告诉Hibernate您所定义的User实例如何映像x据库表格Q您撰写一个XML映射文g档名是User.hbm.xmlQ如下所C:

User.hbm.xml

 

            

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
" <hibernate-mapping>
<class name="onlyfun.caterpillar.User" table="user">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="name" column="name" type="java.lang.String" />
<property name="age" column="age" type="java.lang.Integer" />
</class>
</hibernate-mapping>

 

<class>h的name属性ؓ所映像的对象,而table为所映像的表|<id>中column属性指定了表格字段Q而type属性指定了User实例的中的id之型态,q边type中所讑֮的是直接指定Java中的对象型态,Hibernate也定义有自己的映像型态,作ؓJava对象与SQL型态的标准对应型态(因ؓ语言所提供的类型ƈ不一定与数据库的cd对应Q,q之后会再说明?/p>

#p#

<id>中主键的产生方式在这边设定ؓ"native"Q表CZ键的生成方式由HibernateҎ数据库Dialect的定义来军_Q之后还会介l其它主键的生成方式?/p>

同样的,<property>标签中的column与type都各自指明了表格中字D与对象中属性的对应?/p>

接着必须在Hibernate配置文ghibernate.cfg.xml中指明映像文件的位置Q如下加入映像文件位|:

hibernate.cfg.xml

 

            

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
" <hibernate-configuration>
<session-factor>
....
<!-- 对象与数据库表格映像文g -->
<mapping resource="onlyfun/caterpillar/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

 

接下来撰写一个测试的E序Q这个程序直接以Java E序设计人员熟悉的语法方式来操作对象Q而实际上也直接完成对数据库的操作Q程序将会将一W数据存入表g中:

FirstHibernate.java

 

            

package onlyfun.caterpillar;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class FirstHibernate {
public static void main(String[] args) {
// Configuration 负责理 Hibernate 配置讯息
Configuration config = new Configuration().configure();
// Ҏ config 建立 SessionFactory
// SessionFactory 用于徏?Session
SessionFactory sessionFactory = config.buildSessionFactory();
//持久化的物?br /> User user = new User();
user.setName("caterpillar");
user.setAge(new Integer(30));
//开启SessionQ相当于开启JDBC 的Connection
Session session = sessionFactory.openSession();
//Transaction 表示一l对DB 的交?br /> Transaction tx = session.beginTransaction();
//对象映像至数据库表g储存
session.save(user);
tx.commit();
session.close();
sessionFactory.close();
System.out.println("新增资料OK!请先用MySQL 观看l果Q?);
}
}

 

如您所看到的,E序中只需要直接操作User 对象Qƈq行Session 与Transaction 的相x作,Hibernate ׃自动完成Ҏ据库的操作,您看不到M一行JDBC 或SQL 的陈qͼ撰写好以上的各个档案之后Q各档案的放|位|如下:

接着可以开始运行程序,l果如下Q?/p>

FirstHibernate执行l果

 

            

Hibernate: insert into user (name, age) values (?, ?)

 

新增资料OK!请先用MySQL 观看l果Q?/p>

执行l果中显CZHibernate 所实际使用的SQLQ由于这个程序还没有查询功能Q所以要
q入MySQL 中看看新增的数据Q如下:

MySQL 中查询结?/strong>

 

            

mysql> select * from user;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 1 | caterpillar | 30 |
+----+-------------+------+
1 row in set (0.03 sec)

 

Comments

W四D代码的标题应该是hibernate.cfg.xml

1Q? W二?Hibernate
?W一?Hibernate 中介l如何用Hibernate 在不使用SQL 的情况下Q以Java 中操作对象的习惯来插入数据至数据库中Q当然储存数据之后,更重要的是如何将资料dQHibernate 中也可以让您不写一句SQLQ而以Java 中操作对象的习惯来查询数据?/p>

直接来看个范例:

SecondHibernate.java

 

            

package onlyfun.caterpillar;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Expression;
import java.util.Iterator;
import java.util.List;
public class SecondHibernate {
public static void main(String[] args) {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Criteria criteria = session.createCriteria(User.class);
// 查询user 所有字D?br /> List users = criteria.list();
Iterator iterator = users.iterator();
System.out.println("id \t name/age");
while (iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getId() + " \t " + user.getName() + "/" +
user.getAge());
}
// 查询user 中符合条件的字段
criteria.add(Expression.eq("name", "caterpillar"));
users = criteria.list();
iterator = users.iterator();
System.out.println("id \t name/age");
while (iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getId() + " \t " + user.getName() + "/" +
user.getAge());
}
session.close();
sessionFactory.close();
}
}

 

#p#

Criteria 对SQL q行装Q对于不甚了解SQL 的开发h员来_使用Criteria 也可以轻易的q行各种数据的检索,您也可以使用 Expression 讑֮查询条gQƈ之加入Criteria中对查询l果作限ӞExpression.eq()表示讑֮W合条g的查询,例如Expression.eq("name", "caterpillar")表示讑֮查询条g?name"字段中ؓ"caterpillar"的数据?/p>

先来看一下执行结果:
SecondHibernate 执行l果

 

            

Hibernate: select this_.id as id0_, this_.name as name0_0_,

this_.age as age0_0_ from user

this_id
id name/age
1 caterpillar/30
3 bush/5
2 momor/26
Hibernate: select this_.id as id0_, this_.name as name0_0_,

this_.age as age0_0_ from user

this_
where this_.name=?
id name/age
1 caterpillar/30

 

Criteria 是对象导向式的查询方式,让不了解SQL 的开发h员也可以Lq行各项查询Q但Criteria 的API 目前q不是很完善Q而Hibernate 鼓励的查询方式,是透过HQLQHibernate Query LanguageQ来q行Q直接来看个实例Q?/p>

SecondHibernateUsingHQ.java

 

            

package onlyfun.caterpillar;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.Iterator;
import java.util.List;
public class SecondHibernateUsingHQ {
public static void main(String[] args) {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
// 使用HQL 建立查询
Query query = session.createQuery("from User");
List users = query.list();
Iterator iterator = users.iterator();
System.out.println("id \t name/age");
while (iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getId() + " \t " + user.getName() + "/" +
user.getAge());
}
System.out.println();
// 使用HQL 建立查询
query = session.createQuery("from User user where user.name like ?");
// 讑֮查询参数
query.setParameter(0, "caterpillar");
users = query.list();
iterator = users.iterator();
System.out.println("id \t name/age");
while (iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getId() + " \t " + user.getName() + "/" +
user.getAge());
}
session.close();
sessionFactory.close();
}
}

 

执行l果Q?/p>

SecondHibernateUsingHQ 执行l果

 

            

Hibernate: select this_.id as id0_, this_.name as name0_0_,

this_.age as age0_0_ from user

this_id
id name/age
1 caterpillar/30
3 bush/5
2 momor/26
Hibernate: select this_.id as id0_, this_.name as name0_0_,

this_.age as age0_0_ from user

this_
where this_.name=?
id name/age
1 caterpillar/30

 

透过Query 接口Q您可以先设定查询参敎ͼ之后透过setXXX(){方法,指定的参数值填入,而不用每ơ都撰写完整的HQLQQuery 的setParameter()ҎW一个参数是指定?出现的位|,?0 开始,W二个参数则是设定查询条件?

#p#

二、简单的Hibernate E序

q边以一个简单的单机E序来示范Hibernate的配|与功能Q在q个例子中的一些操作,实际上会使用一些自动化工具来完成,而不一定亲自手动操作设定,q边完全手动的原因,在于让您可以知道Hibernate实际上会作那些动作,在进行范例之前,请先定前一个主题中的相关jar档案都已l设定在CLASSPATH中?br />  
我们先作数据库的准备工作Q在MySQL中新增一个HibernateTest数据库,q徏立USER表格Q?

 

            

CREATE TABLE USER (
    user_id CHAR(32) NOT NULL PRIMARY KEY,
    name VARCHAR(16) NOT NULL,
    sex CHAR(1),
    age INT
);

 

我们先撰写一个纯Java对象Q它U綷表示一个数据集合,待会我们会将之映像至数据库的表格上,E序如下Q?

User.java

 

            

package onlyfun.caterpillar;
 public class User {
    private String id;
    private String name;
    private char sex;
    private int age;
    public int getAge() {
        return age;
    }
    public String getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public char getSex() {
        return sex;
    }
    public void setAge(int i) {
        age = i;
    }
    public void setId(String string) {
        id = string;
    }
    public void setName(String string) {
        name = string;
    }
    public void setSex(char c) {
        sex = c;
    }
}

 

其中id是个Ҏ的属性,Hibernate会用它来作Z键识别,我们可以定义主键产生的方式,q是在XML映像文g中完成,Z告诉Hibernate对象如何映像x据库表格Q我们撰写一个XML映射文g档名是User.hbm.xmlQ如下所C:

User.hbm.xml

 

            

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
    " <hibernate-mapping>
    <class name="onlyfun.caterpillar.User" table="USER">
        <id name="id" type="string" unsaved-value="null">
            <column name="user_id" sql-type="char(32)" />
            <generator class="uuid.hex"/>
        </id>
        <property name="name" type="string" not-null="true">
            <column name="name" length="16" not-null="true"/>
        </property>
        <property name="sex" type="char"/>
        <property name="age" type="int"/>
    </class>
</hibernate-mapping>

 

q个XML文g定义了对象属性映像至数据库表格的关系Q您可以很简单的了解Ҏ的方法,像是User对象对应至USER表格Q其中我们?uuid.hex来定义主键的产生法QUUID法使用IP地址、JVM的启动时间、系l时间和一个计数值来产生主键。除了用uuid.hex之外Q我们还可以使用其它的方式来产生主键Q像是increment{,q可以在Hibernate参考手册中扑ֈ相关资料?/p>

<property>h用于定义Java对象的属性,而当中的<column/>h用于定义与数据库的对应,如果您是手工建立Java对象与数据库表格Q则在最单的情况下,可以只定?lt;property name="sex"/>q样的方式,而由Hibernate自动判断Java对象属性与数据库表格名U对应关p,?lt; property/>?lt;column/>标签上的额外讑֮Q像是not null、sql-type{)Q则可以用于自动产生Java对象与数据库表格的工具上?/p>

接下来我们定义Hibernate配置文gQ主要是q行SessionFactory配置QHibernate可以使用XML或属性文件来q行配置Q我 们这边先介绍如何使用XML配置Q这也是Hibernate所的配|方式,我们的文件名是hibernate.cfg.xmlQ如下:

hibernate.cfg.xml

 

            

<?xml version='1.0' encoding='big5'?>
<!DOCTYPE hibernate-configuration
    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
    " <hibernate-configuration>
    <session-factory>
        <!-- 昄实际操作数据库时的SQL -->
        <property name="show_sql">true</property>
        <!-- SQL方言Q这边设定的是MySQL -->
        <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
        <!-- JDBC驱动E序 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- JDBC URL -->
        <property name="connection.url">jdbc:mysql://localhost/HibernateTest</property>
        <!-- 数据库用?-->
        <property name="connection.username">caterpillar</property>
        <!-- 数据库密?-->
        <property name="connection.password">123456</property>
        <!-- 对象与数据库表格映像文g -->
        <mapping resource="User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

 

接下来我们撰写一个测试的E序Q这个程序将直接以JavaE序设计人员熟悉的语法方式来操作对象Q而实际上也直接完成对数据库的操作Q程序将会将一W数据存入表g中:

HibernateTest.java

 

            

import onlyfun.caterpillar.*;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class HibernateTest {
    public static void main(String[] args) throws HibernateException {
        SessionFactory sessionFactory =
          new Configuration().configure().buildSessionFactory();
        User user = new User();
        user.setName("caterpillar");
        user.setSex('M');
        user.setAge(28);
        Session session = sessionFactory.openSession();
        Transaction tx= session.beginTransaction();
        session.save(user);
        tx.commit();
        session.close();
        sessionFactory.close();         
        System.out.println("新增资料OK!请先用MySQL观看l果Q?);
    }
}

 

#p#

Configuration代表了Java对象x据库的映像设定,q个讑֮是从我们上面的XML而来Q接下来我们从Configuration取得SessionFactory对象Qƈ由它来开启一个SessionQ它代表对象与表格的一ơ会话操作,?Transaction则表CZl会话操作,我们只需要直接操作User对象Qƈq行Session与Transaction的相x作, Hibernate׃自动完成Ҏ据库的操作。这边对E序先只作简单的介绍Q之后再详加说明?/p>

所有的.java档案~译Qƈ两个XML档案攄在与HibernateTest相同的目录中Q也是档案位置如下Q?

 

            

/
|--HibernateTest.class
|--User.hbm.xml
|--hibernate.cfg.xml
    /onlyfun
        /caterpillar
        |--User.class

 

OK!现在您可以执行HibernateTestQ程序将会出C下的讯息Q?

 

            

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into USER (name, sex, age, user_id) values (?, ?, ?, ?)

 

新增资料OK!请先用MySQL观看l果Q?/p>

q边只先q行数据的存入,要观看数据存入的l果的话Q请q入MySQL观看Q以下是数据库存入的l果Q?

 

            

mysql> SELECT * FROM USER;
+----------------------------------+-------------+------+------+
| user_id                          | name        | sex  | age  |
+----------------------------------+-------------+------+------+
| 297e3dbdfea6023d00fea60241000001 | caterpillar | M    |   28 |
+----------------------------------+-------------+------+------+
1 rows in set (0.00 sec)

 



]]>
java数据cdQhibernate数据cdQ标准sql数据cd之间的对应表 http://www.aygfsteel.com/liubijin/archive/2010/05/04/320024.html無所?/dc:creator>無所?/author>Tue, 04 May 2010 04:07:00 GMThttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320024.htmlhttp://www.aygfsteel.com/liubijin/comments/320024.htmlhttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320024.html#Feedback0http://www.aygfsteel.com/liubijin/comments/commentRss/320024.htmlhttp://www.aygfsteel.com/liubijin/services/trackbacks/320024.html 其接口分Z下几c:
l         提供讉K数据库的操作的接口;
l         用于配置Hibernate的接口;
l         回调接口
l         扩展Hibernate的功能的接口?br /> q些接口大多C于net.sf.hibernate包中

Hibernate的核心接?br /> 5个核心接口:
l         Configuration接口Q配|Hibernate,根启动HibernateQ创建SessionFactory对象?br /> l         SessionFactory接口Q初始化HibernateQ充当数据存储源的代理,创徏Session对象?br /> l         Session接口Q负责保存、更新、删除、加载和查询对象?br /> l         TransactionQ管理事务?br /> l         Query和Criteria接口Q执行数据库查询?br />
SessionFactory实例对应一个数据存储源Q特点:
       U程安全的,重量U?br /> SessionQ是Hibernate应用最q泛的接口,特点Q?br />        不是U程安全的,轻量U?br />
java数据cdQhibernate数据cdQ标准sql数据cd之间的对应表


]]>
Hello,World in Hibernate 入门 http://www.aygfsteel.com/liubijin/archive/2010/05/04/320014.html無所?/dc:creator>無所?/author>Tue, 04 May 2010 03:30:00 GMThttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320014.htmlhttp://www.aygfsteel.com/liubijin/comments/320014.htmlhttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320014.html#Feedback0http://www.aygfsteel.com/liubijin/comments/commentRss/320014.htmlhttp://www.aygfsteel.com/liubijin/services/trackbacks/320014.html本文介绍如何用hibernate写一个hello world E序Q以及说明Hibernate下的对象的识别?br /> 1、配|文件hibernate.cfg.xmlQ?/p>
<? xml version = ' 1.0 '  encoding = ' utf-8 ' ?>
<! DOCTYPE hibernate - configuration PUBLIC
        
" -//Hibernate/Hibernate Configuration DTD 3.0//EN "
        
" http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd " >

< hibernate - configuration >

    
< session - factory >

        
<!--  Database connection settings  -->
        
< property name = " connection.driver_class " > com.mysql.jdbc.Driver </ property >
        
< property name = " connection.url " > jdbc:mysql: // localhost:3306/eg</property>
         < property name = " connection.username " > root </ property >
        
< property name = " connection.password " > 4864452 </ property >

        
<!--  JDBC connection pool (use the built - in)  -->
        
< property name = " connection.pool_size " > 1 </ property >

        
<!--  SQL dialect  -->
        
< property name = " dialect " > org.hibernate.dialect.MySQLInnoDBDialect </ property >

        
<!--  Enable Hibernate ' s automatic session context management -->
         < property name = " current_session_context_class " > thread </ property >

        
<!--  Disable the second - level cache   -->
        
< property name = " cache.provider_class " > org.hibernate.cache.NoCacheProvider </ property >

        
<!--  Echo all executed SQL to stdout  -->
        
< property name = " show_sql " > true </ property >

        
<!--  Drop and re - create the database schema on startup 
        
< property name = " hbm2ddl.auto " > create </ property >
         
-->
    
        
< mapping resource = " eg/Message.hbm.xml " />
        
        
    
</ session - factory >

</ hibernate - configuration >

2、源文gQ?/p>

package  eg;

public   class  Message  {
    
private  Long id;
    
private  String text;
             
    
private  Message nextMessage;

    
public  Message()  {}
    
public  Message(String text) {
        
this .text = text;
    }

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


    
public   void  setText(String text)  {
        
this .text  =  text; 
    }


    
public   void  setNextMessage(Message nextMessage)  {
        
this .nextMessage  =  nextMessage; 
    }

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

       
public  String getText()  {
        
return  ( this .text); 
    }

       
public  Message getNextMessage()  {
        
return  ( this .nextMessage); 
    }
 
}

3、配|文ӞMesssage.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 " >

< hibernate - mapping >
    
< class
        name
=" eg.Message "
        table
= " MESSAGE "
    
>

        
< id
            name
= " id "
            column
= " MESSAGE_ID "
            type
= " java.lang.Long "
        
>
            
< generator  class = " native " />
                         
        
</ id >
        
< property
            name
= " text "
            type
= " java.lang.String "
            update
= " true "
            insert
= " true "
            column
= " MESSAGE_TEXT "
        
/>

        
< many - to - one
            name
= " nextMessage "
            
class = " jmuse.eg.Message "
            cascade
= " all "
            outer
- join = " auto "
            update
= " true "
            insert
= " true "
            column
= " NEXT_MESSAGE_ID "
        
/>

      
</ class >

</ hibernate - mapping >

4、最后的包结构:

+ lib 
     antlr.jar 
     cglib.jar 
     asm.jar 
     asm
- attrs.jars 
     commons
- collections.jar 
     commons
- logging.jar 
     hibernate3.jar 
     jta.jar 
     dom4j.jar 
     log4j.jar 
Qsrc 
    
+ eg
       Message.java
       Message.hbm.xml
       TestMessage.java
     hibernate.cfg.ml
     log4j.properties

5、测试:

 session.beginTransaction();
        Message m
= new  Message( " hello,world " );
        session.save(m);
        session.getTransaction().commit();
        session.close();

 你会发现在数据库中有一条信息了Qid=1
Hibernate的对象识别是通过对象的Id 来识别的Q?br /> 如:

我们刚才在数据库中保存了一个Id?的Message对象?br /> 如果Q?br /> session.beginTraction();
Message m
= new  Message();
m.setId(
new  Long( 1 ));
m.setText(
" This is another greeting " );
session.saveOrUpdate(m);
sesion.getTraction.commit();
你会发现Hibernate会自动的把刚才的对象q行更新Q而不是保存一个新的对象?br /> q个例子有点极端Q呵c能说明问题可以了?

]]>
Hibernate单介l与部vhttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320013.html無所?/dc:creator>無所?/author>Tue, 04 May 2010 03:29:00 GMThttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320013.htmlhttp://www.aygfsteel.com/liubijin/comments/320013.htmlhttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320013.html#Feedback0http://www.aygfsteel.com/liubijin/comments/commentRss/320013.htmlhttp://www.aygfsteel.com/liubijin/services/trackbacks/320013.html下面开始利用hibernateq行数据库的讉K?需求:实现对用L增、删、改、查。ؓ了方便,用户?个属?用户ID和用户名?/ul>

    Hibernate有很多值得学习的地?q里我们单介l一个HibernateQ重点介lHibernate部vQ希望读者看后受益匪?/p>

    一. 什么是hibernateQ?/strong>

    {:Hibernate是一个开放源代码的对象关pL框Ӟ它对JDBCq行了非常轻量的对象封装,使得JavaE序员可以随心所Ʋ的使用对象~程思维来操U|据库?Hibernate可以应用在Q何用JDBC的场合,既可以在Java的客LE序使用Q也可以在Servlet/JSP的Web应用中用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMPQ完成数据持久化的重仅R?/p>

    ? 快速构建?/strong>

    在此先要说明一下。由于本人懒惎ͼC住hibernate的配|选项Q所以,此系列的实例都是使用myeclipseq行快速开发。各位对myeclipse不的,p见谅。然后,数据库都是mysql?br /> 下面开始利用hibernateq行数据库的讉K?
    需求:实现对用L增、删、改、查。ؓ了方便,用户?个属?用户ID和用户名。实体模型如下:

    预览囄

    建立工程:HibernateQuickUseQƈ且徏立包。如下:

    预览囄

    Ҏ实体Q创建类UserQ代码如下:

     
            
            
    1. package org.py.hib.quickstart;  
    2.  
    3. /**  
    4.  * User entity.  
    5.  * @author MyEclipse Persistence Tools  
    6.  */  
    7.  
    8. @SuppressWarnings("serial")  
    9. public class User implements java.io.Serializable  
    10. {  
    11.  private String id;  
    12.  private String name;  
    13.  
    14.  public User()  
    15.  {  
    16.  }  
    17.  
    18.  public String getId()  
    19.  {  
    20.   return this.id;  
    21.  }  
    22.  
    23.  public void setId(String id)  
    24.  {  
    25.   this.id = id;  
    26.  }  
    27.  
    28.  public String getName()  
    29.  {  
    30.   return this.name;  
    31.  }  
    32.  
    33.  public void setName(String name)  
    34.  {  
    35.   this.name = name;  
    36.  }  
    37. }  

    Ҏhibernate实体Q创建数据表。sql如下Q?/p>

            
    1. use HibernateQuickUse;  
    2. drop table if exists User;  
    3.  
    4. create table user (  
    5.  id varchar(32) primary key,  
    6.  name varchar(32)  
    7. );  

    q里的idQ我没有采用Integer auto_increment, 原因是ؓ了数据库的数据能方便的导入到另外一U数据库里面Q比方说Qoracle。当Ӟq个是以牺牲部分效率为前提的。因为id是integer的,能更加快速查询。不q,从数据库会自动ؓ primary key 建立 index来看Q效率也不会相差太多?br /> 要想通过hibernate讉K数据库。首先要建立描述数据库的文gQhibernate.cfg.xml。放到src下面。内容如下:

            
    1. xml version='1.0' encoding='UTF-8'?> 
    2.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
    3.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
    4.  
    5. <hibernate-configuration> 
    6.  
    7.  <session-factory> 
    8.   <property name="dialect">org.hibernate.dialect.MySQLDialectproperty> 
    9.   <property name="connection.url">jdbc:mysql://localhost:3306/hibernatequickUseproperty> 
    10.   <property name="connection.username">rootproperty> 
    11.   <property name="connection.password">rootproperty> 
    12.   <property name="connection.driver_class">com.mysql.jdbc.Driverproperty> 
    13.     
    14.   <property name="show_sql">trueproperty> 
    15.   <mapping resource="org/py/hib/quickstart/User.hbm.xml" /> 
    16.  
    17.    
    18.  session-factory> 
    19.  
    20. hibernate-configuration> 
    21.  

    说说上面?"dialect", q个对应着hibernate生成哪种数据库的sql。然后是Q?show_sql", q个是ؓ了调试时候输出sql语句到屏q用的?/p>

    注意"mapping resource"部分。这个部分表CZ?实体- 数据?映射文g的位|。(什么是实体-数据?映射文gQ看下面。)

    实体-数据库映文?-- 主要是告诉hibernateQ这个Userc,对应着哪个tableQUserc里面的那个属性对应着table里面的哪个字Dc我们可以徏?实体-数据?的xml映射文gQ也可以采用Annotations映射Q但是目前只说xml映射方式。如下:

            
    1. xml version="1.0" encoding="utf-8"?> >  <hibernate-mapping>  <class name="org.py.hib.quickstart.User" table="user">                 <id name="id" type="java.lang.String" column="id" length="32">    <generator class="uuid" />   id>    <property name="name"  type="java.lang.String" column="name" length="32" />  class> hibernate-mapping>    

    上面的xmlq是很好理解的。注意一个generator中的classQ他可以有很多。我们这用的是uuid。什么是uuid。这个可以google一下。呵cgoogle是最好的教科书。还能有很多其他的,比方_native。具体的同样hgoogle。有了上面的准备Q那么我们开始来试一下。这里我们用junit。具体怎么使用junitQ呵c答案我惛_安知道了,也不用我说了。其实我对test ?使用它也不熟l?/p>

    我把试用力攑ֈ了test/org.py.hib.quickstart下面。代码如下:

            
    1. package org.py.hib.quickstart;  
    2.  
    3. import junit.framework.Assert;  
    4. import junit.framework.TestCase;  
    5.  
    6. import org.hibernate.Session;  
    7. import org.hibernate.SessionFactory;  
    8. import org.hibernate.Transaction;  
    9. import org.hibernate.cfg.Configuration;  
    10. import org.junit.After;  
    11. import org.junit.Before;  
    12.  
    13. public class QuickStartTest extends TestCase  
    14. {  
    15.  SessionFactory factory;  
    16.  
    17.  String m_name = "ryanpoy";  
    18.  
    19.  String m_name2 = "ryanpoy2";  
    20.  
    21.  @Before  
    22.  public void setUp() throws Exception  
    23.  {  
    24.   Configuration conf = new Configuration().configure();  
    25.   factory = conf.buildSessionFactory();  
    26.  }  
    27.  
    28.  /**  
    29.   * 试d  
    30.   * @throws Exception  
    31.   */  
    32.  public void testSave() throws Exception  
    33.  {  
    34.   System.out.println("\n=== test save ===");  
    35.   User u = new User();  
    36.   u.setName(m_name); // 讄用户?nbsp;= m_name  
    37.  
    38.   Session session = null;  
    39.   Transaction tran = null;  
    40.   try  
    41.   {  
    42.    session = factory.openSession();  
    43.    tran = session.beginTransaction();  
    44.    session.save(u);  
    45.    tran.commit();  
    46.  
    47.    Assert.assertEquals(u.getId() != null, true);  
    48.   } catch (Exception ex)  
    49.   {  
    50.    tran.rollback();  
    51.    throw ex;  
    52.   } finally  
    53.   {  
    54.    if (session != null)  
    55.    {  
    56.     try  
    57.     {  
    58.      session.close();  
    59.     } catch (Exception ex)  
    60.     {  
    61.      // nothing to do  
    62.     } finally  
    63.     {  
    64.      if (session != null)  
    65.       session = null;  
    66.     }  
    67.    }  
    68.   }  
    69.  }  
    70.  
    71.  /**  
    72.   * 试查询  
    73.   * @throws Exception  
    74.   */  
    75.  public void testFind() throws Exception  
    76.  {  
    77.   System.out.println("\n=== test find ===");  
    78.   Session session = null;  
    79.   try  
    80.   {  
    81.    session = factory.openSession();  
    82.    User u = (User) session.createQuery("from User").list().get(0);  
    83.  
    84.    Assert.assertEquals(true, u.getId() != null);  
    85.    Assert.assertEquals(m_name, u.getName());  
    86.   } catch (Exception ex)  
    87.   {  
    88.    throw ex;  
    89.   } finally  
    90.   {  
    91.    if (session != null)  
    92.    {  
    93.     try  
    94.     {  
    95.      session.close();  
    96.     } catch (Exception ex)  
    97.     {  
    98.      // nothing to do  
    99.     } finally  
    100.     {  
    101.      if (session != null)  
    102.       session = null;  
    103.     }  
    104.    }  
    105.   }  
    106.  }  
    107.  
    108.  /**  
    109.   * 试修改  
    110.   * @throws Exception  
    111.   */  
    112.  public void testModify() throws Exception  
    113.  {  
    114.   System.out.println("\n=== test modify ===");  
    115.   Session session = null;  
    116.   Transaction tran = null;  
    117.   try  
    118.   {  
    119.    session = factory.openSession();  
    120.    tran = session.beginTransaction();  
    121.  
    122.    User u = (User) session.createQuery("from User").list().get(0);  
    123.    u.setName(m_name2);  // 修改用户?nbsp;= m_name2.Q原来用户名= m_nameQ? 
    124.    tran.commit();  
    125.  
    126.   } catch (Exception ex)  
    127.   {  
    128.    throw ex;  
    129.   } finally  
    130.   {  
    131.    if (session != null)  
    132.    {  
    133.     try  
    134.     {  
    135.      session.close();  
    136.     } catch (Exception ex)  
    137.     {  
    138.      // nothing to do  
    139.     } finally  
    140.     {  
    141.      if (session != null)  
    142.       session = null;  
    143.     }  
    144.    }  
    145.   }  
    146.  
    147.   /*  
    148.    * 修改后再查询  
    149.    */  
    150.   System.out.println("\n=== test find after modify ===");  
    151.   try  
    152.   {  
    153.    session = factory.openSession();  
    154.    User u = (User) session.createQuery("from User").list().get(0);  
    155.  
    156.    Assert.assertEquals(true, u.getId() != null);  
    157.    Assert.assertEquals(m_name2, u.getName());  
    158.   } catch (Exception ex)  
    159.   {  
    160.    throw ex;  
    161.   } finally  
    162.   {  
    163.    if (session != null)  
    164.    {  
    165.     try  
    166.     {  
    167.      session.close();  
    168.     } catch (Exception ex)  
    169.     {  
    170.      // nothing to do  
    171.     } finally  
    172.     {  
    173.      if (session != null)  
    174.       session = null;  
    175.     }  
    176.    }  
    177.   }  
    178.  }  
    179.  
    180.  /**  
    181.   * 试删除  
    182.   * @throws Exception  
    183.   */  
    184.  public void testDelete() throws Exception  
    185.  {  
    186.   System.out.println("\n=== test delete ===");  
    187.   Session session = null;  
    188.   Transaction tran = null;  
    189.   try  
    190.   {  
    191.    session = factory.openSession();  
    192.    tran = session.beginTransaction();  
    193.  
    194.    User u = (User) session.createQuery("from User").list().get(0);  
    195.    session.delete(u);  
    196.    tran.commit();  
    197.  
    198.   } catch (Exception ex)  
    199.   {  
    200.    throw ex;  
    201.   } finally  
    202.   {  
    203.    if (session != null)  
    204.    {  
    205.     try  
    206.     {  
    207.      session.close();  
    208.     } catch (Exception ex)  
    209.     {  
    210.      // nothing to do  
    211.     } finally  
    212.     {  
    213.      if (session != null)  
    214.       session = null;  
    215.     }  
    216.    }  
    217.   }  
    218.  
    219.   /*  
    220.    * 删除后再查询  
    221.    */  
    222.   System.out.println("\n=== test find after delete ===");  
    223.   try  
    224.   {  
    225.    session = factory.openSession();  
    226.    Integer num = (Integer) session.createQuery("from User").list().size();  
    227.  
    228.    Assert.assertEquals(0, num.intValue());  
    229.   } catch (Exception ex)  
    230.   {  
    231.    throw ex;  
    232.   } finally  
    233.   {  
    234.    if (session != null)  
    235.    {  
    236.     try  
    237.     {  
    238.      session.close();  
    239.     } catch (Exception ex)  
    240.     {  
    241.      // nothing to do  
    242.     } finally  
    243.     {  
    244.      if (session != null)  
    245.       session = null;  
    246.     }  
    247.    }  
    248.   }  
    249.  }  
    250.  
    251.  /**  
    252.   *   
    253.   */  
    254.  @After  
    255.  public void tearDown() throws Exception  
    256.  {  
    257.   factory.close();  
    258.  }  
    259.  
    260. }  

    q行后,我们很欣慰的看到一路绿灯,全部通过了。那么测试没有问题。呵?q里的测试可能还不完善。请大家指出。前面说q,我对试q块也不??br /> 看控制台Q会输出如下信息Q?/p>

            
    1. === test save ===  
    2. Hibernate: insert into hibernatequickuse.user (name, id) values (?, ?)  
    3.  
    4. === test find ===  
    5. Hibernate: select user0_.id as id2_, user0_.name as name2_ from hibernatequickuse.user user0_ 
    6.  
    7. === test modify ===  
    8. Hibernate: select user0_.id as id4_, user0_.name as name4_ from hibernatequickuse.user user0_  
    9. Hibernate: update hibernatequickuse.user set name=? where id=?  
    10.  
    11. === test find after modify ===  
    12. Hibernate: select user0_.id as id4_, user0_.name as name4_ from hibernatequickuse.user user0_ 
    13.  
    14. === test delete ===  
    15. Hibernate: select user0_.id as id6_, user0_.name as name6_ from hibernatequickuse.user user0_  
    16. Hibernate: delete from hibernatequickuse.user where id=?  
    17.  
    18. === test find after delete ===  
    19. Hibernate: select user0_.id as id6_, user0_.name as name6_ from hibernatequickuse.user user0_  
    20.  


]]>
Hibernate Sequence基础描述http://www.aygfsteel.com/liubijin/archive/2010/05/04/320012.html無所?/dc:creator>無所?/author>Tue, 04 May 2010 03:28:00 GMThttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320012.htmlhttp://www.aygfsteel.com/liubijin/comments/320012.htmlhttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320012.html#Feedback0http://www.aygfsteel.com/liubijin/comments/commentRss/320012.htmlhttp://www.aygfsteel.com/liubijin/services/trackbacks/320012.htmlq里介绍Hibernate SequenceQ包括介l在Oracle sequence首先创徏sequence create sequence seq_idminvalue 1start with 1increment by 1cache 20?/ul>

    Hibernate有很多值得学习的地方,q里我们主要介绍Hibernate SequenceQ包括介lOracle sequence{方面?

    一、ؓ表创增长自段有两U?/strong>

    一U是不同的表使用各自的Hibernate SequenceQ方法如下:
    1、在Oracle sequence首先创徏sequence create sequence seq_idminvalue 1start with 1increment by 1cache 20Q?br /> 2.在你的hbm.xml中的配置seq_id

    q样再插入数据的时候,Hibernate会自动生成如下语句:

    hibernateQ?select seq_id.nextval from dual hibernateQ?insert into YXJK.T_YXJK_WHRYTXL QXM0000Q?ZW0000Q?LXDH00Q?SJHM00Q?DZYJ00QIP0000Q?ID0000Q?values Q?Q?Q, Q, Q, Q, Q, Q)

    自动生成下一个序列|然后对象插入表中。在使用的时候需要注意,Hibernate对于sequence的主键的要求是一定要是shorQlongQ或者integer.

    ?q有一U方式是使用公共的sequence

    q各时候可以不指定表用的sequenceQ那么相应的hbm.xml中内ҎQ?/p>

    然后创徏公用的Hibernate sequence对象Q命名ؓ hibernate_sequence
    ◆create sequence hibernate_sequence
    ◆minvalue 0
    ◆maxvalue 99999999
    ◆start with 10000
    ◆increment by 1Q?/p>

    ?注意事项

    如果数据库是从sqlserver{其他数据库UL而来的,那么创徏sequence时的起始值应该比当前表中最大的ID值大Q否则会出现错误Q因为sequence 不会l护是否和导库前现有的值重复?br /> 1、sequenceQ用于Oracle数据?br /> 2、nativeQ跨数据库时使用Q由底层方言产生?/p>

    Default.sequence为hibernate_sequence

    注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。如果Oracle中没有该序列Q连Oracle数据库时会报错?/p>



]]>
错误Qhibernate could not resolve propertyhttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320011.html無所?/dc:creator>無所?/author>Tue, 04 May 2010 03:25:00 GMThttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320011.htmlhttp://www.aygfsteel.com/liubijin/comments/320011.htmlhttp://www.aygfsteel.com/liubijin/archive/2010/05/04/320011.html#Feedback0http://www.aygfsteel.com/liubijin/comments/commentRss/320011.htmlhttp://www.aygfsteel.com/liubijin/services/trackbacks/320011.html 1.hibernate.config.xml中添加的映射文g是否正确
2.映射文g中的cL否正指定?br /> 3.映射文g映射的属性名是否跟类中的属性名一致?br /> 4.映射文g映射的属性类型是否跟cM的属性一致?br /> 5.映射文g映射到属性在c里是否有GET,SETҎ?br /> 6.如果cM的属性名有跟数据库关键字相同的(比如说descQ,那么映射文g中的对应属性的列名要手动指定成别的名字?

]]>
վ֩ģ壺 | | | | Ĭ| ǿ| | ຣʡ| | | ӽ| | | | ͬ| | | | | | | ľ| Թ| | ̫| ̨| | | ͷ| | | Ͽ| | | | | | Ϻ| | | |