Hibernate 常用 API

(1)Configuration
它主要是用于加载 hibernate 配置.
Configuration config=new Configuration().config(); 主要加载 src 下的 hibernate.cfg.xml
Configuration config=new Configuration();主要加载的 src 下的 hibernate.properties
Configuration config=new Configuration().config(核心配置文件名称);加载指定的名称的配置文

问题:我们是在 hibernate.cfg.xml 文件中有 xxx.hbm.xml 文件的位置。如果我们使用的是

hibernate.properties 这种核心配置,它如何加载映射配置?

config.addResource("cn.csdn/domain/Customer.hbm.xml");直接加载映射配置文件
config.addClass(Customer.class);这种方式会直接在实体类所在包下查找规范映射配置文件

(2)sessionFactory
首先 SessionFactory 它的获取是通过 Configuration 得到。

1.创建爱你Configuration来加载配置文件
Configguration config = new Configuration().configure();
2.得到SessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();

SessionFactory 接口负责初始化 Hibernate。它充当数据存储源的代理,并负责创建 Session
对象。这里用到了工厂模式。需要注意的是 SessionFactory 并不是轻量级的,因为一般情况
下,一个项目通常只需要一个 SessionFactory 就够,当需要操作多个数据库时,可以为每个
数据库指定一个 SessionFactory。

通过 SessionFactory 可以得到 Session.是从连接池中获取一个连接。

获取一个与线程绑定的 Session.
SessionFactory 它不是轻量级的,不要频繁创建关闭它。在一个项目中有一个 SessionFactory
就可以,通过 SessionFactory 来获取 Session 进行操作。
问题:怎样可以保证在一个项目中所使用的 SessionFactory 是同一个哪?

public class HibernateUtils {
  private static Configuration config;
  private static SessionFactory sessionFactory;
  static {
        config=new Configuration().configure();
        sessionFactory=config.buildSessionFactory();
  }
  public static Session openSession(){
      return sessionFactory.openSession();
 }
}

SessionFactory 内部还维护了一个连接池,如果我们要想使用 c3p0 连接池,应该怎样处理?
1. 我们要导入 c3p0 的相关 jar 包
在 hibernate/lib/options 下有关于 c3p0 连接池 jar 包
2. 在 hibernate.cfg.xml 文件中配置 c3p0 连接
可以查看 etc/hibernate.properties 中关于 c3p0 的配置

(3) Session
Session 接口负责执行被持久化对象的 CRUD 操作(CRUD 的任务是完成与数据库的交流,包含
了很多常见的 SQL 语句)。但需要注意的是 Session 对象是非线程安全的。
问题:我们如何解决 session 的安全问题?
我们只需要在方法内部来使用 Session 就可以。
问题:Session 如何获取到?
SessionFactory.openSession() ; 相当于直接通过 SessionFactory 创建一个新的 Session,使
用完成后要手动调用 close 来关闭。
SessionFactory.getCurrentSession(); 获取一个与线程绑定的 Session,当我们提交或事务回
滚后会自动关闭。

Session 常用的方法:
save 保存对象
update 修改操作
delete 删除
get/load 根据 id 进行查询
savenOrUpdate 执行 save 或 update 操作
createQuery()获取一个 Query 对象
CreateSQLQUery()获取一个可以操作 sql 的 SQLQuery 对象
createCriteria() 获取一个 Criteria 它可以完成条件查询

(4) Transaction
Transaction 接口主要用于管理事务,它是 hibernate 的事务接口,对底层的事务进行了封装。
使用它可以进行事务操作。
commit 事务提交
rollback 事务回滚
问题:如果获取一个 Transaction 对象
Session.beginTransaction();
问题:如果在程序中没有开启事务,是否存在事务?
有事务,session 的每一个操作就会开启一个事务。
默认情况下事务是不会自动提交的。

(5) Query
Query 接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL 语言或
本地数据库的 SQL 语句。Query 经常被用来绑定查询参数、限制查询记录数量,并最终执行

查询操作。
通过 Query 主要完成查询操作.
我们通过 Query 可以执行 hql 语句.
Query query=Session.createQuery(hql);
下面这个可以执行 sql 语句
SQLQUery sqlQuery=Session.createSQLQuery(sql);
SQLQuery 是 Query 的子

(6)Criteria
Criteria 接口与 Query 接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的
是 Criteria 接口也是轻量级的,它不能在 Session 之外使用。

依赖对象(Dependent objects) 组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。在这篇文档中,组件这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。举个例子, 你对人(Person)这个概念可以像下面这样来建模: public class Person { private java.util.Date birthday; private Name name; private String key; public String getKey() { return key; } private void setKey(String key) { this.key=key; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } ...... ...... } public class Name { char initial; String first; String last; public String getFirst() { return first; } void setFirst(String first) { this.first = first; } public String getLast() { return last; } void setLast(String last) { this.last = last; } public char getInitial() { return initial; } void setInitial(char initial) { this.initial = initial; } } 在持久化的过程中,姓名(Name)可以作为人(Person)的一个组件。需要注意的是:你应该为姓名的持久化属性定义getter和setter方法,但是你不需要实现任何的接口或申明标识符字段。 以下是这个例子的Hibernate映射文件: <!-- class attribute optional --> 人员(Person)表中将包括pid, birthday, initial, first和 last等字段。 就像所有的值类型一样, 组件不支持共享引用。 换句话说,两个人可能重名,但是两个Person对象应该包含两个独立的Name对象,只不过这两个Name对象具有“同样”的值。 组件的值可以为空,其定义如下。 每当Hibernate重新加载一个包含组件的对象,如果该组件的所有字段为空,Hibernate将假定整个组件为空。 在大多数情况下,这样假定应该是没有问题的。 组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你瞅啥瞅你咋地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值