hibernate运行机制

来源:互联网 发布:tensorflow 入门实例 编辑:程序博客网 时间:2024/04/26 09:35

使用hibernate也有段时间了,以前都没有写相关的学习记录,最近面试被问到相关问题,现在有点空按个人的理解回头总结一下hibernate的运行机制,当做是一种复习吧。

Hibernate运行机制:

1、读取并解析配置文档

[java] view plaincopyprint?
  1. Configuration cfg = new Configuration().configure();  

2、读取并解析映射文件,创建SessionFactory

[java] view plaincopyprint?
  1. SessionFactory sf = cfg.buidSessionFactory();  

3、打开Session

[java] view plaincopyprint?
  1. Session session = sessionFactory.openSession();  

4、创建事务Trasction

[java] view plaincopyprint?
  1. Transaction tx = session.beginTransaction();  

5、持久化操作

[java] view plaincopyprint?
  1. User user = new User();  
  2. user.setBirthday(new Date());  
  3. user.setName("name");  
  4. session.save(user);  

6、提交事务

[java] view plaincopyprint?
  1. tx.commit();  

7、关闭Session

[java] view plaincopyprint?
  1. session.close();  

8、关闭SessionFactory


以下是个简单的例子:

[java] view plaincopyprint?
  1. package cn.flymouse.hibernate;  
  2.   
  3. import java.util.Date;  
  4.   
  5.   
  6. import org.hibernate.Query;  
  7. import org.hibernate.Session;  
  8. import org.hibernate.SessionFactory;  
  9. import org.hibernate.Transaction;  
  10. import org.hibernate.cfg.Configuration;  
  11. import cn.flymouse.hibernate.domain.User;  
  12.   
  13. public class Base {  
  14.   
  15.     public static void main(String[] args) {  
  16.         //读取并解析配置文档   
  17.         Configuration cfg = new Configuration().configure();  
  18.         //读取并解析映射文件,创建SessionFactory   
  19.         SessionFactory sf = cfg.buidSessionFactory();  
  20.         //打开session   
  21.         Session session = sf.openSession();  
  22.         //开启事务   
  23.         Transaction tx = session.beginTransaction();  
  24.         //持久化操作   
  25.         User user = new User();  
  26.         user.setBirthday(new Date());  
  27.         user.setName("name");  
  28.         session.save(user);  
  29.         //提交事务   
  30.         tx.commit();  
  31.         //关闭Session   
  32.         session.close();  
  33.         //关闭SessionFactory   
  34.         sf.close();  
  35.     }  
  36. }  
User类:

[java] view plaincopyprint?
  1. package cn.flymouse.hibernate.domain;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class User {  
  6.     private int id;  
  7.     private String name;  
  8.     private Date birthday;  
  9.   
  10.     public int getId() {  
  11.         return id;  
  12.     }  
  13.     pubilc String getName(){  
  14.         return name;  
  15.     }  
  16.     public Date getBirthday() {  
  17.         return birthday;  
  18.     }  
  19.       
  20.     public void setId(int id) {  
  21.         this.id = id;  
  22.     }  
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26.     public void setBirthday(Date birthday) {  
  27.         this.birthday = birthday;  
  28.     }  
  29. }  
User的映射文件User.hbm.xml(跟User类放同个目录)

[html] view plaincopyprint?
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="cn.flymouse.hibernate.domain">  
  6.   
  7.     <class name="User">  
  8.         <id name="id">  
  9.             <generator class="native" />  
  10.         </id>  
  11.         <property name="name" unique="false"/>  
  12.         <property name="birthday" />  
  13.     </class>  
  14.       
  15. </hibernate-mapping>  
hibernate的配置文件hibernate.cfg.xml(放在类路径下,即src目录下)

[html] view plaincopyprint?
  1. <!DOCTYPE hibernate-configuration PUBLIC  
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  4.   
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  8.         <property name="connection.url">jdbc:mysql:///test</property>  
  9.         <property name="connection.username">root</property>  
  10.         <property name="connection.password">123456</property>  
  11.         <!-- 方言,用于生成SQL语句 -->  
  12.         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  13.         <!-- 自动建表 -->  
  14.         <property name="hbm2ddl.auto">create</property>  
  15.         <property name="show_sql">true</property>  
  16.       
  17.         <mapping resource="cn/flymouse/hibernate/domain/User.hbm.xml"/>  
  18.     </session-factory>  
  19. </hibernate-configuration>  

Hibernate中的三种对象状态:

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

2.持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)

3.脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。


Hibernate相对于JDBC的一些优点:
1、对JDBC访问数据库的代码做了封装,大大简化了数据访问繁琐的代码;
2、Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,他很大程度的简化DAO曾的编码
工作;
3、Hibernate使用Java发射机制,而不是字节码,增强程序来实现透明性;
4、Hibernate的性能非常好,因为他是一个轻量级框架,框架的灵活性很突出。它支持各种关系数据库从一对一到多对多的各种复杂工作;
0 0
原创粉丝点击