session API

Hibernate API

        http://docs.jboss.org/hibernate/core/3.2/api/


1、对象的三种状态

三种状态的区别在于:

有没有ID,ID在数据库中有没有,在内存中有没有(session缓存)

三种状态

Transient:内存中的一个对象,没有ID,缓存中也没有

Persistent:内存中有,缓存中有,数据库中有ID

Detached:内存中有,缓存中没有,数据库有ID

2、Session

管理一个数据库的任务单元,即管理数据库中的增删改查操作,

提交事务.

方法CRUD:save(),delete(),update(),saveOrUpdate(),load(),get(),clear().

session.beginTransaction();

session.save(Object obj);

session.getTransaction().commit();

session.close();


3、get()load()的区别

l  查找时,都会优先从session的缓存中查找.

l  查找不存在对应记录时,表现不一样.load方法查找不到时不会报错,get查找不到时会报错.

l  Load返回的是代理对象,等到真正要用到对象的内容时才发起SQL语句.get直接发起SQL语句从数据库中取出,不会延迟.


4、Update()方法

用来更新detached对象,更新完成之后成为persistent.

更新 transient 对象会报错 更新自己设定 id( 前提是 id 在数据库中存在 ) transient 对象可以 .

持久化的对象只要设定不同字段就会发生更新

4 更新部分更改的字段(三种方法)

l  XML设定property标签的update=true|false属性,

annotation设定@Column(updatable=false)属性,这种方式少用,不灵活.

l  XML设定class标签的dynamic-update=”true”属性,

同一个session中可以,session不行.session时的实现方法不过可以用sessionmerge().merge方法会先从数据库load,将得到的和数据库中的进行对比,update更改过的字段.

JPA1.0 Annotation没有对应的属性,Hibernate

l  使用HQL(EJBQL)(建议使用)

		Session se = sessionFactory.openSession();
		se.beginTransaction();
		Query query = se.createQuery("update Users u set u.name='abcdef' where u.id='5'");
		query.executeUpdate();
		se.getTransaction().commit();

clear()方法:

清除session中的缓存.调用clear()方法会强制清除session缓存.不会与数据库打交道.

flush()方法:

session的事务提交后,会强制进行从内存(session缓存)到数据库的同步.默认情况下是session的事务提交时才同步.不常用.


public class UsersTest {
	private static SessionFactory sessionFactory;
	
	@BeforeClass
	public static void beforeClass() {
		sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
	}
	
	@AfterClass
	public static void afterClass() {
		sessionFactory.close();
	}
	
	@Test
	public void testUsersSave() {
		Users users = new Users();
		users.setName("xiaomi");
		users.setPassword("1234444"); 
		
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		session.save(users);
		session.getTransaction().commit();
	}
	
	@Test
	public void testUsersDelete() {
		Users users = new Users();
		users.setId(7);
		
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		session.delete(users);
		session.getTransaction().commit();
	}
	
	@Test
	public void testLoad() {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		Users users = (Users) session.load(Users.class, 8);
		System.err.println(users.getName());
		session.getTransaction().commit(); 
	}
	
	@Test
	public void testGet() {  //从数据库中获取一条记录转换成对象
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		Users users = (Users) session.get(Users.class, 8);
		System.err.println(users.getName());
		session.getTransaction().commit(); 
	}
	
	@Test
	public void testUpdate1() {   
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		Users users = (Users) session.get(Users.class, 8);
		System.err.println(users.getName());
		session.getTransaction().commit(); 
		
		users.setName("hhhhh");
		Session se = sessionFactory.openSession();
		se.beginTransaction();
		se.update(users);
		se.getTransaction().commit();
	}
	
	@Test
	public void testUpdate2() {   
		Users users = new Users();
		users.setId(5);
		users.setName("haaaah");
		users.setPassword("11111"); 
		
		Session se = sessionFactory.openSession();
		se.beginTransaction();
		se.update(users);
		se.getTransaction().commit();
	}
	
	@Test
	public void testUpdate3() {   
		
		Session se = sessionFactory.openSession();
		se.beginTransaction();
		Query query = se.createQuery("update Users u set u.name='abcdef' where u.id='5'");
		query.executeUpdate();
		se.getTransaction().commit();
	}
	
	@Test
	public void testSChemaExport(){ //生成建表语句
		new SchemaExport(new AnnotationConfiguration().configure()).create(true, false);
	} 
	
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值