如何在事务打开后查询SQL?

时间:2015-06-29 07:20:37

标签: java spring postgresql transactions spring-boot

就像在标题中一样。我需要查询数据库上的特定函数,该函数将定义分配给事务的一些值。如果可能的话,我想让它成为一个与特定配置文件相关的全局配置(很少有我不想加载该功能的请求)。

Project是基于Java SE 1.7,Spring Boot 1.1.7构建的,它与PostgreSQL数据库连接。

请求构建在3层,SomeClassController(Controller),SomeClassService(Service),SomeClassDB(Repository)上。在SomeClassDB上,它使用Spring中的JdbcTemplate与数据库连接,并执行CRUD操作。在进行任何这些操作之前,我想查询一个函数。正如我提到的那样,我不想要一个可以完成工作的方法 - 我需要在TransactionManager上进行全局配置吗?

也许我应该在beforeCommit方法中使用TransactionSynchronization?但我不知道如何在全球范围内使用它。

EDIT1:我能做什么,但我不想;):

@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
@Service
public class SessionService {

Boolean flag;

public SessionService(){
    flag=false;
}

@Value("${appVersion}") String appVersion;  
@Value("${appArtifactId}") String appArtifactId;

public void addSession(){
    if(!flag){
        jdbcTemplate.execute("SELECT add_ses('"+appArtifactId+"','"+appVersion+")");
        flag=true;
    }
}

public void deleteSession(){

    jdbcTemplate.execute("SELECT del_ses()");
    }
}

现在我可以在@Autowired这个类的第二层类的开始和结束时调用这两个方法。但我真的不想这样做。有人,有一天会忘记它传播第二层SomeClassService类,我想避免它。

我希望这会让你更接近我的问题。

1 个答案:

答案 0 :(得分:0)

这可能是方面的典型用例。你有没有尝试为此写一个方面?可以将Aspect配置为在特定包或由特定注释修饰的方法中调用方法之前和之后执行某些代码。 Spring对各方面都有非常好的支持。

另一种方法是创建一个代理(使用java.lang.reflect.Proxy)对象,该对象将调用您的初始化代码,然后委托给代理对象。