随笔-21  评论-29  文章-0  trackbacks-0

在Base类中加入以下代码实现get方法

package cn.itcast.hibernate;
import java.util.Date;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import cn.itcast.hibernate.domain.User;
import org.hibernate.Transaction;
public class Base {

    
public static void main(String[] args) {
        
        User user 
= new User();
        user.setBirthday(
new Date());
        user.setName(
"name");
        addUser(user);    
        
        User u 
= getUser(user.getId());
        System.out.println(
"name:"+u.getName());
    }

    
     
static User getUser(int id){
         Session s 
= null ;
         
try{
             s 
= HibernateUtil.getSession();
             Class userClass 
= User.class;
             User user 
= (User)s.get(User.class,id);
             
return user ;
         }
finally {
             
if(s !=null)
                 s.close();
         }

     }

    
        
static void addUser(User user){
            Session s 
= null ;
            Transaction tx 
= null ;
            
try{
                s 
= HibernateUtil.getSession();
                tx 
= s.beginTransaction();
                s.save(user);
                tx.commit();
            }
catch(HibernateException e){
                
if(tx !=null)
                    tx.rollback();
                
throw e ;
            }
finally {
                
if(s !=null)
                    s.close();
            }

        }

        
}

对get方法参数User.class的理解:
由于Session可以管理多个数据库表所对应的多个实体对象。如果要查询id为1的实体对象,Session.get方法需要知道去哪个数据库表中查询id为1的记录,所以。除了给get方法传递所要查询的实体对象的id值外,还必须给get方法传递实体对象的类型,get方法才能知道去哪个数据库表中进行查询。
控制台显示结果:    name:name

在配置文件hibernate.cfg.xml文件中加入
<property name="show_sql">true</property> 
可显示所执行的sql语句

load方法
懒加载 并不马上访问数据库 只有第一次应用时才访问数据库 load方法的返回对象永远不可能为空

package cn.itcast.hibernate;
import java.util.Date;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import cn.itcast.hibernate.domain.User;
import org.hibernate.Transaction;
public class Base {

    
public static void main(String[] args) {
        
        User user 
= new User();
        user.setBirthday(
new Date());
        user.setName(
"name");
        addUser(user);    
        
        User u 
= getUser(user.getId());
        System.out.println(
"name:"+u.getName());
    }

    
     
static User getUser(int id){
         Session s 
= null ;
         
try{
             s 
= HibernateUtil.getSession();
             Class userClass 
= User.class;
             
//User user = (User)s.get(User.class,id);
             User user1 = (User)s.load(User.class,id);
             System.out.println(
"name:"+user1.getName());
             System.out.println(user1.getClass().getName());
             
return user1 ;
         }
finally {
             
if(s !=null)
                 s.close();
         }

     }

    
        
static void addUser(User user){
            Session s 
= null ;
            Transaction tx 
= null ;
            
try{
                s 
= HibernateUtil.getSession();
                tx 
= s.beginTransaction();
                s.save(user);
                tx.commit();
            }
catch(HibernateException e){
                
if(tx !=null)
                    tx.rollback();
                
throw e ;
            }
finally {
                
if(s !=null)
                    s.close();
            }

        }

        
}


在这里增加的打印user1类名的代码,看到load方法所返回User子类的名称。

save与persist方法的区别:在没有开启事务的时候
save方法会把数据插入到数据,之后又回滚,删掉数据。而persist方法根本就不执行插入。

总结Session的几个主要方法:
  1 save,persist保存数据,persist在事务外不会产生insert语句;
  2.delete,删除对象;
  3.update,更新对象,如果数据库中没有记录,会出现异常;
  4.get,根据id查,会立刻访问数据库。
  5.load,根据id查(返回的是代理,不会立即访问数据库)
  6.saveOrUpdate,merge(根据id和version的值来确定是save或update),调用merge你的对象还是托管的。
  7.lock()把对象变成持久对象,但不会同步对象的状态

下午学习实体对象的三种状态与saveOrUpdate方法。

posted on 2009-05-04 11:10 特立独行 阅读(999) 评论(0)  编辑  收藏 所属分类: Hibernate框架

只有注册用户登录后才能发表评论。


网站导航: