第五篇:Hibernate开发步骤注意事项详解2

一、处理数据库异常的两种方式

1、捕获异常,然后让事务回滚并将异常报告出去

try{
	s=HibernateUtil.getSession();
	tx=s.beginTransaction();
	s.save(user);
	tx.commit();
}catch (HibernateException e) {
	if(tx!=null)
	<span style="white-space:pre">	</span>tx.rollback();
	throw e;
}finally{
	if(s!=null)
		s.close();
}

2、出错后不处理(出现异常后会自动外抛,最终数据库因没收到事务的提交请求,而将事务回滚。)

try{
	s=HibernateUtil.getSession();
	tx=s.beginTransaction();
	s.save(user);
	tx.commit();
}finally{
	if(s!=null)
	<span style="white-space:pre">	</span>s.close();
}
不论哪种,都需要将Session关闭。

二、两种访问数据库方式

1、HQL

面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性,其他不区分大小写);HQL中查的是对象而不是表,并且支持多态;HQL主要通过Query来操作,Query的创建方式:

 Query q=session.createQuery(hql);
 1)from Person
 2)from User as user where user.name=:name
 3)from User as user where user.name=:name and user.birthday<:birthday

2、Criteria

是一种比HQL更面向对象的查询方式。Criteria的创建方式:

Criteria crit=session.createCriteria(DomainClass.class);
简单属性条件如:crit.add(Restrictions.eq(propertyName, value));
crit.add(Restrictions.eqProperty(propertyName, otherPropertyName));
三、对Hibernate来说,对象的三种状态

对Hibernate来说,一个对象会处于以下几种状态:

1、瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收期回收,一般是new出来且Session没有关联的对象。

2、持久(persistent):满足两个条件:1)数据库中有数据与之对应;2)当前与Session有关联,并且关联的Session没有关闭。事务没有提交时:持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。

3、脱管(detached):数据库中有数据与之对应,但当前没有Session与之关联。脱管对象状态发生改变,hibernate不能检测到,即不会影响到数据库。

四、了解Session接口

Session的几个主要方法:
save、persist保存数据,persist在事务外不会产生insert语句。
delete删除对象
update更新对象,如果数据库中没有记录,会出现异常
get根据ID查,会立刻访问数据库
load根据ID查(返回的是代理,不会立即访问数据库。用load()时,永远不要判断返回的对象是否为null,因为load()内部会先产生一个子类,所以它不可能返回null)。
saveOrUpdate、merge(根据ID和version的值来确定是save或update。处于瞬时状态的对象id无值,处于脱管状态的对象id有值;hibernate根据id是否有值来判断是进行save还是update(有值就update无值就save,如果主键是int型,则判断是否为0;如果主键为String型,则判断是否为null)),调用merge你的对象还是托管的。调用saveOrUpdate你的对象会变成持久的。
lock把对象变成持久对象,但不会同步对象的状态。

all方法:

s.beginTransaction();
s.clear();//清除缓存
s.close();//关闭session
s.connection();//拿到session中包装的connection,已废弃,最好不用。
s.contains();//判断session中是否包含对象
s.createCriteria();  s.createQuery();//后续介绍
s.delete();//删除session中 的对象
s.flush();//使得session和数据库进行一次同步
s.get();//根据主键从数据库拿一条数据
s.load();//与get()类似,只是是懒加载。
s.persist();//保存。与save()区别:若无事务,用save()时,则会插入数据库,然后再回滚 ,删掉该条数据,最后没保存到数据库中;而用persist()时,则不会插入数据库,最后没保存到数据库中。
s.refresh();//重新读取一次
s.merge();s.saveOrUpdate();//根据ID和version值来确定是save或update,调用merge你的对象还是托管的。
s.update();//更新对象,如果数据库中没有记录,会出现异常。
s.lock();//查一条数据出来,并且给他加上锁(把对象变成持久对象,但不会同步对象的状态)。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值