implementation for bael-7428 (#16205)

* implementation

* adding to pom.xml

* ci failure

---------

Co-authored-by: technoddy <mail.technoddy@gmail.com>
This commit is contained in:
Sam 2024-04-04 21:45:03 -04:00 committed by GitHub
parent cc90a0b8bb
commit 7cb3519bd2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 343 additions and 0 deletions

View File

@ -91,6 +91,7 @@
<module>spring-boot-redis</module>
<module>spring-boot-cassandre</module>
<module>spring-boot-react</module>
<module>spring-caching-3</module>
<!-- <module>spring-boot-3</module> --> <!-- JAVA-20931 -->
<module>spring-boot-3-grpc</module>
<module>spring-boot-3-native</module>

View File

@ -0,0 +1,2 @@
## Relevant articles

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-caching-3</artifactId>
<version>0.1-SNAPSHOT</version>
<name>spring-caching-3</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
<packaging>jar</packaging>
<parent>
<groupId>com.baeldung.spring-boot-modules</groupId>
<artifactId>spring-boot-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,10 @@
package com.baeldung.caching.disable;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
public interface BookRepository extends JpaRepository<BookReview, Long> {
List<BookReview> findByIsbn(String isbn);
}

View File

@ -0,0 +1,70 @@
package com.baeldung.caching.disable;
import jakarta.persistence.*;
import java.util.Objects;
@Entity
@Table(name = "BOOK_REVIEWS")
public class BookReview {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "book_reviews_reviews_id_seq")
@SequenceGenerator(name = "book_reviews_reviews_id_seq", sequenceName = "book_reviews_reviews_id_seq", allocationSize = 1)
private Long reviewsId;
private String userId;
private String isbn;
private String bookRating;
public Long getReviewsId() {
return reviewsId;
}
public void setReviewsId(Long reviewsId) {
this.reviewsId = reviewsId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getBookRating() {
return bookRating;
}
public void setBookRating(String bookRating) {
this.bookRating = bookRating;
}
@Override
public String toString() {
return "BookReview{" + "reviewsId=" + reviewsId + ", userId='" + userId + '\'' + ", isbn='" + isbn + '\'' + ", bookRating='" + bookRating + '\'' + '}';
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
BookReview that = (BookReview) o;
return Objects.equals(reviewsId, that.reviewsId) && Objects.equals(userId, that.userId) && Objects.equals(isbn, that.isbn) && Objects.equals(bookRating, that.bookRating);
}
@Override
public int hashCode() {
return Objects.hash(reviewsId, userId, isbn, bookRating);
}
}

View File

@ -0,0 +1,15 @@
package com.baeldung.caching.disable;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching
@EnableAutoConfiguration
public class BookReviewApplication {
public static void main(String[] args) {
SpringApplication.run(BookReviewApplication.class, args);
}
}

View File

@ -0,0 +1,25 @@
package com.baeldung.caching.disable;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class BookReviewsLogic {
@Autowired
private BookRepository bookRepository;
@Autowired
private CacheManager cacheManager;
@Cacheable(value = "book_reviews", key = "#isbn")
public List<BookReview> getBooksByIsbn(String isbn) {
return bookRepository.findByIsbn(isbn);
}
}

View File

@ -0,0 +1,23 @@
package com.baeldung.caching.disable;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.cache.support.NoOpCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager(@Value("${appconfig.cache.enabled}") String isCacheEnabled) {
if (isCacheEnabled.equalsIgnoreCase("false")) {
return new NoOpCacheManager();
}
return new ConcurrentMapCacheManager();
}
}

View File

@ -0,0 +1,9 @@
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# Enabling H2 Console
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

View File

@ -0,0 +1,68 @@
package com.baeldung.caching.disable;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.test.context.TestPropertySource;
@SpringBootTest(classes = BookReviewApplication.class)
@ExtendWith(OutputCaptureExtension.class)
@TestPropertySource(properties = {
"appconfig.cache.enabled=false"
})
public class BookReviewsLogicCacheDisabledUnitTest {
@Autowired
private BookReviewsLogic bookReviewsLogic;
@Autowired
private BookRepository bookRepository;
@Test
public void givenCacheDisabled_whenLogicExecuted2ndTime_thenItQueriesDB(CapturedOutput output){
BookReview bookReview = insertBookReview();
bookReviewsLogic.getBooksByIsbn(bookReview.getIsbn());
String target = "Hibernate: select b1_0.reviews_id,"
+ "b1_0.book_rating,b1_0.isbn,b1_0.user_id "
+ "from book_reviews b1_0 "
+ "where b1_0.isbn=?";
String[] logs = output.toString()
.split("\\r?\\n");
assertThat(logs).anyMatch(e -> e.contains(target));
bookReviewsLogic.getBooksByIsbn(bookReview.getIsbn());
logs = output.toString()
.split("\\r?\\n");
long count = Arrays.stream(logs)
.filter(e -> e.contains(target))
.count();
// count 2 means the select query log from 1st and 2nd execution.
assertEquals(2, count);
}
private BookReview insertBookReview() {
BookReview bookReview = new BookReview();
bookReview.setReviewsId(123L);
bookReview.setBookRating("3.2");
bookReview.setUserId("111");
bookReview.setIsbn("1234");
bookRepository.save(bookReview);
return bookReview;
}
}

View File

@ -0,0 +1,64 @@
package com.baeldung.caching.disable;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Arrays;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.test.context.TestPropertySource;
@SpringBootTest(classes = BookReviewApplication.class)
@ExtendWith(OutputCaptureExtension.class)
public class BookReviewsLogicUnitTest {
@Autowired
private BookReviewsLogic bookReviewsLogic;
@Autowired
private BookRepository bookRepository;
@Test
public void givenCacheEnabled_whenLogicExecuted2ndTime_thenItDoesntQueriesDB(CapturedOutput output){
BookReview bookReview = insertBookReview();
String target = "Hibernate: select b1_0.reviews_id,"
+ "b1_0.book_rating,b1_0.isbn,b1_0.user_id "
+ "from book_reviews b1_0 "
+ "where b1_0.isbn=?";
// 1st execution
bookReviewsLogic.getBooksByIsbn(bookReview.getIsbn());
String[] logs = output.toString()
.split("\\r?\\n");
assertThat(logs).anyMatch(e -> e.contains(target));
// 2nd execution
bookReviewsLogic.getBooksByIsbn(bookReview.getIsbn());
logs = output.toString()
.split("\\r?\\n");
System.out.println(logs);
long count = Arrays.stream(logs)
.filter(e -> e.equals(target))
.count();
// count 1 means the select query log from 1st execution.
assertEquals(1,count);
}
private BookReview insertBookReview() {
BookReview bookReview = new BookReview();
bookReview.setReviewsId(123L);
bookReview.setBookRating("3.2");
bookReview.setUserId("111");
bookReview.setIsbn("1234");
bookRepository.save(bookReview);
return bookReview;
}
}

View File

@ -0,0 +1,12 @@
appconfig.cache.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# Enabling H2 Console
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.jpa.hibernate.ddl-auto=update
server.port=8000
spring.jpa.show-sql=true