<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()这个部分可以改为别的东西。