In a non-transactional environment, multiple rows can be deleted in a batch in Hibernate something like the following.
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 rows will be considered for deletion per batch.
How can the same be made possible in a transactional environment?
@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);
}
}
}
This works but how to delete rows in a batch with specific rows per batch so that a stream towards the database can be minimized?
I could do it something like the following.
@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();
}
According to the answer below.
You can use a “batch” update command that includes delete in the HQL.
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html#batch-direct