Мне нужно создать решение, для которого необходимо массовое обновление и массовое удаление на основе критериев.
Теперь я создаю свой класс конфигурации Hibernate, как показано ниже
@Configuration
@PropertySource(value = { "classpath:hibernate.properties" }, ignoreResourceNotFound = true)
@EnableTransactionManagement(proxyTargetClass = true)
@ComponentScan("com.fin")
@Component(value = "LocalHibernateConfig")
public class LocalHibernateConfig
{
@Inject
protected ConfigurableEnvironment env;
@Inject
private Properties properties;
private final static Logger logger = LogManager.getLogger(LocalHibernateConfig.class);
@Value("#{'a.b'.split(',')}")
protected List<String> packageList;
public LocalSessionFactoryBean sessionFactory() throws PropertyVetoException, FileNotFoundException, IOException
{
// Implementation
return factory;
}
@Bean(name = "entityManagerFactory")
public EntityManagerFactory entityManagerFactory() throws PropertyVetoException, FileNotFoundException, IOException
{
// For Help Check
// https://www.programcreek.com/java-api-examples/?api=org.hibernate.jpa.HibernatePersistenceProvider
final HibernatePersistenceProvider hibernatePersistenceProvider = new HibernatePersistenceProvider();
final HibernateJpaDialect hibernateJpaDialect = new HibernateJpaDialect();
final HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
hibernateJpaVendorAdapter.setShowSql(true);
hibernateJpaVendorAdapter.setGenerateDdl(false);
hibernateJpaVendorAdapter.setDatabasePlatform(env.getProperty("hibernate.dialect"));
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
localContainerEntityManagerFactoryBean.setPersistenceProvider(hibernatePersistenceProvider);
localContainerEntityManagerFactoryBean.setPersistenceUnitName("persistenceUnit");
localContainerEntityManagerFactoryBean.setDataSource(getDataSource());
localContainerEntityManagerFactoryBean.setJpaDialect(hibernateJpaDialect);
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(hibernateJpaVendorAdapter);
localContainerEntityManagerFactoryBean.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
localContainerEntityManagerFactoryBean.setPackagesToScan(packageList.toArray(new String[0]));
localContainerEntityManagerFactoryBean.afterPropertiesSet();
EntityManagerFactory entityManagerFactory = localContainerEntityManagerFactoryBean.getObject();
return entityManagerFactory;
}
@Bean(name = "dataSource")
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public DataSource getDataSource() throws PropertyVetoException
{
// implementation Of Ds by C3P0 Comnnection Pool
return dataSource;
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public HibernateTransactionManager transactionManager(final LocalSessionFactoryBean localSessionFactoryBean)
{
final HibernateTransactionManager ret = new HibernateTransactionManager();
ret.setSessionFactory(localSessionFactoryBean.getObject());
return ret;
}
// Rest of Configuration
}
Теперь, если я пытаюсьдля выполнения задач, связанных с управлением транзакциями, таких как обновление с помощью диспетчера сущностей, как показано ниже
@Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
public void deleteData(PredicateParams predicateParams)
{
EntityManager mgr = mydao.getEntityManager();
final CriteriaBuilder cb= mgr.getCriteriaBuilder();
final CriteriaDelete<T> criteriaDelete = criteriaBuilder.createCriteriaDelete(XYZ.class);
final Root<T> root = criteriaDelete.from(XYZ.class);
//Some machenism applied to prepere proper predicates
criteriaDelete.where(methodToCreatePredicate(predicateParams, root, criteriaBuilder));
return mgr.createQuery(criteriaDelete).executeUpdate();
}
теперь над методом выдается исключение
javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:54) ~[hibernate-entitymanager-5.1.16.Final.jar:5.1.16.Final]
///rest of code is my application details specific
, но я не понимаю, почему возникает такое исключение, потому что оно работаетс Hibernate 5.2.x, но то же самое не работает с 5.1.
Мне нужен 5.1, потому что совместимость JDK7
Пожалуйста, помогите мне, что может быть решением
, даже я пыталсялежу ниже
try{
entity.getTransaction().begin();
///do all update stuff
entity.getTransaction().commit();
}catch (Exception ex) {
ex.printStackTrace()
entity.getTransaction().rollback();
}
, но все равно выдает то же исключение, я не понимаю, что я делаю неправильно.
Также все это под Spring Framework