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.

posted @ 2013-09-24 13:42  FishBird  阅读(161)  评论(0编辑  收藏  举报