11.hibernate核心编程接口--2
JTA与JDBC
JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中:JDBC连接、JDO PersistenceManager 对象、JMS 队列、JMS 主题、企业JavaBeans(EJB)、一个用J2EE Connector Architecture 规范编译的资源分配器。
Session管理的CURD操作(create,update,read,delete增改查删)
- 增:save()
save就是保存一个具有不同id的对象插入到到session和数据库。一般都配置主键的自动产生,所以不必关心对象的id值是否相同。
- 改:update()
void update(Object o);
更新数据库记录。只需要拥有ID的object即可。hibernate会自动提取参数对象的id,然后发出sql语句:update t_name set field1=””,field2=””,…. where id=?
例如:
Car car = new Car(); car.setId(4); car.setColor(Color.BLUE); Session session = sf.getCurrentSession(); session.beginTransaction(); session.save(car);//保存 car.setColor(Color.RED);//修改对象session.update(car);//修改数据库记录(相同id的记录)//这句可以省略,因为car.setColor(Color.RED)是修改persistent对象,commit会自动update到数据库。 session.getTransaction().commit();//自动close
实际上,上例中的session.update(car)完全可以不写。因为session.save(car)已经将car放到session缓存中,在后面的car.setColor(Color.RED)执行后,session中的缓存对象要更新为最新,然后在commit()发出后,自动调用update()进行更新。这个update语句会默认将所有字段拼入sql语句。
如果只更新某一个指定的字段,可以在hbm的xml中,使用dynamic-update=true。大多情况建议使用HQL。
- 查:
Object load(Class theClass, Serializable id) Return the persistent instance of the given entity class with the given identifier, assuming that the instance exists.
上面就是官方api中对load方法的解释。Load返回的是代理对象,等到真正用到对象的内容时才发出sql语句。后保存到内存对象中。返回一个persistent对象(session有,DB有),根据实体类型和主键。
Object get(Class clazz, Serializable id) Return the persistent instance of the given entity class with the given identifier, or null if there is no such persistent instance.
这个get方法也是有查询的功能,数据库没有则返回Null。他们的差异:
1. 不存在对应记录时表现不一样
2. Load返回的是代理对象,等到真正用到对象的内容时才发出sql语句
3. Get直接从数据库加载,不会延迟,直接填充对象。
4. 无论是load还是get,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear方法可以强制清除session缓存
Session session = sf.getCurrentSession(); session.beginTransaction(); Car car = (Car)session.load(Car.class, 1); System.out.println(car.getId()+" "+car.getColor()+" "+car.getW().getWindow_num()); session.getTransaction().commit();//自动close
在上述代码中,load返回代理对象,第一次使用car.getId()会初始化该对象。如果使用get,则直接填充该对象.
- 删:delete()
最重要的根据:对象的ID。只要有id就能删除.
删除的结果:DB中删除,Session中如果有它则删除。达到transient态。即数据库中没有,session没有。
从数据库中删除id为4的Car:
Car car = new Car(); car.setId(4); Session session = sf.getCurrentSession(); session.beginTransaction(); session.delete(car); session.getTransaction().commit();//自动close
总结:hibernate的增删改查开发接口
1.void save(Object o);保存具有不同ID的(对象)记录
2.void delete(Object o);删除存在该ID的(对象)记录
3.void update(Object o);更改存在该ID的(对象)记录
4.Object get/load(Class,ID);读取存在该ID的(对象)记录
flush与clear
flush:将session缓存中的对象与db同步。
clear:将session缓存中的内容清空。
SchemaExport
可以不配置hbm2ddl.auto选项,而使用该对象的create方法。
SchemaExport schemaExport = new SchemaExport(new AnnotationConfiguration().configure()); schemaExport.create(false, true);//第一个参数指定是否将sql语句输出到控制台,第二个控制先删除表在重新建立。
如果log4j已经将ddl语句输出了,就可以将create的第一个参数设为false.