春季+冬眠

时间:2020-08-16 05:53:28

标签: java mysql spring windows hibernate

我在Centos上与VM一起完成了一个项目。我正在尝试将其移植到Windows10。它除了更新数据库外还可以工作。我将对设置和类进行布局,您能告诉我如此不同的工作可能是什么问题吗?到基础的连接是相同的:在所有情况下,我都连接到VM上的基础。

在Windows中调用合并的错误:

javax.persistence.TransactionRequiredException:没有具有实际事务的EntityManager可用于当前线程-无法可靠地处理“合并”调用 org.springframework.orm.jpa.SharedEntityManagerCreator $ SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282) com.sun.proxy。$ Proxy243.merge(未知来源) com.noteanalyzer.dao.GenericDaoImpl.update(GenericDaoImpl.java:59) com.noteanalyzer.mvc.service.impl.UserServiceImpl.updateUnsuccessfullAttempt(UserServiceImpl.java:380) com.noteanalyzer.security.security.auth.ajax.AjaxAuthenticationProvider.authenticate(AjaxAuthenticationProvider.java:58) org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:174) org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199) org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter $ AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:469) com.noteanalyzer.security.security.auth.ajax.AjaxLoginProcessingFilter.attemptAuthentication(AjaxLoginProcessingFilter.java:61) org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)

