`

Hibernate常见术语、操作、区别

    博客分类:
  • ORM
 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/2359961

 

Hibernate核心接口

Configuration

SessionFactory

Session

Query

Criteria

Transaction

 

Hibernate工作原理

配置Configuration对象,读取并解析配置文件

读取并解析映射信息,创建SessionFactory

创建session对象

开启事务Transaction

完成CRUD持久化操作

提交事务

关闭session

 

Hibernate关系映射

@ManyToOne(fetch默认FetchType是eager)

@OneToMany(fetch默认FetchType是lazy)

@OneToOne(fetch默认FetchType是eager)

@ManyToMany(fetch默认FetchType是lazy)

 

Hibernate对象状态

Transient

Persistent

Detached

Customer customer = new Customer();		// new之后,不处于Session的缓存中:临时态
session.save(customer);
// 处于这两句之间,已经被持久化,加入到Session的缓存中:持久态
transaction.commit();
session.close();
// session关闭之后,已经被持久化,但不再处于Session的缓存中:游离态

 

Hibernate的缓存等级及其特点

一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库取数据。

二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库。

 

Hibernate有哪些主键

TABLE

SEQUENCE

IDENTITY

AUTO

 

Hibernate有几种查询数据的方式

有三种查询方式

  • HQL:Hibernate Query Language,它跟SQL非常类似
  • Criteria Query,以对象的方式添加查询条件
  • SQL,直接使用SQL语句操作数据库

Hibernate的Set, List, Bag, Map有什么异同

List可以重复,有序的一种集合

Bag(结合了List与Set),可以重复且没有顺序的一种集合,是Hibernate提供的

Set不可以重复,没有顺序的一种集合

Map是key-value对形式的一种映射

 

Hibernate中session.save()和session.persist()的区别

session.save()返回的是Serializable

session.persist()返回的是void


 

Hibernate中load()方法和get()方法的区别

load()与get()方法都可以根据标识符属性值查询获取一个持久化对象,但是在为找到符合条件的持久化对象时,load()方法抛出违例;get()方法返回null。

get()方法先从Hibernate一级缓存中查询符合条件的对象,找不到则直接从数据库中查找记录;

而load()方法则从Hibernate先从Hibernate的一级缓存中查找符合条件的对象,找不到还会在Hibernate的二级缓存中查找对象,仍未找到才会查找数据库。

 

Hibernate中inverse属性的作用

在Hibernate中一对多的单向或者双向关联的情况下,我们可以将“一”方控制权交给“多”方,称为“控制反转”(inverse),代码中使用控制反转需要在一方的映射文件中设置inverse属性为true,该属性的默认值为false。

 

Hibernate的检索策略

HQL

// 创建一个Query对象
Query query = session.createQuery("from Customer as c where c.name = :customerName" and c.age = :customerAge");
// 动态绑定参数
query.setString("customerName", "Tom");
query.setInteger(customerAge", 21);
// 执行查询,返回查询结果
List result = query.list();

方法链编程风格
List result = session.createQuery("from Customer as c where c.name = :customerName" and c.age = :customerAge")
	.setString("customerName", "Tom")
	.setInteger("customerAge", 21)
	.list();

QBC

// 创建一个Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
// 设定查询条件,然后把查询条件加入到Criteria中
Criterion criterion1 = Expression.like("name", "T%");
Criterion criterion2 = Expression.eq("age", new Integer(21));
criteria = criteria.add(criterion1);
criteria = criteria.add(criterion2);
// 执行查询语句,返回查询结果
List result = criteria.list();

方法链编程风格
List result = session.createCriteria(Customer.class)
	.add(Express.like("name", "T%"))
	.add(Express.eq("age", new Integer(21)))
	.list();

 

Hibernate分页查询

采用HQL检索方式

Query query = session.createQuery("from Customer c order by c.name asc");
query.setFirstResult(0);
query.setMaxResult(10);
List result = query.list();

采用QBC检索方式

Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(0);
criteria.setMaxResult(10);
List result = criteria.list();

  

 

 

 

 

 

  • 大小: 29.1 KB
  • 大小: 27.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics