2017-05-17 9 views
0

도움이 필요합니다. Spring은 @Transactional 주석이 달린 메소드를 인식하지 못하는 것 같습니다. 솔루션에 대한 많은 소스를 보았지만 찾을 수 없습니다. 그리고 나는 정확히 dao 메소드에 주석을 달아야합니다. 서비스가 아닙니다. (이것이 최선의 방법이라는 것을 알고 있습니다.) 오후 8시 30 분 P.S. 내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다.봄이 @ 거래 주석을 인식하지 못함

내 appInitializer :

package com.dreamteam.datavisualizator.common.configurations; 

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    protected Class<?>[] getRootConfigClasses() { 
     return new Class[]{ServletContext.class}; 
    } 

    protected Class<?>[] getServletConfigClasses() { 
     return new Class[]{ApplicationContext.class}; 
    } 

    protected String[] getServletMappings() { 
     return new String[]{"/"}; 
    } 
} 

내의 servletContext :

package com.dreamteam.datavisualizator.common.configurations; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 
import org.springframework.web.servlet.view.JstlView; 

@Configuration 
@ComponentScan(basePackages = "com.dreamteam.datavisualizator") 
@EnableWebMvc 
@EnableTransactionManagement 
public class ServletContext extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    } 

    @Bean 
    public ViewResolver viewResolver(){ 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
     resolver.setViewClass(JstlView.class); 
     resolver.setPrefix("/WEB-INF/view/"); 
     resolver.setSuffix(".jsp"); 
     resolver.setExposeContextBeansAsAttributes(true); 
     return resolver; 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 
} 

내 ApplicationContext를 : SimpleJdbcCall의

package com.dreamteam.datavisualizator.common.configurations; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.jdbc.core.simple.SimpleJdbcCall; 
import org.springframework.jdbc.datasource.DataSourceTransactionManager; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import javax.sql.DataSource; 

@Configuration 
public class ApplicationContext { 

    @Bean(name = "dataSource") 
    public DataSource getDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 
     dataSource.setUrl(System.getenv("SQL_JDBC_URL")); 
     dataSource.setUsername(System.getenv("SQL_LOGIN")); 
     dataSource.setPassword(System.getenv("SQL_PASSWORD")); 
     return dataSource; 
    } 

    @Bean(name = "transactionManager") 
    public PlatformTransactionManager transactionManager() { 
     return new DataSourceTransactionManager(getDataSource()); 
    } 

    @Bean(name="generalTemplate") 
    public JdbcTemplate getJdbcTemplate(){ 
     return new JdbcTemplate(getDataSource()); 
    } 

    @Bean(name="simpleCallTemplate") 
    public SimpleJdbcCall getSimpleJdbcCall(){ 
     return new SimpleJdbcCall(getDataSource()); 
    } 
} 

내 다오 클래스 (이 방법이 될 수 있습니다 더 많은 통화 /하지만 예 :) :

@Repository("userDaoImpl") 
public class UserDAOImpl implements UserDAO { 
    private enum UserColumnName {ID, FIRST_NAME, LAST_NAME, EMAIL} 

    @Autowired 
    private JdbcTemplate generalTemplate; 

    @Autowired 
    private SimpleJdbcCall simpleCallTemplate; 

    //... 

    @Transactional 
    public BigInteger createObject(BigInteger object_id, String name) { 
     simpleCallTemplate.withFunctionName(INSERT_OBJECT); 
     SqlParameterSource in = new MapSqlParameterSource() 
       .addValue("obj_type_id", object_id) 
       .addValue("obj_name", name); 
     return simpleCallTemplate.executeFunction(BigDecimal.class, in).toBigInteger(); 
    } 

    //... 

    private String INSERT_OBJECT = "insert_object"; 
} 
+0

"봄이하지 않는 것 변경 롤백 것입니다 경우 지금

@Transactional(value = "transactionManager", rollbackFor = java.lang.Exception.class) public BigInteger createObject(BigInteger object_id, String name) { simpleCallTemplate.withFunctionName(INSERT_OBJECT); SqlParameterSource in = new MapSqlParameterSource() .addValue("obj_type_id", object_id) .addValue("obj_name", name); return simpleCallTemplate.executeFunction(BigDecimal.class, in).toBigInteger(); } 

rollbackFor 지정하지 않았기 때문에이 작동하지 않습니다 믿는다 @Transactional로 주석을 달았던 나의 방법을 알아라. " – Afridi

+0

@Transactional에 의해 주석을 달아주는 메소드의 예제를 추가하십시오. – Michal

+0

@Michal 메소드의 예가 추가되었습니다. – Barmaglot1990

답변

0

아마도 오픈 세션 때문일 수 있습니까?

관련 문제