很抱歉,但是我找不到类似的答案-因为该项目在Linux上正常运行,但仅在Windows下会出现这种错误(

Apache Tomcat / 8.5.57ВерсияJVM 1.8.0_151-b12

GenericDao.java

@Transactional
public interface GenericDao {

    <E extends AbstractEntity> E create(final E model);
    
    <E extends AbstractEntity> E update(final E model);
    
    <E extends AbstractEntity> void delete(final E model);
    
    <E extends AbstractEntity> E getById(final Class<E> modelClass, final Serializable id);
    
    <E extends AbstractEntity> void deleteById(final Class<E> modelClass, final Serializable id);
    
    <E extends AbstractEntity> List<E>  getAll(final Class<E> model);
    <E extends AbstractEntity> List<E> getResultByNativeQuery(final String queryName, Map<String, Object> parameters, String name);
    List<Object> getResultByNativeQuery(final String queryName, Map<String, Object> parameters);
    <E extends AbstractEntity> List<E> getResultByNativeQuery(final String queryName, Map<String, Object> parameters, Class<E> objectType);
    public <E extends AbstractEntity> List < Map < String, Object >> getNativeQueryResultInMap(String queryName, Class<E> objectType);
    <E extends AbstractEntity> void executeNativeQuery(final String queryName, Map<String, Object> parameters);
    /**
     * Update using named query
     * @param queryName
     * @param parameters
     * @return
     */
    int updateByNamedQuery(String queryName, Map<String,Object> parameters);

    <E  extends AbstractEntity> List<E> getResultByNamedQuery(Class<E> objectType, String queryName, Map<String, Object> parameters);
    public CriteriaQuery createCriteria(Class<?> clazz);
    public <E extends AbstractEntity> Map<String, Object> callNamedStoredProcedure(String callerName, 
            Map<String, Object> parameters, Map<String, Object> outputParameters);
    
    void executeUpdate(final String queryName, Map<String, Object> parameters);
    
}

GenericDaoImpl.java

@Repository("genericDao")
@Transactional
public class GenericDaoImpl implements GenericDao {

    
    @Autowired
    protected SessionFactory sessionFactory;
    
    
    
    @PersistenceContext
    private EntityManager entityManager;
    
    public EntityManager getEntityManager() {
        return entityManager;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    
    public <E extends AbstractEntity> E create(E model) {
        entityManager.persist(model);
        return model;
    }

    @Override
    
    public <E extends AbstractEntity> E update(E model) {
        model = entityManager.merge(model);
        entityManager.flush();
        return model;
    }

    @Override
    
    public <E extends AbstractEntity> void delete(E model) {
         entityManager.remove(model);

    }

    @Override
    
    public <E extends AbstractEntity> E getById(Class<E> modelClass, Serializable id) {
            return entityManager.find(modelClass, id);
    }

    @Override
    
    public <E extends AbstractEntity> void deleteById(Class<E> modelClass, Serializable id) {
        final E entity = getById(modelClass,id);
        entityManager.remove(entity);

    }

    @Override
    
    public <E extends AbstractEntity> List<E> getAll(Class<E> model) {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<E> criteriaQuery = criteriaBuilder.createQuery(model);
        criteriaQuery.from(model);
        return entityManager.createQuery(criteriaQuery).getResultList();
    }
    
    public <E extends AbstractEntity> Map<String, Object> callNamedStoredProcedure(String callerName, 
            Map<String, Object> parameters, Map<String, Object> outputParameters){
        StoredProcedureQuery storedProcedure = entityManager.createNamedStoredProcedureQuery(callerName);
        if(parameters != null) {
            for(final Entry<String,Object> parameter : parameters.entrySet()) {
                storedProcedure.setParameter(parameter.getKey(), parameter.getValue());
            }
        }
        storedProcedure.execute();
        if(outputParameters != null) {
            for(final Entry<String,Object> parameter : outputParameters.entrySet()) {
                outputParameters.put(parameter.getKey(), storedProcedure.getOutputParameterValue(parameter.getKey()));
            }
        }
        return  outputParameters;
    }
    
    @Override
    
    public int updateByNamedQuery(String queryName, Map<String, Object> parameters) {
        final Query query = entityManager.createNamedQuery(queryName); 
        if(parameters != null) {
            for(final Entry<String,Object> parameter : parameters.entrySet()) {
                query.setParameter(parameter.getKey(), parameter.getValue());
            }
        }
        return query.executeUpdate();
    }

    
    
    @Override
    
    public <E extends AbstractEntity> List<E> getResultByNamedQuery(final Class<E> objectType, String queryName, Map<String, Object> parameters) {
        final TypedQuery<E> query = entityManager.createNamedQuery(queryName,objectType); 
        if(parameters != null) {
            for(final Entry<String,Object> parameter : parameters.entrySet()) {
                query.setParameter(parameter.getKey(), parameter.getValue());
            }
        }
        /**
         * Found shared references to a collection org.hibernate.HibernateException

         */
        entityManager.clear();
        return query.getResultList();
    }
    
    public CriteriaQuery<?> createCriteria(Class<?> clazz){
        return sessionFactory.getCurrentSession().getCriteriaBuilder().createQuery(clazz);
    }

    @SuppressWarnings("unchecked")
    @Override
    
    public <E extends AbstractEntity> List < Map < String, Object >> getNativeQueryResultInMap(String queryName, final Class<E> objectType) {
        final Query query = entityManager.createNativeQuery(queryName, objectType);
        NativeQueryImpl nativeQuery = (NativeQueryImpl) query;
        nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
        List < Map < String, Object >> result = query.getResultList();
        for (Map map: result) {
        }
        return result;
    }


    @SuppressWarnings("unchecked")
    @Override
    
    public  List<Object> getResultByNativeQuery(String queryName, 
            Map<String, Object> parameters) {
        final Query query  = entityManager.createNativeQuery(queryName);

        if(parameters != null) {
            for(final Entry<String,Object> parameter : parameters.entrySet()) {
                query.setParameter(parameter.getKey(), parameter.getValue());
            }
        }
        return query.getResultList();
        
    }
    @SuppressWarnings("unchecked")
    @Override
    
    public <E extends AbstractEntity> List<E> getResultByNativeQuery(String queryName, 
            Map<String, Object> parameters, String name) {
        /**
         * At least when using Hibernate 4.x and 5.x because the JPA StoredProcedureQuery does not work for SQL FUNCTIONS.
         */
        final Query query  = entityManager.createNativeQuery(queryName, name);
        
        if(parameters != null) {
            for(final Entry<String,Object> parameter : parameters.entrySet()) {
                query.setParameter(parameter.getKey(), parameter.getValue());
            }
        }
        return query.getResultList();
    }
    
    @Override
    
    public <E extends AbstractEntity> void executeNativeQuery(String queryName, Map<String, Object> parameters) {
        /**
         * At least when using Hibernate 4.x and 5.x because the JPA StoredProcedureQuery does not work for SQL FUNCTIONS.
         */
        final Query query  = entityManager.createNativeQuery(queryName);
        if(parameters != null) {
            for(final Entry<String,Object> parameter : parameters.entrySet()) {
                query.setParameter(parameter.getKey(), parameter.getValue());
            }
        }
        query.getSingleResult();
//      query.executeUpdate();
        
    }

    @SuppressWarnings("unchecked")
    @Override
    
    public <E extends AbstractEntity> List<E> getResultByNativeQuery(String queryName, Map<String, Object> parameters,
            Class<E> objectType) {
        /**
         * At least when using Hibernate 4.x and 5.x because the JPA StoredProcedureQuery does not work for SQL FUNCTIONS.
         */
        final Query query  = entityManager.createNativeQuery(queryName, objectType);
        if(parameters != null) {
            for(final Entry<String,Object> parameter : parameters.entrySet()) {
                query.setParameter(parameter.getKey(), parameter.getValue());
            }
        }
        return query.getResultList();
    }
    
    @SuppressWarnings("unchecked")
    
    public  void executeUpdate(String queryName, Map<String, Object> parameters) {
        final Query query  = entityManager.createNativeQuery(queryName);
        if(parameters != null) {
            for(final Entry<String,Object> parameter : parameters.entrySet()) {
                query.setParameter(parameter.getKey(), parameter.getValue());
            }
        }
        int update = query.executeUpdate();
    }

}

HibernateConfiguration.java

@Configuration
@EnableTransactionManagement
@ComponentScan({ "com.noteanalyzer.dao" })
@PropertySource(value = { "classpath:application.properties" })
@PropertySource(value = "file:${CONF_DIR}/application-override.properties", ignoreResourceNotFound = true)
public class HibernateConfiguration {

    @Autowired
    private Environment environment;

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[] { "com.noteanalyzer.entity" });
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("database.driverClassName"));
        dataSource.setUrl(environment.getRequiredProperty("database.url"));
        dataSource.setUsername(environment.getRequiredProperty("database.username"));
        dataSource.setPassword(environment.getRequiredProperty("database.password"));
        return dataSource;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
        //properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto"));
        properties.put("spring.datasource.testOnBorrow",
                environment.getRequiredProperty("spring.datasource.testOnBorrow"));
        properties.put("spring.datasource.validationQuery",
                environment.getRequiredProperty("spring.datasource.validationQuery"));





        return properties;
    }

    @Bean
    @Autowired
    public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

application.properties

database.driverClassName=com.mysql.jdbc.Driver
database.url=jdbc:mysql://192.168.1.11:3306/nt
database.username=root
database.password=qwerty

#spring database configuration
spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1

#Hibernate related properties
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.format_sql=true

0 个答案:

没有答案