Hibernate经典总结(三)

2014-11-24 08:27:11 · 作者: · 浏览: 3
lean属性和字符之间的转换。
yes_no:将true|false转换成Y|N
true_false:将true|false转换成T|F
底层实现方法:
stmt.setChar(cost.getBoolean().toString())
cost.setBoolean(Boolean.parseBoolean(rs.getChar("***")))
f.其他big_decimal,big_integer,clob,blob
-----------案例-----------------
create table t_foo(
t_id number primary key,
t_name varchar2(50),
t_salary number(8,2),
t_marry char(1),
t_hiredate date,
t_last_login_time date
)
------------- mysql----------------
create table t_foo(
t_id int auto_increment primary key,
t_name varchar(50),
t_salary double,
t_marry char(1),
t_hiredate date,
t_last_login_time timestamp
) default charset=utf8;
10.Hibernate主键生成方式
在hbm.xml中,可以为主键指定生成方式。具体如下:
*a. sequence :采用指定序列生成,适用于 Oracle数据库。使用格式
foo_seq
*b.identity : 采用数据库自增长机制生成。适用于MySQL,SQLServer, DB2
据库。
*c.native : 由hibernate决定,hibernate会根据配置文件hibernate.cfg.xml中
方言决定,如果方言是Mysql,相当
于identity,如果方言是Oracle,相当于是sequence
*d.increment : 首先获取最大主键值,然后加1,再执行插入操作。适用于各
种数据库。
先执行select max(id) from t_foo;
再执行insert into...
e.assigned : Hibernate忽略主键生成,不负责管理。需要程序员在程序中指定
主键值,不常用
f.其他
uuid:采用UUID算法生成一个字符串主键值
hilo:采用高地位算法生成一个数值主键值
11.Hibernate框架基本特性
1)一级缓存(Session级别缓存,默认开启)
a.每次创建一个Session对象,会为这个Session对象提供一个缓存区,用于
缓存该Session查询出来的单个对象。当使用该Session再次查询同一个对
象时,从缓存取出,避免对数据库的查询。
*b.一级缓存区管理的方法:
session.evict(obj):将obj从一级缓存移除
session.clear():清除一级缓存所有对象
c.一级缓存好处
当利用同一个Session对象多次查询同一个数据对象时,仅第一次从数据库
查询,后续几次从缓存获取。
-------------------------------------
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
for(int i=1;i<100000;i++){
User user = new User();
//......
session.save(user);
//20条调用一次flush
if(i%20==0){
session.flush();//同步到数据库
session.clear();//清空缓存
}
}
tx.commit;
HibernateUtil.close();
对于上面列子,如果不及时清理缓存,将会发生内存溢出异常。
------------------------------------
注:每个session只能访问自己的缓存区,在session1中缓存了一个对象,
在session2中查询相同的对象,仍然要从数据库中重写查找
/**
* 使用两个不同的Session查询同一个对象 结果:去数据库查询2两次
*/
public static void test3() {
Session session = HibernateUtil.getSession();
// 第一次查询
Foo foo = (Foo) session.get(Foo.class, 1);
System.out.println(foo.getName() + " " + foo.getSalary());
session.close();
session = HibernateUtil.getSession();
// 第二次查询
Foo foo1 = (Foo) session.get(Foo.class, 1);
System.out.println(foo1.getHireDate() + " " + foo1.getLastLoginTime());
session.close();
}
/**
* 同一个sessi