Hibernate基础知识整理(一)

Hibernate的bean要求:

(1)有无参构造方法;

(2)有无意义的标志id,对应数据库的主键;

(3)非final类(符合懒加载)。

hibernate映射文件:

用于说明java对象与哪个表中的记录相对应,以及java对象中的各个属性分别对应表中的哪一项,不同性质的属性(例如,主键和普通属性)用不同的标签来映射,如果java对象中的某个属性不需要存储在数据库中,那么在hibernate映射文件中就不需要配置这个属性。

关于使用表名和字段与关键字冲突的问题。
如果表名和字段与关键字啊发生冲突,解决方案有两种:
使用column和table,改表名或字段名;
如果表名或者字段名不允许更改,可以在table或者column中字段前面加上符号"`",例如:<class name="User" column="`user`">.这个符号是键盘中~对应的那个键在英文状态下的符号

摘抄自:http://www.cnblogs.com/aigeileshei/p/5796947.html

Hibernate操作数据库步骤:

(1)读取配置文件;Configuration c = new Configuration().configure();

(2)读取映射文件,获取SessionFactory;SessionFactory sf = c.buildSessionFactory();

(3)获取Session;Session s = sf.openSession();

(4)打开事务;Transaction tx = s.beginTransaction();

(5)持久化操作;get(),load(),save(),saveOrUpdate(),merge(),persist()

(6)提交事务;tx.commit();-------------JDBC会自动提交事务,但是hibernate默认是不开启的,所以事务不提交,对象就不会更新到数据库中

(7)关闭session;s.close()

关于load()和get()的区别:

一.加载数据不同:

get()是立即从数据库拿到数据,返回的是实体对象;

load()是懒加载,拿到的是代理对象,只有真正用到对象的属性的时候才从数据库查询(非getId方法);

二.数据库中没有相应的数据时,load会抛出异常,而get会返回null;

关于save()和persist()的区别:

在事务边界之外persist方法不会执行insert语句,而save方法会执行insert方法然后再回滚。

关于update 和 merge的区别:

首先在更新数据的时候,两者都必须有id;

update方法会直接执行update语句,更新后的对象状态变为持久态;

而merge方法不同:

merge会先select再update;而且merge后原来的对象仍是脱管的状态:merge(a);a仍然是脱管的

(1)如果session中有与之对应相同的对象(即主键相同),则把要保存的对象复制给该对象,然后再update被覆盖后的session中的对象;

(2)如果session中没有与之对应的对象,则从数据库查询,然后把查询出来的对象覆盖为要保存的对象,即update查出来的对象;

关于flush和update区别:

flush方法是将一级缓存和数据库同步;

update方法是将脱管状态变为 持久态;

flush应用场景:

1, 调用某些查询的和手动flush(),session的关闭、SessionFactory关闭结合 
get()一个对象,把对象的属性进行改变,把资源关闭。
2,transaction commit的时候(包含了flush),一般建议不需要手动调用flush方法,因为hibernate会自动帮我们处理;如果调用flush方法,会带来很大的资源消耗。

关于lock和update区别:

update方法是把脱管状态下的更新过的对象持久化;

lock方法是一个没有更改过的脱管状态的对象变成持久状态(针对的是因Session的关闭而处于脱管状态的po对象(2),不能针对因delete而处于脱管状态的po对象)

lock的操作步骤是:调用lock把未修改的对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush

 关于clear和evcit的区别:

clear方法是清除所有session缓存中的持久化数据;evcit方法是清除某个对象的在session缓存;

Hibernate中java对象的三种状态:

自由态:跟session无关,在数据库中没记录;

持久态:跟session有关联,在数据库中有记录;

脱管态:跟session无关联,在数据库中有记录。

hibernate提供了两种方式进行数据库表的查询操作:HQL和Criteria来完成复杂的语句查询。

HQL:面向对象的查询语言,跟sql区别是hql是面向对象的,区分大小写,查询的是类对象,不是表,查询的是类属性,不是表字段,并且支持多态;

HQL主要通过Query实现查询:

Query query =session.createQuery("from User where name=:na");

:na  即命名参数;

Query  query = session.createQuery("from User where name = ?");

?  即占位符;

当然参数较多时可以选择Map放参数:

Query query = session.createQuery("from User where name = :na and birthday < :date");

Map<String,Object> map = new HashMap<String,Object>;

map.put("na","小唯");

map.put("date",new Date());

 query.setProperties(map);

List<User> list = query.list();

Query经常用到的方法有:list(),uniqueResult(),setFirstResult(),setMaxResults();等

Criteria是比HQL更加对象化的查询,正常使用添加查询条件如下:

Criteria  c = session.createCriteria(User.class);

c.add(Restrictions.eq("name","小唯"));

c.add(Restrictions.lt("date",new Date()));

List<User> list = c.list();

Criteria经常用到的方法有:list(),uniqueResult(),setFirstResult(),setMaxResults();等

恒之贵,无需三更起五更睡;最无益,只怕一日曝十日寒

——港湾小唯与之共勉

原文地址:https://www.cnblogs.com/xiaoweigangwan/p/7813707.html