2012-12-12 82 views
0

在非事務性環境中,可以在Hibernate中批量刪除多行,如下所示。在休眠中刪除多行

Session session=HibernateUtils.getSessionFactory().getCurrentSession(); 
session.beginTransaction(); 

String temp[]=request.getParameter("delIds").split(","); 
int len=temp.length; 
countryService.delete(temp); 

Configuration configuration=new Configuration(); 
configuration.setProperty("hibernate.jdbc.batch_size", "50"); 

for(int i=0;i<len;i++) 
{ 
    Country c=(Country)session.get(Country.class, new Long(temp[i])); 

    if(i%50==0) 
    { 
     session.flush(); 
     session.clear(); 
    } 

    session.delete(c); 
} 

//session.flush(); 
session.getTransaction().commit(); 

50行將被視爲每批刪除。


在交易環境中如何能夠做到這一點?

@Service 
@Transactional(readOnly = true, propagation=Propagation.REQUIRES_NEW) 

final public class CountryDAO implements CountryService 
{ 
    private SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) 
    { 
     this.sessionFactory = sessionFactory; 
    } 

    @SuppressWarnings("unchecked") 
    @Transactional(readOnly=false, propagation=Propagation.REQUIRES_NEW) 
    public void delete(String[] id) 
    { 
     int len=id.length; 
     Session session=sessionFactory.getCurrentSession(); 

     for(int i=0;i<len;i++) 
     { 
      Country country=(Country)session.get(Country.class, Long.valueOf(id[i])); 
      session.delete(country); 
     } 
    } 
} 

這是行得通的,但是如何刪除批處理中的每行特定行的行,以便可以最小化流向數據庫的行?


我能做到這一點類似於下面的東西。

@SuppressWarnings("unchecked") 
//@Transactional(readOnly=false, propagation=Propagation.REQUIRES_NEW) 
public void delete(String[] id) 
{ 
    int len=id.length; 
    Session session=sessionFactory.openSession();  //<---------------- 
    Transaction transaction = session.beginTransaction(); 

    Configuration configuration=new Configuration(); 
    configuration.setProperty("hibernate.jdbc.batch_size", "50"); 

    for(int i=0;i<len;i++) 
    { 
     if(i%49==0) 
     { 
      session.flush(); 
      session.clear(); 
     } 
     Country country=(Country)session.get(Country.class, Long.valueOf(id[i])); 
     session.delete(country); 
    } 
    transaction.commit(); 
    session.close(); 
} 

根據下面的答案。

回答