criteria的简单用法(使用的较少):
Session s=HibernateUtil.getCurrentSession();
Transaction tx=s.beginTransaction();
Criteria cri=s.createCriteria(Student.class);
//添加检索条件
cri.add(Restrictions.gt("sage", new Long(10)));
List<Student> list=cri.list();
for(Student s1: list){
System.out.println(s1.getSname());
}
tx.commit();
我们前边说的一直说的是hibernate开发模式中的DB->domain对象这种方式,其实还有一种方式是编写domain对象和映射文件然后自动生成DB,这种是官方推荐的,但是在实际的应用中不是很常用
这里我们说明如果要自动的创建出对应的数据库,需要做配置(hibernate.cfg.xml).
<property name="hbm2ddl.auto">create</property>
这里有四个配置值: create , update , create-drop, validate
create : 当我们的应用程序加载hibernate.cfg.xml [ new Configuration().config(); ]就会根据映射文件,创建出数据库, 每次都会重新创建, 原来表中的数据就没有了,就会被覆盖掉了;
update: 如果数据库中没有该表,则创建,如果有表,则看有没有变化,如果有变化,则更新;
create-drop: 在显示关闭 sessionFactory时,将drop掉数据库的schema;
validate: 相当于每次插入数据之前都会验证数据库中的表结构和hbm文件的结构是否一致
domain对象的细节:
1. 需要一个无参的构造函数(用于hibernate反射该对象)
2. 应当有一个无业务逻辑的主键属性.
3. 给每个属性提供 get set方法.
4. 在domian对象中的属性,只有配置到了对象映射文件后,才会被hiberante管理.
5. 属性一般是private范围
对象关系文件中,有些属性是可以不配,hibernate会采用默认机制,比如
<class table=”?” > table 值不配,则以类的小写做表名
<property type=”?”> type不配置,则hibernate会根据类的属性类型,选择一个适当的类型
如何判断一个对象处于怎样的状态?
主要的依据是: 1. 看该对象是否处于session, 2, 看在数据库中有没有对应的记录
瞬时态: 没有session管理,同时数据库没有对应记录
持久态: 有session管理,同时在数据库中有记录
脱管态/游离态: 没有session管理,但是在数据库中有记录.
懒加载:
简述: 当我们查询一个对象的时候,在默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性时,才会向数据库发出再一次的查询.这种现象我们称为 lazy现象.
解决方法可以这样:
1. 显示初始化 Hibernate.initized(代理对象)
2. 修改对象关系文件 lazy 改写 lazy=false
通过过滤器(web项目) openSessionInView