Hibernate的编程接口

1. 基本操作

下面的例子使用的表computer的定义如下:

     create   table  `hibernate`.`computer`(
        `id` 
int   not   null  auto_increment,
       `cpu` 
varchar ( 50 ),
       `mainboard` 
varchar ( 50 ),
       `displaycard` 
varchar ( 50 ),
       `harddisk` 
varchar ( 50 ),
       `display` 
varchar ( 50 ),
       `memory` 
varchar ( 50 ),
       `soundcard` 
varchar ( 50 ),
       `cdrom` 
varchar ( 50 ),
       `mouse` 
varchar ( 50 ),
       `keyboard` 
varchar ( 50 ),
        
primary   key  (`id`)
    );
    
create   unique   index  ` PRIMARY on  `hibernate`.`computer`(`id`);

对应的Computer类如下:

package  com.weportal.computer;

import  java.io.Serializable;

import  org.hibernate.CallbackException;
import  org.hibernate.Session;
import  org.hibernate.classic.Lifecycle;

public   class  Computer  implements  Lifecycle  {
    
private int id;

    
private String cpu;

    
private String mainboard;

    
private String memory;

    
private String harddisk;

    
private String display;

    
private String keyboard;

    
private String mouse;

    
private String displaycard;

    
private String soundcard;

    
private String cdrom;

    
/**
     * 
@return Returns the cpu.
     * @hibernate.property
     * 
     
*/

    
public String getCpu() {
        
return cpu;
    }


    
/**
     * 
@param cpu
     *            The cpu to set.
     
*/

    
public void setCpu(String cpu) {
        
this.cpu = cpu;
    }


    
/**
     * 
@return Returns the display.
     * @hibernate.property
     
*/

    
public String getDisplay() {
        
return display;
    }


    
/**
     * 
@param display
     *            The display to set.
     
*/

    
public void setDisplay(String display) {
        
this.display = display;
    }


    
/**
     * 
@return Returns the displaycard.
     * @hibernate.property
     
*/

    
public String getDisplaycard() {
        
return displaycard;
    }


    
/**
     * 
@param displaycard
     *            The displaycard to set.
     
*/

    
public void setDisplaycard(String displaycard) {
        
this.displaycard = displaycard;
    }


    
/**
     * 
@return Returns the harddisk.
     * @hibernate.property
     
*/

    
public String getHarddisk() {
        
return harddisk;
    }


    
/**
     * 
@param harddisk
     *            The harddisk to set.
     
*/

    
public void setHarddisk(String harddisk) {
        
this.harddisk = harddisk;
    }


    
/**
     * 
@return Returns the id.
     * @hibernate.id generator-class = "native"
     
*/

    
public int getId() {
        
return id;
    }


    
/**
     * 
@param id
     *            The id to set.
     * 
     
*/

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


    
/**
     * 
@return Returns the keyboard.
     * @hibernate.property s
     
*/

    
public String getKeyboard() {
        
return keyboard;
    }


    
/**
     * 
@param keyboard
     *            The keyboard to set.
     
*/

    
public void setKeyboard(String keyboard) {
        
this.keyboard = keyboard;
    }


    
/**
     * 
@return Returns the mainboard.
     * @hibernate.property
     
*/

    
public String getMainboard() {
        
return mainboard;
    }


    
/**
     * 
@param mainboard
     *            The mainboard to set.
     
*/

    
public void setMainboard(String mainboard) {
        
this.mainboard = mainboard;
    }


    
/**
     * 
@return Returns the memory.
     * @hibernate.property
     
*/

    
public String getMemory() {
        
return memory;
    }


    
/**
     * 
@param memory
     *            The memory to set.
     
*/

    
public void setMemory(String memory) {
        
this.memory = memory;
    }


    
/**
     * 
@return Returns the mouse.
     * @hibernate.property
     
*/

    
public String getMouse() {
        
return mouse;
    }


    
/**
     * 
@param mouse
     *            The mouse to set.
     
*/

    
public void setMouse(String mouse) {
        
this.mouse = mouse;
    }


    
/**
     * 
@return Returns the soundcard.
     * @hibernate.property
     
*/

    
public String getSoundcard() {
        
return soundcard;
    }


    
/**
     * 
@param soundcard
     *            The soundcard to set.
     
*/

    
public void setSoundcard(String soundcard) {
        
this.soundcard = soundcard;
    }


    
/**
     * 
@return Returns the cdrom.
     * @hibernate.property
     
*/

    
public String getCdrom() {
        
return cdrom;
    }


    
/**
     * 
@param cdrom
     *            The cdrom to set.
     
*/

    
public void setCdrom(String cdrom) {
        
this.cdrom = cdrom;
    }


    
public boolean onSave(Session s) {
        System.out.println(
"on save");
        
return false;
    }


    
public boolean onUpdate(Session s) throws CallbackException {
        System.out.println(
"on update");
        
return false;
    }


    
public boolean onDelete(Session s) throws CallbackException {
        System.out.println(
"on delete");
        
return false;
    }


    
public void onLoad(Session s, Serializable id) {
        System.out.println(
"on load");
    }


    
/**
     * constructor
     
*/

    
public Computer(String... values) {
        
for (int i = 0; i < values.length; i++{
            
switch (i) {
            
case 0:
                setCpu(values[i]);
                
break;
            
case 1:
                setCdrom(values[i]);
                
break;
            
case 2:
                setDisplay(values[i]);
                
break;
            
case 3:
                setDisplaycard(values[i]);
                
break;
            
case 4:
                setHarddisk(values[i]);
                
break;
            
case 5:
                setSoundcard(values[i]);
                
break;
            
case 6:
                setKeyboard(values[i]);
                
break;
            
case 7:
                setMainboard(values[i]);
                
break;
            
case 8:
                setMemory(values[i]);
                
break;
            
case 9:
                setMouse(values[i]);
                
break;
            }

        }

    }


    
public Computer(){
        
    }

}

映射文件Computer.hbm.xml的内容如下:

<? xml version="1.0" ?>
<! DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
< hibernate-mapping  package ="com.weportal.computer" >
  
< class  name ="com.weportal.computer.Computer" >
      
< id  name ="id"  type ="int" >
          
< generator  class ="native" ></ generator >
      
</ id >
      
< property  name ="cpu"  length ="50" ></ property >
      
< property  name ="mainboard"  length ="50" ></ property >
      
< property  name ="displaycard"  length ="50" ></ property >
      
< property  name ="harddisk"  length ="50" ></ property >
      
< property  name ="display"  length ="50" ></ property >
      
< property  name ="memory"  length ="50" ></ property >
      
< property  name ="soundcard"  length ="50" ></ property >
      
< property  name ="cdrom"  length ="50" ></ property >
      
< property  name ="mouse"  length ="50" ></ property >
      
< property  name ="keyboard"  length ="50" ></ property >
  
</ class >
</ hibernate-mapping >

1.1 新建数据

  利用Hibernate新建一个持久化类的对象实例,并将这个对象实例传递到数据库的过程等价于利用JDBC在数据库中建立一行新的数据记录。 简单的持久化类如下所示:

package  com.weportal.hibernate;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.FlushMode;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.Transaction;
import  org.hibernate.cfg.Configuration;

import  com.weportal.computer.Computer;

public   class  NewPOExample  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess 
= sf.openSession();
        sess.setFlushMode(FlushMode.COMMIT);
        Transaction t 
= sess.beginTransaction();        
        Computer pc 
= new Computer();
        pc.setCpu(
"intel 3.9");
        pc.setDisplay(
"LG");
        pc.setDisplaycard(
"geforce 4");
        pc.setHarddisk(
"WD120JB");
        pc.setMainboard(
"gigabyte");
        pc.setMemory(
"kingMax1024MB");
        pc.setMouse(
"logitech");
        pc.setSoundcard(
"creative");
        pc.setKeyboard(
"logitech");   
        
//pc.setId(10);
        System.out.println("id is : " + pc.getId());
        System.out.println(sess.getFlushMode());
        sess.save(pc);
        t.commit();
        sess.close();        
    }

}

程序执行的结果是向数据库中添加了一条新的记录。

1.2 导出数据对象

1.2.1 使用load方法

package  com.weportal.hibernate;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.Transaction;
import  org.hibernate.cfg.Configuration;

import  com.weportal.computer.Computer;

public   class  LoadPOExample  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess 
= sf.openSession();
        Transaction t 
= sess.beginTransaction(); 
        Computer pc 
= new Computer();
        sess.load(pc,
new Integer(1));
        
//Computer pc = (Computer)sess.load(Computer.class, new Integer(2));
        System.out.println(pc.getCpu());
        
//pc.setCpu("CTU season 1");
        sess.save(pc);
        t.commit();
        sess.close();    
    }

}

1.2.2 使用get方法

get()方法在执行时不会因为指定的数据行不存在而抛出异常,而是返回一个null对象。

package  com.weportal.hibernate;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.LockMode;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.Transaction;
import  org.hibernate.cfg.Configuration;

import  com.weportal.computer.Computer;

public   class  GetPOExample  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess 
= sf.openSession();
        Transaction t 
= sess.beginTransaction(); 
        Computer pc 
= (Computer) sess.get(Computer.class,new Integer(10),LockMode.UPGRADE);
                
        
if(pc!=null)pc.setCpu("AMD 4.0");
        
else{
            pc 
= new Computer();
            pc.setCpu(
"AMD 4.0");
        }

        sess.save(pc);
        t.commit();
        sess.close();           
    }

}

1.3 查询数据

1.3.1 HQL查询

createQuery()方法是用来创建HQL语句查询对象的。

package  com.weportal.hibernate;

import  java.util.Iterator;
import  java.util.List;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.FlushMode;
import  org.hibernate.Query;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.Transaction;
import  org.hibernate.cfg.Configuration;

import  com.weportal.computer.Computer;

public   class  ComputerQuery  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess 
= sf.openSession();
        sess.setFlushMode(FlushMode.COMMIT);
        Transaction t 
= sess.beginTransaction();    
        Query q 
= sess.createQuery("from Computer where cpu = 'Intel 奔腾 P4 2.3B GHz'");
/*        for(Iterator it = q.iterate();it.hasNext();){
            Computer pc = (Computer)it.next();
            System.out.println(pc.getCpu());
        }
*/

        List results 
= q.list();
        
for(Iterator it = results.iterator();it.hasNext();){
            Computer pc 
= (Computer)it.next();
            System.out.println(pc.getCpu());
        }

        t.commit();
        sess.close(); 
    }

}

1.3.2 条件查询示例代码如下:

package  com.weportal.hibernate;

import  java.util.Iterator;
import  java.util.List;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.Criteria;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.cfg.Configuration;
import  org.hibernate.criterion.Expression;

import  com.weportal.computer.Computer;

public   class  CriteriaQuery  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess 
= sf.openSession();
        Criteria cr 
= sess.createCriteria(Computer.class);
        cr.add(Expression.eq(
"cpu","intel 3.9"));
        List ps 
= cr.list();
        System.out.println(
"this is the result begin:");
        
for(Iterator it = ps.iterator();it.hasNext();){
            System.out.println(((Computer)it.next()).getCpu());
        }

        sess.close();  
        System.out.println(
"this is the result end.");
    }

}

1.3.3 滚动结果集示例代码:

package  com.weportal.hibernate;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.Query;
import  org.hibernate.ScrollMode;
import  org.hibernate.ScrollableResults;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.Transaction;
import  org.hibernate.cfg.Configuration;

import  com.weportal.computer.Computer;

public   class  ComputerScrollView  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess 
= sf.openSession();
        Transaction t 
= sess.beginTransaction();
        Query q 
= sess.createQuery("from Computer as pc");
        ScrollableResults sr 
= q.scroll(ScrollMode.SCROLL_INSENSITIVE);
        
while(sr.next()){
            Computer pc 
= (Computer) sr.get(0);
            System.out.println(((Computer) sr.get(
0)).getCpu());
        }

        sr.first();
        System.out.println(((Computer) sr.get(
0)).getCpu());    
        sr.next();
        System.out.println(((Computer) sr.get(
0)).getCpu());    
        sr.previous();
        System.out.println(((Computer) sr.get(
0)).getCpu());         
        sr.close();
        t.commit();
        sess.close();     
    }

}

1.4 更新数据

Session接口的update()方法可以更新持久化数据对象,使其对象属性的状态改变传递到数据库。

package  com.weportal.hibernate;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.Transaction;
import  org.hibernate.cfg.Configuration;

import  com.weportal.computer.Computer;

public   class  UpdateExample  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess01 
= sf.openSession();
        Transaction t01 
= sess01.beginTransaction();   
        Computer pc01 
= new Computer();
        sess01.load(pc01,
new Integer(2));
        pc01.setCpu(
"intel 2.4");
        sess01.update(pc01);
        t01.commit();
        sess01.close();
        Session sess02 
= sf.openSession();   
        sess02.load(pc01,
new Integer(2));        
        System.out.println(pc01.getCpu());
        sess02.close();
    }

}

1.5 删除数据

delete()方法,由于持久化对象对应于数据库中数据表的一行记录,所以在Session删除持久化类对象的同时,表中对应的记录也被删除。

package  com.weportal.hibernate;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.Transaction;
import  org.hibernate.cfg.Configuration;

import  com.weportal.computer.Computer;

public   class  DeletePO  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess 
= sf.openSession();
        Transaction t 
= sess.beginTransaction();   
        Computer pc 
= new Computer();
        sess.load(pc,
new Integer(1));
        sess.delete(pc);
        t.commit();
        sess.close();
    }

}

1.6 数据对象的生命周期(Life Cycle)

在Hibernate中,持久化类对象存在生命周期,持久化类可以通过实现LifeCycle接口的方法来添加处理生命周期事件的方法。上面的Computer类即实现了该接口。

1.7 Session的缓冲

Session可以为持久化数据对象建立缓冲,同时也可利用Session的evict()方法从其缓冲中删除持久化对象的实例。

package  com.weportal.hibernate;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.FlushMode;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.Transaction;
import  org.hibernate.cfg.Configuration;

import  com.weportal.computer.Computer;

public   class  SessEvictTest  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess 
= sf.openSession();
        sess.setFlushMode(FlushMode.COMMIT);
        Transaction t 
= sess.beginTransaction();  
        Computer pc 
= (Computer) sess.get(Computer.class,new Integer(2));
        pc.setCpu(
"amd 3.5");
        sess.save(pc);
        sess.flush();
        sess.evict(pc);
        sess.refresh(pc);
        t.commit();
        sess.close();         
    }

}

2 元数据接口

可以从持久化类对象中获取其元数据信息,元数据中包含了映射文件中配置的信息和持久化类的属性等内容。

2.1 持久化类的元数据ClassMetadata

package  com.weportal.hibernate;

import  org.apache.log4j.PropertyConfigurator;
import  org.hibernate.EntityMode;
import  org.hibernate.Session;
import  org.hibernate.SessionFactory;
import  org.hibernate.cfg.Configuration;
import  org.hibernate.metadata.ClassMetadata;

import  com.weportal.computer.Computer;

public   class  MetadataExample  {

    
public static void main(String[] args) {
        PropertyConfigurator.configure(
"log4j.Properties");
        Configuration cfg 
= new Configuration();
        cfg.configure();
        SessionFactory sf 
= cfg.buildSessionFactory();
        Session sess 
= sf.openSession();
        Computer pc 
= (Computer) sess.get(Computer.class,new Integer(16));
        ClassMetadata pcMeta 
= sf.getClassMetadata(Computer.class);
        String[] names 
= pcMeta.getPropertyNames();
        Object[] values 
= pcMeta.getPropertyValues(pc,EntityMode.POJO);
        
for(int i=0;i<names.length;i++){
            System.out.println(
"属性:"+names[i]+"="+values[i]);
        }
        
        sess.close();
    }

}

程序的执行结果如下:

on load
属性:cpu
= intel  3.9
属性:mainboard
= gigabyte
属性:displaycard
= geforce  4
属性:harddisk
= WD120JB
属性:display
= LG
属性:memory
= kingMax1024MB
属性:soundcard
= creative
属性:cdrom
= null
属性:mouse
= logitech
属性:keyboard
= logitech

2.2  集合的元数据

是针对集合属性设计的元数据接口,通过这个接口,可以获得有关集合属性的信息。

3 编程接口汇总

SessionFactory、Session、Query、Criteria、ClassMetadata、CollectionMetadata、FlushMode、LockMode、ScrollMode、ReplicationMode、FetchMode

参考《精通Hibernate》 刘洋 著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值