hibernate三种状态及常用方法

用hibernate做了几个小项目了 不过感觉就用了ormapping 一些save方法 query方法
很多东西也不明白 也没专门去搞清楚,昨天去面试问了挺多东西 我答得都模棱两可的
不过好像也没错 呵呵 不过还是应该搞搞清楚

今天看了尚学堂的视频 做点小结吧

package my.hibernate.util;


import my.hibernate.pojo.Customer;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class Base {

	
	public static void main(String... args)
	{
		/*Customer customer=new Customer();
		customer.setName("YM");
		//上面的对象处于瞬时态 其与数据库和session都没关系
		
		add(customer);
		System.out.println("customerid是"+customer.getCustomerid());*/
		//上面的对象处于脱管态 数据库中有相应的记录 但是因为session已经关闭 故与session无关了
		
		//对脱管状态的对象进行更新的时候需要调用update方法
		Customer customer=getCustomerById(18);
		
		System.out.println("所查询的用户是"+customer.getName());
	}
	
	//添加
	static void add(Object obj)
	{
		Session session=null;
		Transaction tx=null;
		try
		{
			session=HibernateUntil.getSession();
			tx=session.beginTransaction();
			
			//如果没有事务的话 会插入数据库 又被回滚
			session.save(obj);
			//obj此时属于持久状态 在session关闭之前都处于持久状态
			//处于持久态的对象发生变化的时候 数据库中也会发生相应变化
			
			//如果没有事务的话 persist方法则不插入数据库 会报错
			//session.persist(obj);
			
			
			//调用saveOrUpdate()方法的时候对象会变成持久态
			//而调用merge()方法的时候对象写入了数据库但对象依然是脱管的
			tx.commit();
			//如果处于持久态的对象进行了修改 hibernate将在commit的时候写到数据库中
		}
		//catch部分不写也可以!
		catch(HibernateException ex)
		{
			//事物回滚 并且将异常抛出
			if(tx!=null)
				tx.rollback();
			throw ex;
			}
		finally
		{
			if(session!=null)
				session.close();
		}
	}
	
	static Customer getCustomerById(int id)
	{
		Session session=null;
		try
		{
			session=HibernateUntil.getSession();
			//get是从数据库中查询一条记录
//			Customer customer=(Customer)session.get(Customer.class, id);
			
			//load是懒加载 并没有直接访问数据库 等到调用的时候 比如customer1.getName()时候才进行数据库访问,这种方式不推荐多用
			//因为任何时候customer1都不是为空的 load自己new了一个对象!! 如果库表中没有该记录 但customer1也不是空的 明白???!!
			Customer customer1=(Customer)session.load(Customer.class, id);
			
			//这个时候才会访问数据库 没有这句话将会报错
			customer1.getBandid();
			return customer1;
		}
		finally
		{
			if(session!=null)
				session.close();
		}
	}
}

你可能感兴趣的:(Hibernate,面试)