Tin*_*iny 1 spring hibernate transactions
在非事务性环境中,可以在 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();
Run Code Online (Sandbox Code Playgroud)
每批将考虑删除 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是可行的,但是如何删除批处理中的行,每个批处理具有特定的行,以便可以最小化流向数据库的流?
我可以做类似以下的事情。
@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();
}
Run Code Online (Sandbox Code Playgroud)
根据下面的答案。
您可以使用在 HQL 中包含删除的“批量”更新命令。
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html#batch-direct
| 归档时间: |
|
| 查看次数: |
10254 次 |
| 最近记录: |