## sqlcommenter-java - [Introduction](#introduction) - [Integrations](#integrations) - [ORMs](#orms) - [Frameworks](#frameworks) - [Using them](#using-them) - [Spring](#spring) - [In XML Configuration](#in-xml-configuration) - [In your Java source code](#in-your-java-source-code) - [Hibernate](#hibernate) - [Spring Hibernate](#spring-hibernate) ### Introduction Provides integrations to correlate user source code from various web frameworks with SQL comments from various ORMs. When results are examined in SQL database logs, they'll look like this: ```shell SELECT * from USERS /*action='run+this+%26+that', controller='foo%3BDROP+TABLE+BAR',framework='spring, traceparent='00-9a4589fe88dd0fc911ff2233ffee7899-11fa8b00dd11eeff-01', tracestate='rojo%253D00f067aa0ba902b7%2Ccongo%253Dt61rcWkgMzE''*/ ``` ### Integrations #### ORMs - [X] Hibernate - [ ] JDBC #### Frameworks - [X] Spring - [ ] Jetty - [ ] Netty - [ ] Apache Tomcat - [ ] gRPC ### Using it #### Spring ##### Java-based configuration If your're using Spring 5, then you can add the `SpringSQLCommenterInterceptor` as follows: ```java import com.google.cloud.sqlcommenter.interceptors.SpringSQLCommenterInterceptor; @EnableWebMvc @Configuration public class WebConfig implements WebMvcConfigurer { @Bean public SpringSQLCommenterInterceptor sqlInterceptor() { return new SpringSQLCommenterInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(sqlInterceptor()); } } ``` If you're using an older version of Spring, then your `WebConfig` class needs to extend the `WebMvcConfigureAdapter` class instead: ```java import com.google.cloud.sqlcommenter.interceptors.SpringSQLCommenterInterceptor; @EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigureAdapter { @Bean public SpringSQLCommenterInterceptor sqlInterceptor() { return new SpringSQLCommenterInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(sqlInterceptor()); } } ``` ##### XML-based configuration You can also add the interceptor as a bean in your XML configuration: ```xml ``` or alternatively just for a specific method ```xml ``` #### Hibernate ##### Hibernate via JPA If you're using Hibernate via JPA, then you can simply set the `hibernate.session_factory.statement_inspector` configuration property in the `persistence.xml` configuration file: ```xml ``` ##### Hibernate via Spring Application Properties If you're using Hibernate via Spring application properties(i.e. you have `application.yml` or `application.properties` in your resources folder) - `application.properties` ```properties spring.jpa.properties.hibernate.session_factory.statement_inspector=com.google.cloud.sqlcommenter.schibernate.SCHibernate ``` - `application.yml` ```yml spring: jpa: properties: hibernate: session_factory: statement_inspector: com.google.cloud.sqlcommenter.schibernate.SCHibernate ``` ##### Hibernate via Spring If you're using Hibernate via Spring, then you might not use a `persistence.xml` configuration file, in which case, you can set up the `hibernate.session_factory.statement_inspector` configuration property as follows: ```java @Configuration @EnableTransactionManagement public class JPAConfig { @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); em.setPackagesToScan(new String[] { "you.application.domain.model" }); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; } private Properties additionalProperties() { Properties properties = new Properties(); properties.setProperty("hibernate.session_factory.statement_inspector", SCHibernate.class.getName()); return properties; } } ``` #### Spring Hibernate 1. Please follow the instructions to add the [Spring interceptor](#spring) 2. Please follow the instructions to add the [Hibernate StatementInspector](#hibernate)