hibernate学习笔记(二)

<span style="font-size:18px;">
<property name="hbm2ddl.auto">update</property></span>

这段代码是写在hibernate核心配置文件hibernate.cfg.xml中的,意思是可以更改数据库后自动生成表,update这个位置上可以写很多东西,update的意思是如果之前有这张表并且没有任何结构上的修改那么update就不会动,反之,update会创建一张新表;如果是create,意思就是直接会创建一张新表,如果之前有这张表create也会覆盖掉原来的,这就是二者的区别。



hibernate的开发方式有三种:

1.Domain->mapping->DB(官方推荐的方法)

先写我们的对象,然后建立映射关系,最后实现数据库的内容

2.先从DB入手,先建表,然后利用工具生成mapping和Domain

3.从mapping先开始(感觉怪怪的,没试过...)

一般现在的大多使用第二种方法,因为建表比较容易,剩下的有工具来做相对容易一些



还有要注意,我们使用对象对数据库进行修改等操作都是使用的事务提交的形式(session.commit())那么如果在提交之前出现了异常,如果事务还在我们应该让它回滚(session.rollback()),这个时候我们可以用try catch块把它圈起来,进行事务回滚,注意最后finally的时候记得关闭session(session.close())否则电脑很很慢,因为一堆事务在后台执行,会导致速度变慢。(可以通过cmd  输入netstat -an进行查询,MySQL的端口号是3306,oracle的是1521,sql server的是1433,注意看这几个端口号即可)


configuration是一个类,session,sessionFactory,Transaction都是接口。

configuration大概有以下四个作用:

1. 读取hibernate.cfg.xml

2. 管理对象关系映射文件 <mapping resource=””>

3. 加载hibernate 的驱动,url ,用户..

4. 管理hibernate配置信息

SessionFactory (会话工厂)

1. 可以缓存sql语句和数据(称为session级缓存)

2. 是一个很大的类,因此我们需要保证每一个数据库有一个SessionFactroy

通过SessionFactory 获取 Session的两个方法 openSession()  和getCurrentSession();

1. openSession() 是获取一个新的session

2. getCurrentSession () 获取和当前线程绑定的session,换言之,在同一个线程中,我们获取的session是同一session,这样可以利于事务控制

主要的使用准则就是:

①如果需要在同一线程中,保证使用同一个Session则,使用getCurrentSession()

②如果在一个线程中,需要使用不同的Session,则使用opentSession()

如果使用getCurrentSession()的话需要有一个配置:

         如果是本地的JDBC事务(jdbc):

<property name="hibernate.current_session_context_class">thread</property>

          如果是全局事务(jta):

<property name="hibernate.current_session_context_class">jta</property>
简单来说,本地事务就是说针对一个数据库的事务,全局事务是跨越多个数据库的事务


还有一个需要注意的是:

通过 getCurrentSession() 获取的session在事务提交后,会自动关闭;但是通过openSession()获取的session则必须手动关闭,但是还是建议都进行手动关闭为好。


下面记录一个模板,每次使用的时候只需要修改要做的事儿就可以直接用了,例如添加删除等

public static void deleteEmployee() {
		Session session = MySessionFactory.getSessionFactory().openSession();
		Transaction ts = null;
		try {
			ts = session.beginTransaction();
			Employee emp = (Employee)session.load(Employee.class, 1);
			
			session.delete(emp);
			//这一部分是你想要做的事儿,可替换
			ts.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			if(ts != null){
				ts.rollback();
			}
			throw new RuntimeException(e.getMessage());
		}finally{
			if (session!=null&&session.isOpen()) {
				session.close();
			}
		}
	}

这个举例是删除一个对象,session.delete()这个部分可以改为别的东西。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值