A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

7.说说在 hibernate中使用Integer做映射和使用int做映射之间有什么差别?
Integer code和int code的区别:
Integer是对象.      code=null;   对象可以为空.   
int 是普通类型,     不可能=null.        
根据你的数据库code是可以空的,故应该映射成Integer.      
你没理由hbm.xml里写 Integer,类里却写int
8.SQL和HQL有什么区别?
sql 面向数据库表查询
hql 面向对象查询

hql:from 后面跟的 类名+类对象 where 用 对象的属性做条件
sql:from 后面跟的是表名  where 用表中字段做条件
查询
Hibernate中使用查询时,一般使用Hql查询语句。
HQL(Hibernate Query Language),即Hibernate的查询语言跟SQL非常相像。不过HQLSQL的最根本的区别,就是它是面向对象的。

使用HQL时需要注意以下几点:
1.大小写敏感
因为HQL是面向对象的,而对象类的名称和属性都是大小写敏感的,所以HQL是大小写敏感的。
HQL语句:from Cat as cat where cat.id > 1;from Cat as cat where cat.ID > 1;是不一样的,这点与SQL不同。
2.from子句
from Cat,该句返回Cat对象实例,开发人员也可以给其加上别名,eg. from Cat as cat,对于多表查询的情况,可参考如下:
from Cat as cat, Dog as dog
其它方面都与SQL类似,在此不再赘述。
9.Hibernate的分页查询
例如:从数据库中的第20000条数据开始查后面100条记录
Query q = session.createQuery("from Cat as c");;   
q.setMaxResults(100);;   
List l = q.list();;
q.setFirstResult(20000);;   
10.HibernateJava对象的状态以及对应的特征有哪些?
持久化对象的三种状态
    持久化对象POOID
PO=POJO + hbm映射配置
    编写规则
00001. ①必须提供无参数 public 构造器
00002. ②所有属性 private,提供 publicgettersetter方法
00003. ③必须提供标识属性,与数据表中主键对应 ,例如 Customerid属性
00004. ④PO类属性应尽量使用基本数据类型的包装类型(区分空值)  例如 int --- Integer  long--- Long
00005. ⑤不要用final修饰(将无法生成代理对象进行优化)
OID 指与数据表中主键对应 PO类中属性,例如 Customer id属性
    Hibernate框架使用OID来区分不同PO对象
        * 例如内存中有两个PO对象,只要具有相同 OID Hibernate认为同一个对象
    * Hibernate 不允许缓存同样OID的两个不同对象
     
①瞬时态(临时态、自由态):不存在持久化标识OID,尚未与Hibernate Session关联对象,被认为处于瞬时态,失去引用将被JVM回收
②持久态:存在持久化标识OID,与当前session有关联,并且相关联的session没有关闭 ,并且事务未提交
③脱管态(离线态、游离态):存在持久化标识OID,但没有与当前session关联,脱管状态改变hibernate不能检测到
    区分三种状态:判断对象是否有OID,判断对象是否与session关联(被一级缓存引用)
// 获得Session
Session session = HibernateUtils.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
Book book = new Book(); // 瞬时态(没有OID,未与Session关联)
book.setName("hibernate精通");
book.setPrice(56d);
session.save(book);// 持久态(具有OID,与Session关联)
// 提交事务,关闭Session
transaction.commit();
session.close();
System.out.println(book.getId()); // 脱管态(具有 OID,与Session断开关联)
持久化对象状态转换
    见下图
    ①瞬时态对象:通过new获得
        瞬时----->持久    save、saveOrUpdate(都是session)
        瞬时----->脱管    book.setId(1) 为瞬时对象设置OID
    ②持久态对象:通过get/load 、Query查询获得
持久----->瞬时    delete  (被删除持久化对象 不建议再次使用 )
持久----->脱管    evict(清除一级缓存中某一个对象)、close(关闭Session,清除一级缓存)、clear(清除一级缓存所有对象 )
    ③脱管态对象 无法直接获得
脱管----->瞬时    book.setId(null); 删除对象OID
脱管----->持久    update、saveOrUpdate、 lock(过时)

图片1.png (22.47 KB, 下载次数: 12)

图片1.png

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马