(6)hibernate CURD

1. 获取session,SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();

A.Session session = sf.openSession();

B.Session session = sf.getCurrentSession();

 

说明:第一种每次都打开一个新连接,要显示关闭.

         第二种,先从上下文查看有没有session,有就用它没有创建一个新的,一旦commit().就会自动关闭连接,在配置文件中hibernate.cfg.xml 要加入   <property name="current_session_context_class">thread</property>也可能用jta.

 

2. save

Session session = sf.openSession();
  session.beginTransaction();
  session.save(s);
  session.getTransaction().commit();
  session.close();

 

下面可能看出session的关系:

Teacher t = new Teacher();
  t.setName("王老师");
  
  Session session = sf.getCurrentSession();
  session.beginTransaction();
  session.save(t);
  Session session2 = sf.getCurrentSession();
  
  System.out.println(session == session2);
  
  session.getTransaction().commit(); //提交之后此session关闭
  
  Session session3 = sf.getCurrentSession();
  System.out.println(session == session3);

 

3. delete

 

Teacher t = new Teacher();
  t.setName("Miss Wang");
  
  Session session = sf.getCurrentSession();
  session.beginTransaction();
  session.save(t);
  System.out.println(t.getId());
  session.getTransaction().commit();
  
  Session session2 = sf.getCurrentSession();
  session2.beginTransaction();
  session2.delete(t);
  session2.getTransaction().commit();

 

其实只要Id与DB中的Id对应就可以删除,不用管对象处在哪种状态.

 

4.Load

 

Session session = sf.getCurrentSession();
  session.beginTransaction();
  Teacher  t = (Teacher)session.load(Teacher.class, 2);
  System.out.println(t.getName());
  session.getTransaction().commit();
  System.out.println(t.getClass());

 

查出来的对象是一个代理类,只有去查类中的属性才会真正去查数据库.

 

5. Get

 

Session session = sf.getCurrentSession();
  session.beginTransaction();
  Teacher t = (Teacher)session.get(Teacher.class, 2);
  session.getTransaction().commit();
  System.out.println(t.getName());

 

不会产生廷迟加载,立即查询数据库.

 

6. Update

 

下面列举4种:

A.  update

Session session = sf.getCurrentSession();
  session.beginTransaction();
  Teacher t = (Teacher)session.get(Teacher.class, 2);
  session.getTransaction().commit();
  
  t.setName("李老师");
  
  Session session2 = sf.getCurrentSession();
  session2.beginTransaction();
  session2.update(t);
  session2.getTransaction().commit();

 

B.

Session session = sf.getCurrentSession();
  session.beginTransaction();
  Teacher t = (Teacher)session.get(Teacher.class, 2);
  t.setName("白老师");
  session.getTransaction().commit();

 

C.  HQL

Session session = sf.getCurrentSession();
  session.beginTransaction();
  Query query = session.createQuery("update Teacher set name='小明' where id=2");
  query.executeUpdate();
  session.getTransaction().commit();

 

D.  合并

Session session = sf.getCurrentSession();
  session.beginTransaction();
  
  Teacher t = (Teacher)session.get(Teacher.class, 2);
  session.getTransaction().commit();
  
  t.setSex("女");
  Session session2 = sf.getCurrentSession();
  session2.beginTransaction();
  session2.merge(t);
  session2.getTransaction().commit();

 

说明:如果没有做什么设置,除了C以外,其它的更新操作如果你只是对其中一个字段更新hibernate还是会默认更新所有字段,解决方案有使用B或D,在xx.hbm.xml文件中,加入动态更新设置,如下

<class name="Teacher" dynamic-update="true">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  <property name="sex"/>
 </class>

 

这样只有要更新的字段才会更新,对于D方案还要提一下,当session提交之后对象处于detached,使用merget()方法,它会先去数据库先查一下放在缓存中与对象比较,然后才能判断哪个字段需要更新.

 

 

7. SaveOrUpdate

 

Teacher t = new Teacher();
  t.setName("XY");
  
  Session session = sf.getCurrentSession();
  session.beginTransaction();
  session.saveOrUpdate(t);
  session.getTransaction().commit();
  
  t.setName("JJ");
  Session session2 = sf.getCurrentSession();
  session2.beginTransaction();
  session2.saveOrUpdate(t);
  session2.getTransaction().commit();

 

8. Clear 清除缓存

 

Session session = sf.getCurrentSession();
  session.beginTransaction();
  Teacher t1 = (Teacher)session.load(Teacher.class, 3);
  System.out.println(t1.getName());
  System.out.println(t1.getSex());
 
  session.clear();
 
  Teacher t2 = (Teacher)session.load(Teacher.class, 3);
  System.out.println(t2.getName());
  
  session.getTransaction().commit();

 

 

 9.Flush

 

Session session = sf.getCurrentSession();
  session.beginTransaction();
  Teacher t = (Teacher)session.load(Teacher.class, 2);
  t.setName("ss");
  session.flush();
  t.setName("mm");
  session.getTransaction().commit();

 

10. SchemaExport

 

new SchemaExport(new AnnotationConfiguration().configure()).create(true, false);

 

说明:create(true,false)第一个boolean代表是否输出ddl,第二个,是否同步数据库.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值