hibernate中Session常见操作

(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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章