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,第二个,是否同步数据库.