2016-07-31 90 views
0

我想實現deleteAll方法,它將刪除所有User實體與它們的關聯,同時我想在訪存內存堆中的用戶集合時阻止java.lang.OutOfMemoryError異常。休眠:一次刪除關聯的所有實體

我目前的執行情況看起來像下面的代碼片段:

public void deleteAll() { 
    final int PAGE_SIZE = 15; 
    final int PAGE_NUMBER = 0; 
    final String SORTING_PROPERTY_NAME = "id"; 
    List<User> result; 

    Session session = sessionFactory.getCurrentSession(); 
    Criteria criteria = session.createCriteria(User.class); 
    criteria.addOrder(Order.asc(SORTING_PROPERTY_NAME)); 
    criteria.setFirstResult(PAGE_NUMBER); 
    criteria.setMaxResults(PAGE_SIZE); 

    do { 
     result = criteria.list(); 
     result.forEach(session::delete); 
    } while (result.size() == PAGE_SIZE); 
} 

正如你看到我使用分頁的方式,所以我取一個批量數據然後將其刪除等。 Hibernate在現實中如何實現這一點?謝謝你的幫助。

+2

看看:http://stackoverflow.com/questions/3492453/hibernate-and-delete-all。可能有幫助。目前的方法看起來效率很低,你必須讀取整個表,然後刪除每條記錄,太多的數據庫查詢。 –

回答

2

試試這個:

sessionFactory.getCurrentSession().createQuery("delete from User").executeUpdate(); 

你並不需要獲取所有記錄(或任何部分),將其刪除。 也看看here。也許它會有用。

不幸的是,這種方法不會觸發級聯移除。也許你可以批准另一種方法。例如,創建附加列「is_deleted」,如果刪除它,則將值設置爲true。在此之後,您可以在晚上安排工作。這項工作將通過您的方式實際刪除這些用戶的一部分。但是你必須在get \ fetch方法中添加一個條件來考慮只有is_deleted = false的用戶。

+0

我意識到我的方法(描述問題)是一個低性能,因爲對db的許多調用。所以我將使用hsl作爲表截斷。但在這種情況下,如果像多對多這樣的關聯,我不得不使用本機sql查詢來截斷關聯表。感謝Aliaksandr Budnikau和Vladimir Vagaytsev的幫助! – Dimon

1

假設沒有級聯,您實際上可以使用hql或jpl來做到這一點。

public int hqlTruncate(String user){ String hql = String.format("delete from %s",user); Query query = session.createQuery(hql) return query.executeUpdate(); }