Hibernate按id删除对象

时间:2012-02-28 06:34:26

标签: performance hibernate

如果只有id可用,删除对象的最佳方法(性能方面)。

  1. HQL。执行这个HQL会将SessionContext对象加载到hibernate持久化上下文吗?

    for(int i=0; i<listOfIds.size(); i++){
        Query q = createQuery("delete from session_context where id = :id ");
            q.setLong("id", id);
            q.executeUpdate();
    }
    
  2. 按ID加载并删除。

    for(int i=0; i<listOfIds.size(); i++){
        SessionContext session_context = (SessionContext)getHibernateTemplate().load(SessionContext.class, listOfIds.get(i));
        getHibernateTemplate().delete(session_context) ;
    }
    
  3. 此处SessionContext是映射到session_context表的对象。 或者,当然还有一个不同的,更好的方法吗?

3 个答案:

答案 0 :(得分:7)

在这两个中,第一个更好,你将节省内存。如果要删除实体并且您拥有该ID,则首选编写HQL。

在你的情况下,有第三个更好的选择,

尝试下面的内容,

//constructs the list of ids using String buffer, by iterating the List.
String idList = "1,2,3,....."

Query q = createQuery("delete from session_context where id in (:idList) ");
q.setString("idList", idList);
q.executeUpdate();

现在,如果列表中有4个项目,则只会触发一个查询,之前会有4个。

注意: - 为了使上述工作正常,session_context应该是一个独立的表。

答案 1 :(得分:3)

是的,对那个丑陋的字符串说不,有.setParameterList(),所以:

List<Long> idList = Arrays.asList(1L, 2L, 3L);

Query q = createQuery("delete from session_context where id in (:idList) ");
q.setParameterList("idList", idList);
q.executeUpdate();

<强>更新 我必须对此进行更新,在我们的环境中,最终结果表明,使用setParameterList提供的性能要差得多,而不是创建一个字符串manualy并使用像@ManuPK建议的setString。

答案 2 :(得分:2)

您还应该考虑缓存 - 第一级(会话)和第二级缓存。

如果删除是事务中的唯一或第一个操作,则第一个选项可能是最好的。

如果你查询一些SessionContext对象,然后调用HQL删除,那么查询缓存中的所有对象都将被逐出,因为hibernate不知道要删除哪些对象。第二种方法不是这种情况。

如果你使用二级缓存,那么它就更复杂,并且在很大程度上取决于你对SessionContext对象的处理方式。