Skip to content

Commit 6a39630

Browse files
authored
BAEL-5323: Merge sources into existing persistence module (eugenp#11804)
* BAEL-5323: Spring Boot with multiple data sources * BAEL-5323: small fixes * BAEL-5323: fix test class * BAEL-5323: Refactor configuration classes * BAEL-5323: Set proeprty to private * BAEL-5323: rename test class to follow naming conventions * BAEL-5323: merge sources into existing persistence module * BAEL-5323: merge sources into existing persistence module
1 parent e366a75 commit 6a39630

19 files changed

+324
-13
lines changed

.local-db/todos.mv.db

20 KB
Binary file not shown.

.local-db/topics.mv.db

16 KB
Binary file not shown.

persistence-modules/spring-data-jdbc/pom.xml

+9-1
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,19 @@
2121
<groupId>org.springframework.boot</groupId>
2222
<artifactId>spring-boot-starter-data-jdbc</artifactId>
2323
</dependency>
24+
<dependency>
25+
<groupId>org.springframework.boot</groupId>
26+
<artifactId>spring-boot-starter-data-jpa</artifactId>
27+
</dependency>
2428
<dependency>
2529
<groupId>com.h2database</groupId>
2630
<artifactId>h2</artifactId>
2731
<scope>runtime</scope>
2832
</dependency>
33+
<dependency>
34+
<groupId>org.springframework.boot</groupId>
35+
<artifactId>spring-boot-starter-test</artifactId>
36+
</dependency>
2937
</dependencies>
3038

31-
</project>
39+
</project>

persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/Application.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package com.baeldung.springdatajdbcintro;
22

3-
import java.util.Optional;
4-
3+
import ch.qos.logback.classic.Logger;
4+
import com.baeldung.springdatajdbcintro.entity.Person;
5+
import com.baeldung.springdatajdbcintro.repository.PersonRepository;
56
import org.slf4j.LoggerFactory;
67
import org.springframework.beans.factory.annotation.Autowired;
78
import org.springframework.boot.CommandLineRunner;
89
import org.springframework.boot.SpringApplication;
910
import org.springframework.boot.autoconfigure.SpringBootApplication;
11+
import org.springframework.core.env.AbstractEnvironment;
1012

11-
import com.baeldung.springdatajdbcintro.entity.Person;
12-
import com.baeldung.springdatajdbcintro.repository.PersonRepository;
13-
14-
import ch.qos.logback.classic.Logger;
13+
import java.util.Optional;
1514

1615
@SpringBootApplication
1716
public class Application implements CommandLineRunner {
@@ -24,6 +23,7 @@ public class Application implements CommandLineRunner {
2423
private DatabaseSeeder dbSeeder;
2524

2625
public static void main(String[] args) {
26+
System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "jdbcintro");
2727
SpringApplication.run(Application.class, args);
2828
}
2929

persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/entity/Person.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.baeldung.springdatajdbcintro.entity;
22

33
import org.springframework.data.annotation.Id;
4+
import org.springframework.data.relational.core.mapping.Table;
45

6+
@Table
57
public class Person {
68

79
@Id

persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.baeldung.springdatajdbcintro.entity.Person;
44
import org.springframework.data.jdbc.repository.query.Modifying;
55
import org.springframework.data.jdbc.repository.query.Query;
6+
import org.springframework.data.jpa.repository.JpaRepository;
67
import org.springframework.data.repository.CrudRepository;
78
import org.springframework.data.repository.query.Param;
89
import org.springframework.stereotype.Repository;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.baeldung.springmultipledatasources;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.core.env.AbstractEnvironment;
6+
7+
@SpringBootApplication
8+
public class Application {
9+
10+
public static void main(String[] args) {
11+
System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "multipledatasources");
12+
SpringApplication.run(Application.class, args);
13+
}
14+
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.baeldung.springmultipledatasources.todos;
2+
3+
import javax.persistence.Entity;
4+
import javax.persistence.GeneratedValue;
5+
import javax.persistence.GenerationType;
6+
import javax.persistence.Id;
7+
8+
@Entity
9+
public class Todo {
10+
11+
@Id
12+
@GeneratedValue(strategy = GenerationType.AUTO)
13+
private Long id;
14+
private String title;
15+
private boolean completed;
16+
17+
public Todo() {
18+
}
19+
20+
public Todo(String title) {
21+
this.title = title;
22+
}
23+
24+
public Long getId() {
25+
return id;
26+
}
27+
28+
public void setId(Long id) {
29+
this.id = id;
30+
}
31+
32+
public String getTitle() {
33+
return title;
34+
}
35+
36+
public void setTitle(String title) {
37+
this.title = title;
38+
}
39+
40+
public boolean isCompleted() {
41+
return completed;
42+
}
43+
44+
public void setCompleted(boolean completed) {
45+
this.completed = completed;
46+
}
47+
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.baeldung.springmultipledatasources.todos;
2+
3+
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
4+
import org.springframework.boot.context.properties.ConfigurationProperties;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.context.annotation.Primary;
8+
9+
import javax.sql.DataSource;
10+
11+
@Configuration
12+
public class TodoDatasourceConfiguration {
13+
14+
@Bean
15+
@ConfigurationProperties("spring.datasource.todos")
16+
public DataSourceProperties todosDataSourceProperties() {
17+
return new DataSourceProperties();
18+
}
19+
20+
@Bean
21+
@Primary
22+
public DataSource todosDataSource() {
23+
return todosDataSourceProperties()
24+
.initializeDataSourceBuilder()
25+
.build();
26+
}
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.baeldung.springmultipledatasources.todos;
2+
3+
import org.springframework.beans.factory.annotation.Qualifier;
4+
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
8+
import org.springframework.orm.jpa.JpaTransactionManager;
9+
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
10+
import org.springframework.transaction.PlatformTransactionManager;
11+
import org.springframework.transaction.annotation.EnableTransactionManagement;
12+
13+
import javax.sql.DataSource;
14+
import java.util.Objects;
15+
16+
@Configuration
17+
@EnableTransactionManagement
18+
@EnableJpaRepositories(
19+
basePackageClasses = Todo.class,
20+
entityManagerFactoryRef = "todosEntityManagerFactory",
21+
transactionManagerRef = "todosTransactionManager"
22+
)
23+
public class TodoJpaConfiguration {
24+
25+
@Bean
26+
public LocalContainerEntityManagerFactoryBean todosEntityManagerFactory(
27+
@Qualifier("todosDataSource") DataSource dataSource,
28+
EntityManagerFactoryBuilder builder) {
29+
return builder
30+
.dataSource(dataSource)
31+
.packages(Todo.class)
32+
.build();
33+
}
34+
35+
@Bean
36+
public PlatformTransactionManager todosTransactionManager(
37+
@Qualifier("todosEntityManagerFactory") LocalContainerEntityManagerFactoryBean todosEntityManagerFactory) {
38+
return new JpaTransactionManager(Objects.requireNonNull(todosEntityManagerFactory.getObject()));
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.baeldung.springmultipledatasources.todos;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
public interface TodoRepository extends JpaRepository<Todo, Long> {
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.baeldung.springmultipledatasources.topics;
2+
3+
import javax.persistence.Entity;
4+
import javax.persistence.GeneratedValue;
5+
import javax.persistence.GenerationType;
6+
import javax.persistence.Id;
7+
8+
@Entity
9+
public class Topic {
10+
11+
@Id
12+
@GeneratedValue(strategy = GenerationType.AUTO)
13+
private Long id;
14+
private String title;
15+
16+
public Topic() {
17+
}
18+
19+
public Topic(String title) {
20+
this.title = title;
21+
}
22+
23+
public Long getId() {
24+
return id;
25+
}
26+
27+
public void setId(Long id) {
28+
this.id = id;
29+
}
30+
31+
public String getTitle() {
32+
return title;
33+
}
34+
35+
public void setTitle(String title) {
36+
this.title = title;
37+
}
38+
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.springmultipledatasources.topics;
2+
3+
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
4+
import org.springframework.boot.context.properties.ConfigurationProperties;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
8+
import javax.sql.DataSource;
9+
10+
@Configuration
11+
public class TopicDatasourceConfiguration {
12+
13+
@Bean
14+
@ConfigurationProperties("spring.datasource.topics")
15+
public DataSourceProperties topicsDataSourceProperties() {
16+
return new DataSourceProperties();
17+
}
18+
19+
@Bean
20+
public DataSource topicsDataSource() {
21+
return topicsDataSourceProperties()
22+
.initializeDataSourceBuilder()
23+
.build();
24+
}
25+
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.baeldung.springmultipledatasources.topics;
2+
3+
import org.springframework.beans.factory.annotation.Qualifier;
4+
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
8+
import org.springframework.orm.jpa.JpaTransactionManager;
9+
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
10+
import org.springframework.transaction.PlatformTransactionManager;
11+
import org.springframework.transaction.annotation.EnableTransactionManagement;
12+
13+
import javax.sql.DataSource;
14+
import java.util.Objects;
15+
16+
@Configuration
17+
@EnableTransactionManagement
18+
@EnableJpaRepositories(
19+
basePackageClasses = Topic.class,
20+
entityManagerFactoryRef = "topicsEntityManagerFactory",
21+
transactionManagerRef = "topicsTransactionManager"
22+
)
23+
public class TopicJpaConfiguration {
24+
25+
@Bean
26+
public LocalContainerEntityManagerFactoryBean topicsEntityManagerFactory(
27+
@Qualifier("topicsDataSource") DataSource dataSource,
28+
EntityManagerFactoryBuilder builder
29+
) {
30+
return builder
31+
.dataSource(dataSource)
32+
.packages(Topic.class)
33+
.build();
34+
}
35+
36+
@Bean
37+
public PlatformTransactionManager topicsTransactionManager(
38+
@Qualifier("topicsEntityManagerFactory") LocalContainerEntityManagerFactoryBean topicsEntityManagerFactory) {
39+
return new JpaTransactionManager(Objects.requireNonNull(topicsEntityManagerFactory.getObject()));
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.baeldung.springmultipledatasources.topics;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
public interface TopicRepository extends JpaRepository<Topic, Long> {
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#H2 DB
2+
spring.jpa.hibernate.ddl-auto=none
3+
spring.datasource.url=jdbc:h2:mem:persondb
4+
spring.datasource.driverClassName=org.h2.Driver
5+
spring.datasource.username=sa
6+
spring.datasource.password=test
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
spring.jpa.hibernate.ddl-auto=update
2+
spring.datasource.todos.url=jdbc:h2:mem:todos
3+
spring.datasource.todos.username=sa
4+
spring.datasource.todos.password=null
5+
spring.datasource.todos.driverClassName=org.h2.Driver
6+
spring.datasource.topics.url=jdbc:h2:mem:topics
7+
spring.datasource.topics.username=sa
8+
spring.datasource.topics.password=null
9+
spring.datasource.topics.driverClassName=org.h2.Driver
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
11
#H2 DB
2-
spring.jpa.hibernate.ddl-auto=none
32
spring.h2.console.enabled=true
4-
spring.datasource.url=jdbc:h2:mem:persondb
5-
spring.datasource.driverClassName=org.h2.Driver
6-
spring.datasource.username=sa
7-
spring.datasource.password=test
8-
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
3+
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.baeldung.springmultipledatasources;
2+
3+
import com.baeldung.springmultipledatasources.todos.Todo;
4+
import com.baeldung.springmultipledatasources.todos.TodoRepository;
5+
import com.baeldung.springmultipledatasources.topics.Topic;
6+
import com.baeldung.springmultipledatasources.topics.TopicRepository;
7+
import org.junit.jupiter.api.Test;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
10+
import org.springframework.test.context.ActiveProfiles;
11+
12+
import java.util.Optional;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
16+
@ActiveProfiles("multipledatasources")
17+
@DataJpaTest // no test database!
18+
class MultipleDatasourcesIntegrationTest {
19+
20+
@Autowired
21+
TodoRepository todoRepo;
22+
@Autowired
23+
TopicRepository topicRepo;
24+
25+
@Test
26+
void shouldSaveTodoToTodoDB() {
27+
Todo todo = new Todo("test");
28+
Todo saved =todoRepo.save(todo);
29+
Optional<Todo> result= todoRepo.findById(saved.getId());
30+
assertThat(result).isPresent();
31+
}
32+
33+
@Test
34+
void shouldSaveTopicToTopicDB() {
35+
Topic todo = new Topic("test");
36+
Topic saved =topicRepo.save(todo);
37+
Optional<Topic> result= topicRepo.findById(saved.getId());
38+
assertThat(result).isPresent();
39+
}
40+
41+
}

0 commit comments

Comments
 (0)