意义:hibernate旨在成为java中管理持久化数据问题的一种完整的解决方案。调解应用程序与关系数据库的交互,把开发人员解放 出来,将精力集中在手中的业务问题上。
持久化:在java中,持久化一般指利用sql在关系数据库中存储数据。java中有一个内建的持久化机制:序列化提供了把对象网络(应用程序的状态)快照写到字节流的能力,然后它可能被持久化到一个文件或者数据库中。序列化也被java的远程方法调用用于给复杂的对象实现传递值语义。序列化的另一种用法是在集群机器中跨节点复制应用程序状态。、
问题:为什么不给持久层使用序列化?
答:序列化之后的关联对象网络只能被当做一个整体访问;没有反序列化整个流,就不可能从流中获取任何数据。因而,结果字节流必须被当做不适合任意的搜索或者大型数据集的统计,甚至不可能独立地访问或者更新单个对象或者对象的子集。
在sql数据库等级中只有两种粒度等级是可见的:表和列。
ORM:hibernte使用的一种解决方案,利用描述对象和数据库之间映射的元数据,自动(且透明)地把java应用程序中的对象持久化到关系数据库中的表。orm本质上是把数据从一种表示法(可逆)转换为另一种表示法进行工作。
调用hibernate session,transaction和query接口访问数据库:
- Session(会话):---------Hibernate Session集多种功能于一身。它是个单线程、非共享的对象,表示使用数据库的一个特定工作单元。它有持久化管理器API,调用它来加载和存储对象。(Session的内部由一列SQL语句组成,这些语句要与数据库在某个时点上进行同步,且托管持久化实例的一个映像由Session监控。)
- Transaction(事务)--------这个Hibernate API可以用来编程式地设置事务范围,但它是可选的(事务范围不是可选的)。其他的选择还有JDBC事务划分、JTA接口,或者带有EJB的容器托管事务。
- Query(查询)---------数据库查询可以写进Hibernate自己的面向对象的查询语言(HQL)或者简单的SQL中。这个接口允许你创建查询、在查询中绑定参数给占位符,并以各种方式执行查询。
数据库连接池:
使用连接池有3个原因:
- 获得新的连接很昂贵。有些数据库管理系统甚至给每个连接启动一个全新的服务器进程。
- 为数据库管理系统维护许多闲置的连接很昂贵,并且连接池可以最优化闲置连接的使用(或者没有请求时就断开连接)。
- 给某些驱动程序创建预编译的语句也很昂贵,且连接池可以对跨请求的连接高速缓存语句
如图显示了连接池在非托管的应用程序运行时环境中的角色(即不需要任何应用程序服务器)。
没有应用程序服务器提供连接池,应用程序要么实现它自己的池化算法,要么依赖于第三方的库(如开源C3P0连接池软件)。没有Hibernate,应用程序代码就调用连接池来获取JDBC连接,然后用JDBC编程接口执行SQL语句。当应用程序关闭SQL语句,且最后关闭连接时,预编译的语句和连接没有被释放,而是返回到池中。
使用Hibernate,这个图就变了:它充当JDBC连接池的一个客户端程序,如图所示。应用程序代码给持久化操作使用Hibernate的Session和Query API,它(可能)用Hibernate的Transaction API管理数据库事务。
javaEE应用程序服务器,为java实现标准的(特定于javaEE)的托管环境。hibernate能够与之整合的三大最值得关注的javaEE服务是JTA、JNDI和JMX。JTA允许hibernate参与托管资源中的事务。hibernate可以通过JNDI查找托管资源(数据库连接),并且能够把自身当作一项服务绑定到JNDI上。最后,hibernate可以通过JMX被部署,然后通过JMX容器被当作一项服务来管理,并且使用标准的JMX客户端程序在运行时被监控。
详解Validator和ConstraintViolation:https://blog.youkuaiyun.com/qq_17586821/article/details/80049003