Hibernate 笔记

来源:互联网 发布:电视上的点播软件 编辑:程序博客网 时间:2024/05/02 11:19

sample code:


Configuration config = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);Session session = sessionFactory.openSession();session.createQuery("from Stocks");Stock stock00 = new Stock();stock00.withBegin(1.2f).withEnd(1.5f).withHigh(1.5f);session.save(stock00);// find the stock whose id is one;Stock stock01 = (Stock) session.get(Stock.class, Integer.valueOf(1));session.delete(stock01);// delete via HQL;session.delete("from Stock where code=600030");// delete via HQL;// delete via QueryQuery query = session.createQuery("delete Stock where date<'2015-12-13'");query.executeUpdate();// query via QueryString hql = "from Stock stock where stock.code like ?";Query query2 = session.createQuery(hql);query2.setParameter(0, "6000%");List<Stock> stocks = query2.list();// query via CriteriaCriteria criteria = session.createCriteria(Stock.class);criteria.add(Expression.eq("code", "600030"));criteria.add(Expression.gt("date", "2015-12-13"));List<Stock> stocks2 = criteria.list();Criteria criteria2 = session.createCriteria(Stock.class);criteria2.add(Example.create(new Stock().withBegin(3.2f)));List<Stock> stocks3 = criteria.list();



Hibernate 配置:

JDBC方式: 主要属性:

properties方式 xml方式sample

dialect --net.sf.hibernate.dialect.MySQLDialect

driver_class driverClassNamecom.mysql.jdbc.Driver

url urljdbc:mysql://localhost/sample

username usernameroot

password password

使用JDBC时,可以指定连接池,默认为:

hibernate.connection.pool_size 2

C3P0

hibernate.c3p0.max_size 2

hibernate.c3p0.min_size 2

hibernate.c3p0.timeout5000

hibernate.c3p0.max_statements 100

hibernate.c3p0..idle_test_period3000

hibernate.c3p0..acquire_increment2

hibernate.c3p0.validatefalse

hibernate.c3p0.provider_class net.sf.hibernate.connection.C3P0ConnectionProvider

DBCP



JNDI方式:主要属性:

properties方式 sample

dataSource jdbc/test

username user

password

dialect  net.sf.hibernate.dialect.MySQLDialect


UserType和CommonUserType支持用于自定义数据

DetachedCriteria可以脱离当前session存在,每次使用时与当前session绑定可以获得更好的代码重用效果。

Criteria高级特性:限定查询范围,分组与统计

//返回从第100条结果开始的20条记录

criteria.setFirstResult(100);

criteria.setmaxResults(20);

criteria.addOrder(Order.asc("name"));


HQL: [select/update/delete ...][from ...] [where ...] [group by ... [having ...]] [order by ...] 

HQL 子句大小写无关,但是类名属性名区分大小写

HQL 查询的目标实体存在继承关系判定,例如 "from TUser" 将返回所有TUser以及子类的记录。"from java.lang.Object" 返回数据库中所有库表的记录。

table T_User <-------->   class TUser

HQL: "from TUser" <--------> SQL: "select * from T_User"

HQL: "from TUser as user where user.name='Eric'";

where 字句中可以使用算数表达式:

"from TUser user where (user.age%2=1)"

"select user.name user.age from TUser user";

面向对象的风格:

"select new TUser(user.name, user.age) from TUser as user"

占位符:

Query query=session.createQuery("select user.name user.age from TUser user where user.age=:age ");

query.setParameter("age",Integer.valueOf(18));

//query.setParameter(new User().withAge(Integer.valueOf(18)));

引用查询:将查询语句放到配置文件中

User{

Address

age

}

即时加载:当宿主实体加载时,Hibernate会立即自动读取器关联的数据并完成关联属性的填充。当"from TUser"时,会生成两条sql语句。一条查询TUser表,另一条查询Address表。

延迟加载:当真正需要数据的时候才进行读取操作。即当调用user.getAddress时,发生第二条查询。

预先加载:和即时加载类似,但是是通过outer-join完成关联数据的加载,这样通过一条sql即可完成对数据的读取。

批量加载:通过批量提交多个限定条件,一次完成多个数据的读取。


SQL查询:session.createSQLQuery("select (user.*) from T_User user","user",TUser.class).list();


--------------------------------------------------------------------------------


实体对象生命周期

Transit ---------session.save/(setId->update)----------------> Persist

Persist---------session.close------------------------------------->Detached

Transit---------user.setId------------------------------------------->Detached

Detatched----session2.update---------------------------------->Persist

Persist--------session.delete------------------------------------->Transit


脏数据的检查:

1.拦截器:当对象的setter方法被调用时, 对象被设置为待更新状态;

2.版本号:持久层框架维护对象版本,当提交时,比较对象版本与持久层版本的差异(Hibernate采用)。


session.find 对缓存只写不读,也就是从来不利用缓存;session.iterate方法首先查看缓存,如果没有则查询db;

session.evict(user),清除user的一级缓存;

sessionFactory.evict()清除二级缓存;


Query Cache,缓存之前查询过的结果集,但是如果Hibernate发现SQL对应的库表发生变化时,会使这个结果集失效。


主要数据类型对应关系:




1 0