梳理Hibernate

       这里先做简单的总结,主要是梳理Hibernate框架最基本的知识。我把它和JPA对比学习,发现很多相似之处,基本上JPA有的,Hibernate都会有。是不是可以这么认为,Hibernate是照着JPA的标准制定的呢?具体看下面的介绍吧。


2.1Hibernate流程


       简单介绍Hibernate 操作数据库的一个流程,都是可见的使用规范,比较粗糙哦。

      


2.2核心配置


       JPA开发需要persistence.xml配置,Hibernate开发需要hibernate.cfg.xml配置。经过仔细对比,发现内容都是一样的,大体可以分为4部分:

      


2.3Hibernate的核心接口


2.3.1 Configuration


       Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管理相应的配置文档,但是通常我们只创建一个configuration实例。


2.3.2 SessionFactory


       线程安全。


2.3.3 Session


       非线程安全。

       Session接口是Hibernate向应用程序提供操作数据库的最主要接口,提供了最基本的保存,更新,删除,加载Java对象的方法。(这里可以联想一下JPA的实体管理器)

       Session的特定方法能使对象从一个状态转换到另一个状态(JPA的状态转换是由实体管理器实现的)。

       关于实体的生命周期,JPA是4个,在Hibernate中的实体状态是3个(没有销毁状态(Removed)),也有说是4个的,我根据在源码中调用方法,Hibernate中没有removed这个方法,所以判断实体只有3个状态。


2.3.4 Transation


       Transaction是Hibernate中进行事务操作的接口,是对实际事务实现的一个抽象,这些事务包括JDBC事务、JTA中的UserTransaction,甚至可以是CORBA事务。为了让开发者能够使用一个统一的操作界面所以进行了这样的接口设计。

        事务对象通过Session创建。

Transaction ts = session.beginTransaction();

 

2.3.5 Query


        用来执行HQL。

        JPA的Query返回值是List类型,方法是getResultList()。Hibernate的Query返回值是List类型,方法是list()。


2.4事务   


2.4.1基于JDBC的事务


        JDBC的事务周期限于Connection的生命周期之内。,对于基于JDBC Transaction的Hibernate事务管理机制而言,事务管理是在Session所依托的JDBCConnection中实现,事务周期限于Session的生命周期。


2.4.2基于JTA的事务


        JTA事务管理则由JTA容器实现。JTA容器对当前加入事务众多的Connection进行调度,实现事务性要求。

       JTA的事务周期可横跨多个JDBCConnection生命周期。同样的,对于基于JTA事务的Hibernate而言,JTA事务横跨多个Session生命周期。


2.5HQL


2.5.1用法


1.参数查询

  • 按参数名称绑定:

Query query=session.createQuery(“from User user where user.name=:customername and user:customerage=:age ”);

query.setString(“customername”,name);

query.setInteger(“customerage”,age);

  • 按参数位置绑定

Query query=session.createQuery(“from User user where user.name=? and user.age =? ”);

query.setString(0,name);

query.setInteger(1,age);

  • setParameter()方法

String hql=”from User user where user.name=:customername ”;

Query query=session.createQuery(hql);

query.setParameter(“customername”,name,Hibernate.STRING);

  • setProperties()方法

Customer customer=new Customer();

customer.setName(“pansl”);

customer.setAge(80);

Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”);

query.setProperties(customer);

  • setEntity()方法

Customer customer=(Customer)session.load(Customer.class,”1”);

Query query=session.createQuery(“from Order order where order.customer=:customer”);

query. setEntity(“customer”,customer);

List list=query.list();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值