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();
}
根据下面的答案。