您的位置:首页 > 其它

hibernate框架的核心对象和相关知识点

2017-03-21 17:16 363 查看
Hibernate架构
下图提供了hibernate体系的高层视图:



 

Hibernate全面解决方案:



 

Hibernate核心API
Configuration

负责管理数据库的配置信息。数据库的配置信息包含了Hibernate连接数据库的一些基本信息(hibernate.cfg.xml),Configuration对象可以通过加载配置文件获取并管理这些信息. 

Configuration config = new Configuration().configure();

或者:

File file = new File(“C:\\myhibernate.xml”);

Configuration config = new Configuration().configure(file);

 

SessionFactory (org.hibernate.SessionFactory)

针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。  作为  Session

的工厂和 ConnectionProvider 的客户。SessionFactory 可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。

SessionFactory使用要点如下:

1.    负责创建Session对象,可以通过Configuration对象创建SessionFactory对象 

2.    SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。

3.    SessionFactory还负责维护Hibernate的二级缓存。

4.    SessionFactory对象的创建会有较大的开销,而且SessionFactory对象采取了线程安全的设计方式,因此在实际中SessionFactory对象可以尽量的共享,在大多数情况下,一个应用中针对一个数据库可以共享一个SessionFactory实例 

SessionFactory创建代码如下:

Configuration config =     new Configuration().configure();

SessionFactory factory = config.buildSessionFactory();

 

Session (org.hibernate.Session)

表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。其隐藏了

JDBC  连接,也是  Transaction  的工厂。它会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。

Session定义了添加、更新、删除和查询等操作,是持久化操作的基础。Session的设计是非线程安全的,因此,一个Session对象只可以由一个线程使用。

Session对象可以由SessionFactory对象创建。

Configuration config = new Configuration().configure();

SessionFactory factory = config.buildSessionFactory();

    Session session = factory.openSession();

 

Transaction

将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。

使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)

    Transaction tx = session.beginTransaction(); 

Hibernate对象的状态和生命周期





◦    注意:  

◦    使用debug详细观察程序运行,加深理解。 

 
Transient 瞬时/临时态

}    使用new 操作符初始化的对象不是立刻就持久的。 

}    跟session没有任何关系 

}    跟数据库没有任何关系,数据库中没有对应记录存在 

Persist 持久态

}    和session对象相关。以map形式存入到session中 

}    在数据库中有对应的记录

Detached托管/游离态

}    和session对象无关 

}    在数据库中有对应的记录

游离态,托管态的经典案例

学生对班级的模型,多对一模型。班级端放弃关系的维护权,学生端维护

案例:修改学生信息的时候,如何维护与班级的关系

    新传入的student对象中的班级引用为空,如果直接update保存关系丢失。

    需要进行关系维护。

    先从数据库中查出原先该id对应的学生对象。将班级取出,与新的student建立关系。

    由于原先的和新修改的id相同,hibernate会报异常。则必须将原先的从持久态变成游离态。再保存新的student对象

  



1 @Resource
2     private HibernateTemplate hibernateTemplate;
3     public void update(Student student) {
4         Student temp=(Student) hibernateTemplate.get(Student.class, student.getId());
5         //获取真正的session对象
6         SessionFactory sessionFactory=hibernateTemplate.getSessionFactory();
7         //把查询出来的对象从session中的持久态变成游离态
8         //true有session返回当前线程session 无session新建session。  false 必须 返回当前线程的session
9         Session session=(Session) SessionFactoryUtils.getSession(sessionFactory, true);
10         //将temp对象从持久态变成游离态
11         session.evict(temp);
12         //session.clear();
13         //建立新修改的student对象和session建立关系,变成持久态,comit提交保存
14         student.setMyClass(temp.getMyClass());
15         hibernateTemplate.update(student);
16
17     }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: