(1) delete(Object o):用于删除指定的一个对象。只要对象设置了Id就可以delete。
需要注意的是如果数据库没有该对象,那么调用delete方法也不会报任何错误,因此为了明确是否有删除,还是会先判断是否存在该对象,而往往会把找到的对象作为返回值。
(2) save(Object o):用于将一个对象o持久化。
需要注意的是直接调用该方法,如果数据库中已经存在该主键对应的对象,那么就会报错,所以为了避免出现客户端看不到的错误,通常是先判断数据库中是否已经存在该对象,如果有就不再调用save方法,而是告诉用户”该对象已经存在”,没有才调用save方法。
(3) load(Class, 对象的主键):用于查找指定的一个对象,如:
Teacher t = (Teacher)session.load(Teacher.class, 1);
生成的不是Teacher类,而只是一个代理(Teacher类的一个子类)
get(Class, 对象的主键):用于查找指定的一个对象,如:
Teacher t = (Teacher)session.get(Teacher.class, 1);
不同之处:load生成的只是对象的一个代理,即还不会生成sql语句真正执行,只有真正要用到对象时(例如:System.out.println(t.getName())),才会发出sql语句并执行。所以如果数据库中没有要找的对象,那么load方法执行后是不会报错的,而get方法则会报错。因此使用get方法时还是最后先检查数据库是否已经存在该对象。
(4) createQuery(String sql):也是用于查找对象,不过比较灵活,能够根据给出的具体的条件进行查找。例如,判断一个对象是否已经存在数据库中:
Configuration cf = new AnnotationConfiguration();
SessionFactory sessionFactory
= cf.configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Query querySql = session.createQuery("from Member m where m.id
= :id and m.name = :name");
querySql.setParameter("id", m.getId());
querySql.setParameter("name", m.getName());
List<Member> members = (List<Member>) querySql.list();
session.getTransaction().commit();
if(members.size() > 0) {
return true;
} else {
return false;
}
(5) update(Object o):可以更新一个detached对象,更新完后转为persistence对象,但不能更新一个transient对象,可以更新自己设定Id后的对象。而由于该方法是更新表中所有字段的,所以效率往往会很低,尤其是存在某些字段特别长的时候。可以通过以下方式解决:
l 在annotation中对不想更新的字段(往往是特别长的那个字段)加注解:@Column(updatable=flase);
l 在xml文件字段的<property>标签里加入属性:update=”false”,例如:
<property name=”title” update=”false”></property>,不过这种方式比较少用,不灵活;
l 在对应实体的xml配置文件的<class>标签里加入dynamic-update=”true”,表示字段没有变化就不更新,有变化才更新,如:
<class name=”com.yilong.hibernate.Student” dynamic-update=”true”>
只改变Student中的name字段的情况。
l 使用HQL(EJBQL)(面向对象的查询语言)语句,例如:(import org.hibernate.Query)
Query q = session.createQuery(“update Student s set s.name=’z5’
where s.id=1”);
q.executeUpdate();