HibernateTransactionManager с JPA EntityManager - PullRequest
0 голосов
/ 19 сентября 2019

Мне нужно создать решение, для которого необходимо массовое обновление и массовое удаление на основе критериев.

Теперь я создаю свой класс конфигурации 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...