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();等
恒之贵,无需三更起五更睡;最无益,只怕一日曝十日寒
——港湾小唯与之共勉