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对象

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

最新文章

  1. 【转载】写一个js库需要怎样的知识储备和技术程度?
  2. java基础-多线程执行
  3. UIButton详解
  4. 一步一步理解word2Vec
  5. 【转】C# Winform打包部署时添加注册表信息实现开机启动
  6. IOS开发之路三(XML解析之KissXML的使用)
  7. Javascript验证用户输入URL地址是否正确
  8. leetcode -- Merge k Sorted Lists add code
  9. python 控制vbox虚拟机
  10. .net图片自动裁剪白边函数案例
  11. Ubuntu系统如何卸载并安装新版本的jdk(permission denied问题)
  12. 使用Flex构建Web和移动参考应用程序
  13. 配置eNSP和本地电脑上的网卡相连,从而直接从本地电脑连接设备
  14. 2010-01-20 12:09 ubuntu下minicom的安装及使用
  15. intellij 操作
  16. Session小结
  17. CentOS 通过yum在线安装MySQL5.7
  18. explain 类型分析
  19. 微信小程序 web-view 的 url 带参问题
  20. asyn proposals

热门文章

  1. c++第二十三天
  2. 在apache中使用.htaccess文件的注意事项
  3. ubuntu 18.04 64bit如何安装GPU版本tensorflow
  4. 【软件位置】Linux查看软件安装的位置
  5. 使用 v-cloak 防止页面加载时出现 vue.js 的变量名
  6. css3 导入字体
  7. Qt5发布错误01
  8. Mac上安装配置和简单使用PostgreSQL(仍然很不懂)
  9. rspec-rails中的一些匹配器只有在特定的类型才能使用。
  10. UVALive-2966 King's Quest(强连通+二分图匹配)