commit
e5e60b7e28
|
@ -0,0 +1,88 @@
|
||||||
|
package com.baeldung.exceptionhandling
|
||||||
|
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
|
class ExceptionHandling {
|
||||||
|
|
||||||
|
fun tryCatchBlock(): Int? {
|
||||||
|
try {
|
||||||
|
val message = "Welcome to Kotlin Tutorials"
|
||||||
|
return message.toInt()
|
||||||
|
} catch (exception: NumberFormatException) {
|
||||||
|
println("NumberFormatException in the code")
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun tryCatchExpression(): Int? {
|
||||||
|
val number = try {
|
||||||
|
val message = "Welcome to Kotlin Tutorials"
|
||||||
|
message.toInt()
|
||||||
|
} catch (exception: NumberFormatException) {
|
||||||
|
println("NumberFormatException in the code")
|
||||||
|
null
|
||||||
|
}
|
||||||
|
return number
|
||||||
|
}
|
||||||
|
|
||||||
|
fun multipleCatchBlock(): Int? {
|
||||||
|
return try {
|
||||||
|
val result = 25 / 0
|
||||||
|
result
|
||||||
|
} catch (exception: NumberFormatException) {
|
||||||
|
println("NumberFormatException in the code")
|
||||||
|
null
|
||||||
|
} catch (exception: ArithmeticException) {
|
||||||
|
println("ArithmeticException in the code")
|
||||||
|
null
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
println("Exception in the code")
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun nestedTryCatchBlock(): Int? {
|
||||||
|
return try {
|
||||||
|
val firstNumber = 50 / 2 * 0
|
||||||
|
try {
|
||||||
|
val secondNumber = 100 / firstNumber
|
||||||
|
secondNumber
|
||||||
|
} catch (exception: ArithmeticException) {
|
||||||
|
println("ArithmeticException in the code")
|
||||||
|
null
|
||||||
|
}
|
||||||
|
} catch (exception: NumberFormatException) {
|
||||||
|
println("NumberFormatException in the code")
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun finallyBlock(): Int? {
|
||||||
|
return try {
|
||||||
|
val message = "Welcome to Kotlin Tutorials"
|
||||||
|
message.toInt()
|
||||||
|
} catch (exception: NumberFormatException) {
|
||||||
|
println("NumberFormatException in the code")
|
||||||
|
null
|
||||||
|
} finally {
|
||||||
|
println("In the Finally block")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun throwKeyword(): Int {
|
||||||
|
val message = "Welcome to Kotlin Tutorials"
|
||||||
|
if (message.length > 10) throw IllegalArgumentException("String is invalid")
|
||||||
|
else return message.length
|
||||||
|
}
|
||||||
|
|
||||||
|
fun throwExpression(): Int? {
|
||||||
|
val message: String? = null
|
||||||
|
return message?.length ?: throw IllegalArgumentException("String is null")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(IOException::class)
|
||||||
|
fun throwsAnnotation(): String?{
|
||||||
|
val filePath = null
|
||||||
|
return filePath ?: throw IOException("File path is invalid")
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
package com.baeldung.exceptionhandling
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.junit.jupiter.api.assertThrows
|
||||||
|
import java.io.IOException
|
||||||
|
import kotlin.test.assertNull
|
||||||
|
|
||||||
|
class ExceptionHandlingUnitTest {
|
||||||
|
|
||||||
|
private val classUnderTest: ExceptionHandling = ExceptionHandling()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenInvalidConversion_whenTryCatchUsed_thenReturnsCatchBlockValue(){
|
||||||
|
assertNull(classUnderTest.tryCatchBlock())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenInvalidConversion_whenTryCatchExpressionUsed_thenReturnsCatchBlockValue(){
|
||||||
|
assertNull(classUnderTest.tryCatchExpression())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenDivisionByZero_whenMultipleCatchUsed_thenReturnsCatchBlockValue(){
|
||||||
|
assertNull(classUnderTest.multipleCatchBlock())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenDivisionByZero_whenNestedTryCatchUsed_thenReturnsNestedCatchBlockValue(){
|
||||||
|
assertNull(classUnderTest.nestedTryCatchBlock())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenInvalidConversion_whenTryCatchFinallyUsed_thenReturnsCatchAndFinallyBlock(){
|
||||||
|
assertNull(classUnderTest.finallyBlock())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenIllegalArgument_whenThrowKeywordUsed_thenThrowsException(){
|
||||||
|
assertThrows<IllegalArgumentException> { classUnderTest.throwKeyword() }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun givenIllegalArgument_whenElvisExpressionUsed_thenThrowsException(){
|
||||||
|
assertThrows<IllegalArgumentException> { classUnderTest.throwExpression() }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun whenAnnotationUsed_thenThrowsException(){
|
||||||
|
assertThrows<IOException> { classUnderTest.throwsAnnotation() }
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,9 +4,6 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>guava-modules</artifactId>
|
<artifactId>guava-modules</artifactId>
|
||||||
<name>guava-modules</name>
|
<name>guava-modules</name>
|
||||||
<properties>
|
|
||||||
<junit-jupiter.version>5.6.2</junit-jupiter.version>
|
|
||||||
</properties>
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
|
@ -30,6 +27,11 @@
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>${guava.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter</artifactId>
|
<artifactId>junit-jupiter</artifactId>
|
||||||
|
@ -54,4 +56,9 @@
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<junit-jupiter.version>5.6.2</junit-jupiter.version>
|
||||||
|
<guava.version>29.0-jre</guava.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -2,18 +2,19 @@
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
|
||||||
<version>2.3.0.RELEASE</version>
|
|
||||||
<relativePath/> <!-- lookup parent from repository -->
|
|
||||||
</parent>
|
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>hexagonal-architecture</artifactId>
|
<artifactId>hexagonal-architecture</artifactId>
|
||||||
<version>1.0</version>
|
<version>1.0</version>
|
||||||
<name>hexagonal-architecture</name>
|
<name>hexagonal-architecture</name>
|
||||||
<description>Project for hexagonal architecture in java</description>
|
<description>Project for hexagonal architecture in java</description>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-boot-2</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<relativePath>../../parent-boot-2</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
|
@ -11,7 +11,7 @@ import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
class EmployeeServiceImplTest {
|
class EmployeeServiceImplUnitTest {
|
||||||
|
|
||||||
private EmployeeRepository employeeRepository;
|
private EmployeeRepository employeeRepository;
|
||||||
private EmployeeService testService;
|
private EmployeeService testService;
|
|
@ -57,6 +57,8 @@ public class PhoneNumberType implements UserType {
|
||||||
|
|
||||||
if (Objects.isNull(value)) {
|
if (Objects.isNull(value)) {
|
||||||
st.setNull(index, Types.INTEGER);
|
st.setNull(index, Types.INTEGER);
|
||||||
|
st.setNull(index+1, Types.INTEGER);
|
||||||
|
st.setNull(index+2, Types.INTEGER);
|
||||||
} else {
|
} else {
|
||||||
PhoneNumber employeeNumber = (PhoneNumber) value;
|
PhoneNumber employeeNumber = (PhoneNumber) value;
|
||||||
st.setInt(index,employeeNumber.getCountryCode());
|
st.setInt(index,employeeNumber.getCountryCode());
|
||||||
|
|
|
@ -59,11 +59,12 @@
|
||||||
<module>spring-data-elasticsearch</module>
|
<module>spring-data-elasticsearch</module>
|
||||||
<module>spring-data-gemfire</module>
|
<module>spring-data-gemfire</module>
|
||||||
<module>spring-data-geode</module>
|
<module>spring-data-geode</module>
|
||||||
<module>spring-data-jpa</module>
|
<module>spring-data-jpa-annotations</module>
|
||||||
<module>spring-data-jpa-2</module>
|
<module>spring-data-jpa-crud</module>
|
||||||
<module>spring-data-jpa-3</module>
|
<module>spring-data-jpa-enterprise</module>
|
||||||
<module>spring-data-jpa-4</module>
|
<module>spring-data-jpa-filtering</module>
|
||||||
<module>spring-data-jpa-5</module>
|
<module>spring-data-jpa-query</module>
|
||||||
|
<module>spring-data-jpa-repo</module>
|
||||||
<module>spring-data-keyvalue</module>
|
<module>spring-data-keyvalue</module>
|
||||||
<module>spring-data-mongodb</module>
|
<module>spring-data-mongodb</module>
|
||||||
<module>spring-data-neo4j</module>
|
<module>spring-data-neo4j</module>
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
### Relevant Articles:
|
|
||||||
- [Spring Data JPA – Derived Delete Methods](https://www.baeldung.com/spring-data-jpa-deleteby)
|
|
||||||
- [JPA Join Types](https://www.baeldung.com/jpa-join-types)
|
|
||||||
- [Case Insensitive Queries with Spring Data Repository](https://www.baeldung.com/spring-data-case-insensitive-queries)
|
|
||||||
- [The Exists Query in Spring Data](https://www.baeldung.com/spring-data-exists-query)
|
|
||||||
- [Spring Data JPA Repository Populators](https://www.baeldung.com/spring-data-jpa-repository-populators)
|
|
||||||
- [Spring Data JPA and Null Parameters](https://www.baeldung.com/spring-data-jpa-null-parameters)
|
|
||||||
- [Spring Data JPA Projections](https://www.baeldung.com/spring-data-jpa-projections)
|
|
||||||
- [JPA @Embedded And @Embeddable](https://www.baeldung.com/jpa-embedded-embeddable)
|
|
||||||
- [Spring Data JPA Delete and Relationships](https://www.baeldung.com/spring-data-jpa-delete)
|
|
||||||
- [Spring Data JPA and Named Entity Graphs](https://www.baeldung.com/spring-data-jpa-named-entity-graphs)
|
|
||||||
- [Customizing the Result of JPA Queries with Aggregation Functions](https://www.baeldung.com/jpa-queries-custom-result-with-aggregation-functions)
|
|
|
@ -1,42 +0,0 @@
|
||||||
package com.baeldung.model;
|
|
||||||
|
|
||||||
import javax.persistence.*;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "users")
|
|
||||||
public class BasicUser {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
private String username;
|
|
||||||
|
|
||||||
@ElementCollection
|
|
||||||
private Set<String> permissions;
|
|
||||||
|
|
||||||
public Long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Long id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUsername() {
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUsername(String username) {
|
|
||||||
this.username = username;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getPermissions() {
|
|
||||||
return permissions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPermissions(Set<String> permissions) {
|
|
||||||
this.permissions = permissions;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
package com.baeldung.multipledb.dao.product;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.springframework.data.domain.Pageable;
|
|
||||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
|
||||||
|
|
||||||
import com.baeldung.multipledb.model.product.Product;
|
|
||||||
|
|
||||||
public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> {
|
|
||||||
|
|
||||||
List<Product> findAllByPrice(double price, Pageable pageable);
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
package com.baeldung.repository;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
|
|
||||||
import com.baeldung.model.BasicUser;
|
|
||||||
|
|
||||||
public interface UserRepository extends JpaRepository<BasicUser, Long> {
|
|
||||||
|
|
||||||
Optional<BasicUser> findSummaryByUsername(String username);
|
|
||||||
|
|
||||||
Optional<BasicUser> findByUsername(String username);
|
|
||||||
}
|
|
|
@ -1,142 +0,0 @@
|
||||||
package com.baeldung.multipledb;
|
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
|
||||||
import static org.hamcrest.Matchers.hasSize;
|
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.data.domain.Page;
|
|
||||||
import org.springframework.data.domain.PageRequest;
|
|
||||||
import org.springframework.data.domain.Pageable;
|
|
||||||
import org.springframework.data.domain.Sort;
|
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import com.baeldung.multipledb.dao.product.ProductRepository;
|
|
||||||
import com.baeldung.multipledb.model.product.Product;
|
|
||||||
|
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
@SpringBootTest(classes=MultipleDbApplication.class)
|
|
||||||
@EnableTransactionManagement
|
|
||||||
public class ProductRepositoryIntegrationTest {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private ProductRepository productRepository;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
@Transactional("productTransactionManager")
|
|
||||||
public void setUp() {
|
|
||||||
productRepository.save(Product.from(1001, "Book", 21));
|
|
||||||
productRepository.save(Product.from(1002, "Coffee", 10));
|
|
||||||
productRepository.save(Product.from(1003, "Jeans", 30));
|
|
||||||
productRepository.save(Product.from(1004, "Shirt", 32));
|
|
||||||
productRepository.save(Product.from(1005, "Bacon", 10));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenRequestingFirstPageOfSizeTwo_ThenReturnFirstPage() {
|
|
||||||
Pageable pageRequest = PageRequest.of(0, 2);
|
|
||||||
|
|
||||||
Page<Product> result = productRepository.findAll(pageRequest);
|
|
||||||
|
|
||||||
assertThat(result.getContent(), hasSize(2));
|
|
||||||
assertTrue(result.stream()
|
|
||||||
.map(Product::getId)
|
|
||||||
.allMatch(id -> Arrays.asList(1001, 1002)
|
|
||||||
.contains(id)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenRequestingSecondPageOfSizeTwo_ThenReturnSecondPage() {
|
|
||||||
Pageable pageRequest = PageRequest.of(1, 2);
|
|
||||||
|
|
||||||
Page<Product> result = productRepository.findAll(pageRequest);
|
|
||||||
|
|
||||||
assertThat(result.getContent(), hasSize(2));
|
|
||||||
assertTrue(result.stream()
|
|
||||||
.map(Product::getId)
|
|
||||||
.allMatch(id -> Arrays.asList(1003, 1004)
|
|
||||||
.contains(id)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenRequestingLastPage_ThenReturnLastPageWithRemData() {
|
|
||||||
Pageable pageRequest = PageRequest.of(2, 2);
|
|
||||||
|
|
||||||
Page<Product> result = productRepository.findAll(pageRequest);
|
|
||||||
|
|
||||||
assertThat(result.getContent(), hasSize(1));
|
|
||||||
assertTrue(result.stream()
|
|
||||||
.map(Product::getId)
|
|
||||||
.allMatch(id -> Arrays.asList(1005)
|
|
||||||
.contains(id)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSortingByNameAscAndPaging_ThenReturnSortedPagedResult() {
|
|
||||||
Pageable pageRequest = PageRequest.of(0, 3, Sort.by("name"));
|
|
||||||
|
|
||||||
Page<Product> result = productRepository.findAll(pageRequest);
|
|
||||||
|
|
||||||
assertThat(result.getContent(), hasSize(3));
|
|
||||||
assertThat(result.getContent()
|
|
||||||
.stream()
|
|
||||||
.map(Product::getId)
|
|
||||||
.collect(Collectors.toList()), equalTo(Arrays.asList(1005, 1001, 1002)));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSortingByPriceDescAndPaging_ThenReturnSortedPagedResult() {
|
|
||||||
Pageable pageRequest = PageRequest.of(0, 3, Sort.by("price")
|
|
||||||
.descending());
|
|
||||||
|
|
||||||
Page<Product> result = productRepository.findAll(pageRequest);
|
|
||||||
|
|
||||||
assertThat(result.getContent(), hasSize(3));
|
|
||||||
assertThat(result.getContent()
|
|
||||||
.stream()
|
|
||||||
.map(Product::getId)
|
|
||||||
.collect(Collectors.toList()), equalTo(Arrays.asList(1004, 1003, 1001)));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSortingByPriceDescAndNameAscAndPaging_ThenReturnSortedPagedResult() {
|
|
||||||
Pageable pageRequest = PageRequest.of(0, 5, Sort.by("price")
|
|
||||||
.descending()
|
|
||||||
.and(Sort.by("name")));
|
|
||||||
|
|
||||||
Page<Product> result = productRepository.findAll(pageRequest);
|
|
||||||
|
|
||||||
assertThat(result.getContent(), hasSize(5));
|
|
||||||
assertThat(result.getContent()
|
|
||||||
.stream()
|
|
||||||
.map(Product::getId)
|
|
||||||
.collect(Collectors.toList()), equalTo(Arrays.asList(1004, 1003, 1001, 1005, 1002)));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenRequestingFirstPageOfSizeTwoUsingCustomMethod_ThenReturnFirstPage() {
|
|
||||||
Pageable pageRequest = PageRequest.of(0, 2);
|
|
||||||
|
|
||||||
List<Product> result = productRepository.findAllByPrice(10, pageRequest);
|
|
||||||
|
|
||||||
assertThat(result, hasSize(2));
|
|
||||||
assertTrue(result.stream()
|
|
||||||
.map(Product::getId)
|
|
||||||
.allMatch(id -> Arrays.asList(1002, 1005)
|
|
||||||
.contains(id)));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
# configuration for test containers testing
|
|
||||||
spring.datasource.url=${DB_URL}
|
|
||||||
spring.datasource.username=${DB_USERNAME}
|
|
||||||
spring.datasource.password=${DB_PASSWORD}
|
|
|
@ -1,4 +0,0 @@
|
||||||
# configuration for Test Containers testing
|
|
||||||
spring.datasource.driver-class-name=org.postgresql.Driver
|
|
||||||
spring.jpa.hibernate.ddl-auto=create-drop
|
|
||||||
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
|
|
|
@ -1,2 +0,0 @@
|
||||||
create table PERSON (ID int8 not null, FIRST_NAME varchar(255), LAST_NAME varchar(255), primary key (ID))
|
|
||||||
create table person (id int8 not null, first_name varchar(255), last_name varchar(255), primary key (id))
|
|
|
@ -1,15 +0,0 @@
|
||||||
### Relevant Articles:
|
|
||||||
|
|
||||||
- [Spring JPA @Embedded and @EmbeddedId](https://www.baeldung.com/spring-jpa-embedded-method-parameters)
|
|
||||||
- [Generate Database Schema with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-generate-db-schema)
|
|
||||||
- [Partial Data Update with Spring Data](https://www.baeldung.com/spring-data-partial-update)
|
|
||||||
|
|
||||||
### Eclipse Config
|
|
||||||
After importing the project into Eclipse, you may see the following error:
|
|
||||||
"No persistence xml file found in project"
|
|
||||||
|
|
||||||
This can be ignored:
|
|
||||||
- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
|
|
||||||
Or:
|
|
||||||
- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
## Spring Data JPA - Annotations
|
||||||
|
|
||||||
|
This module contains articles about annotations used in Spring Data JPA
|
||||||
|
|
||||||
|
### Relevant articles
|
||||||
|
|
||||||
|
- [Spring Data Annotations](https://www.baeldung.com/spring-data-annotations)
|
||||||
|
- [DDD Aggregates and @DomainEvents](https://www.baeldung.com/spring-data-ddd)
|
||||||
|
- [JPA @Embedded And @Embeddable](https://www.baeldung.com/jpa-embedded-embeddable)
|
||||||
|
- [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation)
|
||||||
|
- [Spring JPA @Embedded and @EmbeddedId](https://www.baeldung.com/spring-jpa-embedded-method-parameters)
|
||||||
|
- [Programmatic Transaction Management in Spring](https://www.baeldung.com/spring-programmatic-transaction-management)
|
||||||
|
- [JPA Entity Lifecycle Events](https://www.baeldung.com/jpa-entity-lifecycle-events)
|
||||||
|
|
||||||
|
### Eclipse Config
|
||||||
|
After importing the project into Eclipse, you may see the following error:
|
||||||
|
"No persistence xml file found in project"
|
||||||
|
|
||||||
|
This can be ignored:
|
||||||
|
- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
|
||||||
|
Or:
|
||||||
|
- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
<?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-data-jpa-annotations</artifactId>
|
||||||
|
<name>spring-data-jpa-annotations</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-boot-2</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<relativePath>../../parent-boot-2</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-ehcache</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-envers</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Test containers only dependencies -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>postgresql</artifactId>
|
||||||
|
<version>${testcontainers.postgresql.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.postgresql</groupId>
|
||||||
|
<artifactId>postgresql</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<!-- Test containers only dependencies -->
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.security</groupId>
|
||||||
|
<artifactId>spring-security-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>${guava.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<start-class>com.baeldung.boot.Application</start-class>
|
||||||
|
<testcontainers.postgresql.version>1.10.6</testcontainers.postgresql.version>
|
||||||
|
<postgresql.version>42.2.5</postgresql.version>
|
||||||
|
<guava.version>21.0</guava.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
|
@ -1,14 +1,15 @@
|
||||||
|
## Spring Data JPA - CRUD
|
||||||
|
|
||||||
|
This module contains articles about CRUD operations in Spring Data JPA
|
||||||
|
|
||||||
### Relevant Articles:
|
### Relevant Articles:
|
||||||
- [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results)
|
- [Spring Data JPA – Derived Delete Methods](https://www.baeldung.com/spring-data-jpa-deleteby)
|
||||||
- [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting)
|
- [Spring Data JPA Delete and Relationships](https://www.baeldung.com/spring-data-jpa-delete)
|
||||||
- [INSERT Statement in JPA](https://www.baeldung.com/jpa-insert)
|
- [INSERT Statement in JPA](https://www.baeldung.com/jpa-insert)
|
||||||
- [Pagination and Sorting using Spring Data JPA](https://www.baeldung.com/spring-data-jpa-pagination-sorting)
|
|
||||||
- [Spring Data JPA Query by Example](https://www.baeldung.com/spring-data-query-by-example)
|
|
||||||
- [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test)
|
|
||||||
- [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation)
|
|
||||||
- [Spring Data JPA Batch Inserts](https://www.baeldung.com/spring-data-jpa-batch-inserts)
|
- [Spring Data JPA Batch Inserts](https://www.baeldung.com/spring-data-jpa-batch-inserts)
|
||||||
- [Batch Insert/Update with Hibernate/JPA](https://www.baeldung.com/jpa-hibernate-batch-insert-update)
|
- [Batch Insert/Update with Hibernate/JPA](https://www.baeldung.com/jpa-hibernate-batch-insert-update)
|
||||||
- [Difference Between save() and saveAndFlush() in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-save-saveandflush)
|
- [Difference Between save() and saveAndFlush() in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-save-saveandflush)
|
||||||
|
- [Generate Database Schema with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-generate-db-schema)
|
||||||
|
|
||||||
### Eclipse Config
|
### Eclipse Config
|
||||||
After importing the project into Eclipse, you may see the following error:
|
After importing the project into Eclipse, you may see the following error:
|
|
@ -4,8 +4,8 @@
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
|
||||||
http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>spring-data-jpa-3</artifactId>
|
<artifactId>spring-data-jpa-crud</artifactId>
|
||||||
<name>spring-data-jpa-3</name>
|
<name>spring-data-jpa-crud</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
|
@ -0,0 +1,14 @@
|
||||||
|
spring.main.allow-bean-definition-overriding=true
|
||||||
|
|
||||||
|
spring.jpa.properties.hibernate.jdbc.batch_size=4
|
||||||
|
spring.jpa.properties.hibernate.order_inserts=true
|
||||||
|
spring.jpa.properties.hibernate.order_updates=true
|
||||||
|
spring.jpa.properties.hibernate.generate_statistics=true
|
||||||
|
|
||||||
|
# JPA-Schema-Generation
|
||||||
|
# Use below configuration to generate database schema create commands based on the entity models
|
||||||
|
# and export them into the create.sql file
|
||||||
|
#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
|
||||||
|
#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql
|
||||||
|
#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata
|
||||||
|
#spring.jpa.properties.hibernate.format_sql=true
|
|
@ -1,12 +1,17 @@
|
||||||
|
## Spring Data JPA - Enterprise
|
||||||
|
|
||||||
|
This module contains articles about Spring Data JPA used in enterprise applications such as transactions, sessions, naming conventions and more
|
||||||
|
|
||||||
### Relevant Articles:
|
### Relevant Articles:
|
||||||
- [Derived Query Methods in Spring Data JPA Repositories](https://www.baeldung.com/spring-data-derived-queries)
|
|
||||||
- [LIKE Queries in Spring JPA Repositories](https://www.baeldung.com/spring-jpa-like-queries)
|
- [Spring JPA – Multiple Databases](https://www.baeldung.com/spring-data-jpa-multiple-databases)
|
||||||
|
- [Spring Data Java 8 Support](https://www.baeldung.com/spring-data-java-8)
|
||||||
|
- [Pagination and Sorting using Spring Data JPA](https://www.baeldung.com/spring-data-jpa-pagination-sorting)
|
||||||
|
- [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test)
|
||||||
- [A Guide to Spring’s Open Session In View](https://www.baeldung.com/spring-open-session-in-view)
|
- [A Guide to Spring’s Open Session In View](https://www.baeldung.com/spring-open-session-in-view)
|
||||||
- [Programmatic Transaction Management in Spring](https://www.baeldung.com/spring-programmatic-transaction-management)
|
|
||||||
- [JPA Entity Lifecycle Events](https://www.baeldung.com/jpa-entity-lifecycle-events)
|
|
||||||
- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections)
|
- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections)
|
||||||
- [Calling Stored Procedures from Spring Data JPA Repositories](https://www.baeldung.com/spring-data-jpa-stored-procedures)
|
|
||||||
- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming)
|
- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming)
|
||||||
|
- [Partial Data Update with Spring Data](https://www.baeldung.com/spring-data-partial-update)
|
||||||
|
|
||||||
### Eclipse Config
|
### Eclipse Config
|
||||||
After importing the project into Eclipse, you may see the following error:
|
After importing the project into Eclipse, you may see the following error:
|
||||||
|
@ -16,3 +21,4 @@ This can be ignored:
|
||||||
- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
|
- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
|
||||||
Or:
|
Or:
|
||||||
- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator
|
- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
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>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>spring-data-jpa-5</artifactId>
|
<artifactId>spring-data-jpa-enterprise</artifactId>
|
||||||
<name>spring-data-jpa-5</name>
|
<name>spring-data-jpa-enterprise</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
|
@ -38,14 +38,39 @@
|
||||||
<groupId>com.h2database</groupId>
|
<groupId>com.h2database</groupId>
|
||||||
<artifactId>h2</artifactId>
|
<artifactId>h2</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-envers</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>${guava.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mapstruct</groupId>
|
<groupId>org.mapstruct</groupId>
|
||||||
<artifactId>mapstruct-jdk8</artifactId>
|
<artifactId>mapstruct-jdk8</artifactId>
|
||||||
<version>${mapstruct.version}</version>
|
<version>${mapstruct.version}</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.security</groupId>
|
||||||
|
<artifactId>spring-security-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Test containers only dependencies -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>postgresql</artifactId>
|
||||||
|
<version>${testcontainers.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<!-- Test containers only dependencies -->
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -75,6 +100,8 @@
|
||||||
<spring-geode-starter-version>1.1.1.RELEASE</spring-geode-starter-version>
|
<spring-geode-starter-version>1.1.1.RELEASE</spring-geode-starter-version>
|
||||||
<spring.boot.starter.version>2.1.9.RELEASE</spring.boot.starter.version>
|
<spring.boot.starter.version>2.1.9.RELEASE</spring.boot.starter.version>
|
||||||
<mapstruct.version>1.3.1.Final</mapstruct.version>
|
<mapstruct.version>1.3.1.Final</mapstruct.version>
|
||||||
|
<guava.version>21.0</guava.version>
|
||||||
|
<testcontainers.version>1.12.2</testcontainers.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -1,14 +1,13 @@
|
||||||
package com.baeldung.multipledb;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
public class MultipleDbApplication {
|
public class Application {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication.run(MultipleDbApplication.class, args);
|
SpringApplication.run(Application.class, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.boot;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.domain.EntityScan;
|
||||||
|
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableJpaRepositories("com.baeldung")
|
||||||
|
@EntityScan("com.baeldung")
|
||||||
|
public class Application {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(Application.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue