在java中应用程序通过new创建一个java对象时,jvm会为这个对象分配一块内存空间,只要这个对象被应用,就一直处于内存中,如果这个对象不在被任何引用变量引用,java虚拟机会适当时候回收内存,这就是垃圾回收器,java集合里面存放的对象实际上面就是java对象的引用,当我们向对象里面添加或者删除一个对象的时候实际上是把一个引用添加或删除了,在hibernate中session接口是hibernate提供给应用程序的主要接口,提供了主要的一些数据库操作,session具有缓存,位于缓存中的对象处于持久化状态,它和数据库中的相关记录对应。session缓存两大作用,一,减少访问数据库的频率,二,保证缓存中的对象与数据库中的记录同步。位于缓存中的对象叫做持久化对象,
public static void testObject()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Customer customer = new Customer();
customer.setName("elvia");
Order order1=new Order();
order1.setOrdernumber(3);
Order order2=new Order();
order2.setOrdernumber(4);
customer.getOrders().add(order1);
session.getTransaction().commit();
}
public static void testObject2()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Customer customer = new Customer();
customer.setName("elvia");
session.save(customer);//持久化customer对象,同时customer对象被
//加入到缓存中,上面customer为一持久化对象
Long id=customer.getId();//获得customer的id
Customer c2=(Customer)session.load(Customer.class,id);
//重新loadcustomer对象,直接从缓存中取出,而不是访问数据库
session.getTransaction().commit();
session.close();//关闭session,清空缓存
//但是仍然可以访问c2,此时c2处于游离状态
System.out.println(c2.getName());
}
位于session缓存中的持久化对象状态发生了变化,session并不会马上执行相关sql语句,
public static void testObject3()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Customer customer = (Customer)session.load(Customer.class,new Long(1));
customer.setName("11");
customer.setName("22");
session.getTransaction().commit();
},
上面所做的操作,只会执行一句sql语句把name改为22,而不会执行两次update,当session加载了customer对象后,会给customer对象的值类型属性复制一份快照,当session清理缓存时,通过比较customer对象的当前属性与快照,session判断那些属性进行了改变,从而执行相应的update
session会在1 comomit方法的时候,commit方法先清理缓存,然后在向数据库提交事务,当应用程序调用find或者iterator的时候如果缓存中的持久化对象发生了改变则先清理缓存,当应用程序调用flush的时候,flush是清理缓存执行一部分sql操作,但是不会提交事务,而commit是先清理缓存再提交事务,
hibernate中java对象的状态
1临时状态,刚由new来创建,还没有被持久化,不处于session缓存中
2 持久化状态,已经被持久化,加入到session缓存中,处于持久化状态的对象,持久化对象
3 游离状态,已经被持久化,当不再处于sesion缓存中。
session的特定方法促使java对象由一个状态转换为另一个状态
session接口的相关方法
save方法把临时对象转换为持久化对象 save完成以下操作,把customer对象加入到缓存中,使他变成持久化对象,选用映射文件中指定的标识符生成器给持久化对象分配唯一OID,如果希望由应用程序来给customer对象指定oid,可以调用save的重载方法save(customer,new Long(155)),savef并不是立即执行sqlinsert的,而是等到清理缓存的时候,注意无论java处于何种状态,多不应该由应用程序来修改它的oid
public static void testObject4()
{
Session session=HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Customer c=new Customer();
c.setName("1111");
session.save(c);
/*
Customer c2=new Customer();
session.save(c2);
c2.seName(""222);
*/
session.getTransaction().commit();
}上面两种实现实际上是一个效果,因为只有等到session清理缓存的时候,才执行相应的sql操作
saveOrUpdate方法同时包含save和update方法的功能,如果传人的参数是临时状态则执行save,如果传入的参数是游离对象则执行update方法,如果传入的参数是持久化对象则直接返回,session的load和get方法,区别在于load方法当数据库中不存在Oid的时候抛出异常,get则返回null
delete方法从数据库中删除与java对象对应的记录
对象和对象是相互关联的,再session缓存中存放的是一幅相互关联的对象图,比方说user里面有个属性是company,这样就可以通过user来获得user所在的company的相关信息,同时也可以根据company获得这个company的所有的user的相关信息,<set> <many-to-one> <one-to-one> 多由一个cascade属性,值有none,save-update,delete ,all,delete-orphan,all-delete-orphan