Hibernate中Session中的核心方法

package zhang.hibernate.tests;

import java.sql.Connection;
import java.sql.SQLException;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import zhang.hibernate.domian.Person;

public class TestHibernate {
private SessionFactory sessionFactory = null;
private Session session = null;
private Transaction transaction = null;

// 注意:junit测试框架在执行每一个Test方法之前,都会执行这个方法

@Before
public void init() {
	// 1.Configuration: 代表了Hibernate的配置信息
	Configuration configuration = new Configuration().configure();
	// 2.注册Hibernate的服务
	ServiceRegistry serviceRegistry = 
			new ServiceRegistryBuilder().applySettings(configuration.getProperties())
										.buildServiceRegistry();
	// 3.获取sessionFactory对象: 制造Session的工厂对象
	sessionFactory = configuration.buildSessionFactory(serviceRegistry);
	// 4.获取Session对象Hibernate的核心方法,由session对象调用
	session = sessionFactory.openSession();
	// 5.开启事务
	transaction = session.beginTransaction();
}
// 注意:junit测试框架在执行每一个Test方法之后,都会执行这个方法
@After
public void destroy() {
	// 6.提交事务
	transaction.commit();
	// 7.关闭Session对象
	session.close();
	// 8.关闭SessionFartory对象
	sessionFactory.close();
}
//通过hibernate,调用存储过程
@Test
public void testDoWork(){
	session.doWork(new Work() {
		@Override
		public void execute(Connection connection) throws SQLException {
			System.out.println(connection);
		}
	});
}
/**
 * Evict():
 * 从session缓存中将对象移除
 */
@Test
public void testEvict(){
	Person person1=(Person) session.get(Person.class, 11);
	Person person2=(Person) session.get(Person.class, 12);
	
	person1.setName("AA");
	person2.setName("BB");
	session.evict(person1);
}
/**
 * delete():删除,若数据数据库中有对应的OID则执行删除操作,如果没有对应的记录的话,抛出异常
 * 可以通过设置hibernate的配置文件,是删除后的OID值为null:use_identifier_rollback设置为true,默认是false
 */
@Test
public void testdelete(){
	Person person =new Person(12,"pp");
	person.setId(7);
	session.delete(person);
	System.out.println(person);
}
/**
 * SaveOrUpdate():
 * 		1.执行更新或者保存操作,判定的标准是OID是否为空,如果为空,进行Save操作,如果不为空,进行Update操作
 * 		2.如果update不为空的话,并且数据表中没有对应的记录的话,会抛出一个异常
 */
@Test
public void testSaveOrUpdate(){
	Person person =new Person(11, "Mom");
	person.setId(600);
	session.saveOrUpdate(person);
}
/**
 * Update():
 * 1.若更新一个持久化对象,不需要显示的调用update()方法,因为在执行transaction.commit()的时候 ,会调用session的flush
 *   方法,会自动的发送一条update语句.
 * 2.如果要更新一个游离对象,需要显示的调用update()方法,将游离对象转化成一个持久化对象.
 * 	  游离对象:在数据库中存在,但是在session中不存在.
 * 3.需要注意:
 * 	      1).无论游离对象和数据库中的记录是否一致的话,都会发送update语句.
 * 		  2).在hibernate和触发器协同工作的时候,如何使其不盲目的发送sql语句?,在hbm.xml中配置class节点中
 * 			  配置: select-before-update="true"
 * 		  3).若数据表中没有没有对应的记录,还调用了update方法,将会抛出一个异常	
 * 		  4).在将一个游离对象转化成一个持久化对象的时候,如果在此之前Session中已经存在相同OID的持久化对象的话
 * 			  会抛出一个异常.	
 */		
@Test
public void testupdate2(){
	Person person=new Person(12, "UU");
	person.setId(7);
	session.update(person);
}
@Test
public void testUpdate(){
	Person person=(Person) session.get(Person.class, 7);
	transaction.commit();
	session.close();
	
	session = sessionFactory.openSession();
	transaction = session.beginTransaction();
	Person person2=(Person) session.get(Person.class, 7);
	session.update(person);
}
@Test
public void testsave(){
	Person person =new Person(11, "PPP");
	session.save(person);
	System.out.println(person);
}
/**
 * get()和load()的区别:
 * 	1.执行 get()方法,会立即加载对象.
 * 	2.执行 load()方法,不会立即加载对象,而是会获得一个代理对象.
 * 	(get()是立即检索,load()是延迟检索)
 * 
 * 	3.如果数据库中没有对应的记录,Session没有关闭,且要使用对象的时候:
 * 	  get()返回null,load()抛出一个异常.
 * 	4.load()方法可能会抛出一个懒加载异常: LazyInitializationException 原因: 在初始化代理对象之前关闭了session对象
 */
@Test
public void testLoad(){
	Person person=(Person)session.load(Person.class, 6);
	System.out.println(person.getClass().getName());
	session.close();
	System.out.println(person);
}
@Test
public void Testget(){
	Person person=(Person)session.get(Person.class, 6);
	session.close();
	System.out.println(person);
}
/**
 * Persist()方法:与Save()方法一样,都会向数据库发送一条insert语句
 * 与save()方法的区别:如果在调用 Persist() 方法之前对象存在id,则不能执行Insert操作,会抛出一个异常
 * 
 * 异常信息:org.hibernate.PersistentObjectException
 */
@Test
public void testPersist(){
	Person person =new Person();
	person.setAge(23);
	person.setName("Jake");
	//person.setId(100);
	System.out.println(person);
	session.persist(person);
	System.out.println(person);
}
/**
 * save()方法:
 * 1.将一个临时对象转变成一个持久化对象.
 * 2.Hibernate会自动的位对象分配一个ID.
 * 3.在save()方法之前设置 ID 是无效的.
 * 4.持久化对象的 ID 是不能够修改的
 * 5.在 save() 方法执行的时候,会立刻会发送一条 insert 语句
 */
@Test
public void TestSave(){
	Person person =new Person();
	person.setAge(22);
	person.setName("Rose");
	System.out.println(person);
	session.save(person);
	System.out.println(person);
	//person.setId(100);
	
}
/**
 * refresh():在查询数据库的过程中,要使session中的对象是最新的话,可以使用 refresh() 方法
 * 会自动的发送一条 select 语句给数据库,使 session 中的对象和数据库最新的状态相对应.
 */
@Test
public void testrefresh(){
	Person person =(Person) session.get(Person.class, 2);
	System.out.println(person);
	session.refresh(person);
	System.out.println(person);
}
/**
 * Clear():清理 Session 的缓存:在执行该方法的时候,Session中所有存取的对象都将被清理
 * 因此:在这个例子中,将会发送 select 语句.
 */
@Test
public void testClear() {
	Person person = (Person) session.get(Person.class, 2);
	System.out.println(person);
	session.clear();
	Person person2 = (Person) session.get(Person.class, 2);
	System.out.println(person2);
}
/**
 * flush():Hibernate为了使数据库中的对象和Session中的对象保持一致,在执行transaction.commit()方法之前,如果
 * 感知到session中的对象发生改变的话,会调用session.flush()方法,向数据库发送一条update语句,但是不会提交事务.
 * 
 * 注意:1.在没用提交事务,和没有显示的调用flush方法,也有可能会进行 flush() 操作 1).执行 HQL 或 QBC
 * 查询,会先进行 flush 操作,以得到数据库的最新的记录
 * 2).在进行save()操作的时候,将会立即的发送insert语句,而不会等到事务提交的时候在发送,原因是hibernate要得到主键值.
 */
@Test
public void testflush2() {
	Person person = new Person(12, "Tomcat");
	session.save(person);
}
@Test
public void testflush() {
	Person person = (Person) session.get(Person.class, 2);
	person.setName("java");
	// session.flush();//手动的执行flush方法
	Person person2 = (Person) session.createCriteria(Person.class).uniqueResult();
	System.out.println(person2);
}
/**
 * 1.Session一级缓存: 调用session的get(),从数据库中获取一个对象,Hibernate会将这个对象保存在Session中
 * 因此第二次执行get()方法的时候,如果Session中存在该对象,会Hibernatae会先从Session获取,
 * 所以只会执行一次SELECT语句. 2.作用:减少查询数据库的次数,提高效率.
 */
@Test
public void testSessionCache() {
	Person person = (Person) session.get(Person.class, 1);
	System.out.println(person);
	Person person1 = (Person) session.get(Person.class, 1);
	System.out.println(person1);
}
/**
 * get():从数据库中获取一个对象
 */
@Test
public void testget() {
	Person person = (Person) session.get(Person.class, 1);
	System.out.println(person);
}
/**
 * save():向数据库中保存一个对象
 */
@Test
public void testSave() {
	Person person = new Person(22, "justinerbier");
	session.save(person);
}
/**
 * Hibernate的核心API方法
 */
@Test
public void test() {
	SessionFactory sessionFactory = null;
	Configuration configuration = new Configuration().configure();
	ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
			.buildServiceRegistry();
	sessionFactory = configuration.buildSessionFactory(serviceRegistry);
	Session session = sessionFactory.openSession();
	Transaction transaction = session.beginTransaction();

	Person person = new Person(12, "zhangyukang");
	session.save(person);

	transaction.commit();
	session.close();
	sessionFactory.close();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值