From 000c7a66a3e90ea5c760fb2b184832097b8b76cc Mon Sep 17 00:00:00 2001 From: Torge Hamann <37174525+torge-hmn@users.noreply.github.com> Date: Sun, 17 Nov 2024 18:41:51 +0100 Subject: [PATCH 1/4] Add SQLite setup --- build.gradle.kts | 10 ++++ .../certassist/config/DatabaseConfig.java | 59 +++++++++++++++++++ src/main/resources/persistence.properties | 7 +++ 3 files changed, 76 insertions(+) create mode 100644 src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java create mode 100644 src/main/resources/persistence.properties diff --git a/build.gradle.kts b/build.gradle.kts index 7cf0fe9..7a8e435 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,14 +24,24 @@ repositories { } dependencies { + implementation("org.springframework.boot:spring-boot-autoconfigure") + implementation("org.springframework.boot:spring-boot-starter-jdbc") + implementation("org.xerial:sqlite-jdbc") + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.hibernate.orm:hibernate-community-dialects") + implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.flywaydb:flyway-core") + compileOnly("org.projectlombok:lombok") annotationProcessor("org.projectlombok:lombok") + testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.security:spring-security-test") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java b/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java new file mode 100644 index 0000000..38b0276 --- /dev/null +++ b/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java @@ -0,0 +1,59 @@ +package de.mlessmann.certassist.config; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; + +import javax.sql.DataSource; +import java.util.Objects; +import java.util.Properties; + +@Configuration +@RequiredArgsConstructor +//@EnableJpaRepositories(basePackages = "de.mlessmann.certassist.repositories") +@PropertySource("classpath:persistence.properties") +public class DatabaseConfig { + + final Environment env; + + @Bean + public DataSource dataSource() { + final DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(Objects.requireNonNull(env.getProperty("driverClassName"))); + dataSource.setUrl(Objects.requireNonNull(env.getProperty("url"))); + dataSource.setUsername(Objects.requireNonNull(env.getProperty("username"))); + dataSource.setPassword(Objects.requireNonNull(env.getProperty("password"))); + return dataSource; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); + entityManagerFactory.setDataSource(dataSource()); + //entityManagerFactory.setPackagesToScan("de.mlessmann.certassist.models"); + entityManagerFactory.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + entityManagerFactory.setJpaProperties(additionalProperties()); + return entityManagerFactory; + } + + final Properties additionalProperties() { + final Properties hibernateProperties = new Properties(); + if (env.getProperty("hibernate.hbm2ddl.auto") != null) { + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + } + if (env.getProperty("hibernate.dialect") != null) { + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + } + if (env.getProperty("hibernate.show_sql") != null) { + hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); + } + return hibernateProperties; + } + +} diff --git a/src/main/resources/persistence.properties b/src/main/resources/persistence.properties new file mode 100644 index 0000000..8ec0ea2 --- /dev/null +++ b/src/main/resources/persistence.properties @@ -0,0 +1,7 @@ +driverClassName=org.sqlite.JDBC +url=jdbc:sqlite:memory:myDb?cache=shared +username=admin +password=admin +spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect +hibernate.hbm2ddl.auto=create-drop +hibernate.show_sql=true \ No newline at end of file -- 2.45.3 From 29eb3b2a47c52e17fcd161d84cab64a4cdc49748 Mon Sep 17 00:00:00 2001 From: Torge Hamann <37174525+torge-hmn@users.noreply.github.com> Date: Sun, 17 Nov 2024 18:56:55 +0100 Subject: [PATCH 2/4] Add basic user entity and repository --- build.gradle.kts | 1 + .../certassist/config/DatabaseConfig.java | 21 +++++++++------- .../de/mlessmann/certassist/models/User.java | 20 ++++++++++++++++ .../repositories/UserRepository.java | 11 +++++++++ .../repositories/UserRepositoryTest.java | 24 +++++++++++++++++++ 5 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 src/main/java/de/mlessmann/certassist/models/User.java create mode 100644 src/main/java/de/mlessmann/certassist/repositories/UserRepository.java create mode 100644 src/test/java/de/mlessmann/certassist/repositories/UserRepositoryTest.java diff --git a/build.gradle.kts b/build.gradle.kts index 7a8e435..22e30f7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,6 +41,7 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.security:spring-security-test") + testImplementation("org.assertj:assertj-core") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java b/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java index 38b0276..af7669f 100644 --- a/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java +++ b/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java @@ -16,10 +16,14 @@ import java.util.Properties; @Configuration @RequiredArgsConstructor -//@EnableJpaRepositories(basePackages = "de.mlessmann.certassist.repositories") +@EnableJpaRepositories(basePackages = "de.mlessmann.certassist.repositories") @PropertySource("classpath:persistence.properties") public class DatabaseConfig { + private static final String HIBERNATE_DIALECT_PROPERTY = "hibernate.dialect"; + private static final String HIBERNATE_HBM_2_DDL_AUTO_PROPERTY = "hibernate.hbm2ddl.auto"; + private static final String HIBERNATE_SHOW_SQL_PROPERTY = "hibernate.show_sql"; + final Environment env; @Bean @@ -36,7 +40,7 @@ public class DatabaseConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); entityManagerFactory.setDataSource(dataSource()); - //entityManagerFactory.setPackagesToScan("de.mlessmann.certassist.models"); + entityManagerFactory.setPackagesToScan("de.mlessmann.certassist.models"); entityManagerFactory.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); entityManagerFactory.setJpaProperties(additionalProperties()); return entityManagerFactory; @@ -44,15 +48,16 @@ public class DatabaseConfig { final Properties additionalProperties() { final Properties hibernateProperties = new Properties(); - if (env.getProperty("hibernate.hbm2ddl.auto") != null) { - hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + if (env.getProperty(HIBERNATE_HBM_2_DDL_AUTO_PROPERTY) != null) { + hibernateProperties.setProperty(HIBERNATE_HBM_2_DDL_AUTO_PROPERTY, env.getProperty(HIBERNATE_HBM_2_DDL_AUTO_PROPERTY)); } - if (env.getProperty("hibernate.dialect") != null) { - hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + if (env.getProperty(HIBERNATE_DIALECT_PROPERTY) != null) { + hibernateProperties.setProperty(HIBERNATE_DIALECT_PROPERTY, env.getProperty(HIBERNATE_DIALECT_PROPERTY)); } - if (env.getProperty("hibernate.show_sql") != null) { - hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); + if (env.getProperty(HIBERNATE_SHOW_SQL_PROPERTY) != null) { + hibernateProperties.setProperty(HIBERNATE_SHOW_SQL_PROPERTY, env.getProperty(HIBERNATE_SHOW_SQL_PROPERTY)); } + return hibernateProperties; } diff --git a/src/main/java/de/mlessmann/certassist/models/User.java b/src/main/java/de/mlessmann/certassist/models/User.java new file mode 100644 index 0000000..78f77a4 --- /dev/null +++ b/src/main/java/de/mlessmann/certassist/models/User.java @@ -0,0 +1,20 @@ +package de.mlessmann.certassist.models; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private Long id; + + @Setter + private String username; +} diff --git a/src/main/java/de/mlessmann/certassist/repositories/UserRepository.java b/src/main/java/de/mlessmann/certassist/repositories/UserRepository.java new file mode 100644 index 0000000..4f12c8b --- /dev/null +++ b/src/main/java/de/mlessmann/certassist/repositories/UserRepository.java @@ -0,0 +1,11 @@ +package de.mlessmann.certassist.repositories; + +import de.mlessmann.certassist.models.User; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends CrudRepository { + + User findUserById(long id); +} diff --git a/src/test/java/de/mlessmann/certassist/repositories/UserRepositoryTest.java b/src/test/java/de/mlessmann/certassist/repositories/UserRepositoryTest.java new file mode 100644 index 0000000..0e6f342 --- /dev/null +++ b/src/test/java/de/mlessmann/certassist/repositories/UserRepositoryTest.java @@ -0,0 +1,24 @@ +package de.mlessmann.certassist.repositories; + +import de.mlessmann.certassist.models.User; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +class UserRepositoryTest { + + @Autowired + private UserRepository userRepository; + + @Test + void findUserById() { + final User user = new User(); + user.setUsername("test"); + userRepository.save(user); + + assertThat(userRepository.findUserById(user.getId()).getUsername()).isEqualTo("test"); + } +} -- 2.45.3 From c95c1008bdb6efe612646b70f7df892dcb272364 Mon Sep 17 00:00:00 2001 From: Torge Hamann <37174525+torge-hmn@users.noreply.github.com> Date: Sun, 17 Nov 2024 18:58:02 +0100 Subject: [PATCH 3/4] Adjust DB naming --- .gitignore | 3 +++ src/main/resources/persistence.properties | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c2065bc..5883108 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ out/ ### VS Code ### .vscode/ + +### SQLite DB ### +sqlLiteDb \ No newline at end of file diff --git a/src/main/resources/persistence.properties b/src/main/resources/persistence.properties index 8ec0ea2..182fcc8 100644 --- a/src/main/resources/persistence.properties +++ b/src/main/resources/persistence.properties @@ -1,5 +1,5 @@ driverClassName=org.sqlite.JDBC -url=jdbc:sqlite:memory:myDb?cache=shared +url=jdbc:sqlite:sqlLiteDb:database?cache=shared username=admin password=admin spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect -- 2.45.3 From 9edad195e6d7d4303bf24dd26058a74f710ca8b5 Mon Sep 17 00:00:00 2001 From: Torge Hamann <37174525+torge-hmn@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:09:13 +0100 Subject: [PATCH 4/4] Consolidate properties --- .../de/mlessmann/certassist/config/DatabaseConfig.java | 4 +--- src/main/resources/application.properties | 10 ++++++++++ src/main/resources/persistence.properties | 7 ------- 3 files changed, 11 insertions(+), 10 deletions(-) delete mode 100644 src/main/resources/persistence.properties diff --git a/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java b/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java index af7669f..64def67 100644 --- a/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java +++ b/src/main/java/de/mlessmann/certassist/config/DatabaseConfig.java @@ -3,7 +3,6 @@ package de.mlessmann.certassist.config; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.DriverManagerDataSource; @@ -17,7 +16,6 @@ import java.util.Properties; @Configuration @RequiredArgsConstructor @EnableJpaRepositories(basePackages = "de.mlessmann.certassist.repositories") -@PropertySource("classpath:persistence.properties") public class DatabaseConfig { private static final String HIBERNATE_DIALECT_PROPERTY = "hibernate.dialect"; @@ -46,7 +44,7 @@ public class DatabaseConfig { return entityManagerFactory; } - final Properties additionalProperties() { + private Properties additionalProperties() { final Properties hibernateProperties = new Properties(); if (env.getProperty(HIBERNATE_HBM_2_DDL_AUTO_PROPERTY) != null) { hibernateProperties.setProperty(HIBERNATE_HBM_2_DDL_AUTO_PROPERTY, env.getProperty(HIBERNATE_HBM_2_DDL_AUTO_PROPERTY)); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index caa3574..1b73bda 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,11 @@ +# General spring.application.name=home-cert-assistant +# Database +driverClassName=org.sqlite.JDBC +url=jdbc:sqlite:sqlLiteDb:database?cache=shared +username=admin +password=admin +spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect +#TODO: Use flyway for db setup +hibernate.hbm2ddl.auto=create-drop +hibernate.show_sql=true \ No newline at end of file diff --git a/src/main/resources/persistence.properties b/src/main/resources/persistence.properties deleted file mode 100644 index 182fcc8..0000000 --- a/src/main/resources/persistence.properties +++ /dev/null @@ -1,7 +0,0 @@ -driverClassName=org.sqlite.JDBC -url=jdbc:sqlite:sqlLiteDb:database?cache=shared -username=admin -password=admin -spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect -hibernate.hbm2ddl.auto=create-drop -hibernate.show_sql=true \ No newline at end of file -- 2.45.3