#563 - Adapts JDBC examples to changes in Spring Data JDBC 2.0.

Since SQL Identifiers are now quoted letter casing must be taken into consideration when specifying column names in `@Column` or similar.
Disabled Liquibase which isn't used/configured at all and therefore doesn't work.
Moved application context configurations to use `AbstractJdbcConfiguration`.
This commit is contained in:
Jens Schauder
2020-05-12 08:44:46 +02:00
parent 913a44dcd9
commit 038ac0a932
8 changed files with 39 additions and 23 deletions

View File

@@ -25,21 +25,26 @@ import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import org.springframework.data.jdbc.repository.config.JdbcConfiguration;
import org.springframework.data.relational.core.mapping.event.BeforeSaveEvent;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.lang.Nullable;
import javax.sql.DataSource;
/**
* @author Jens Schauder
* @author Mark Paluch
*/
@Configuration
@EnableJdbcRepositories
public class AggregateConfiguration extends JdbcConfiguration {
public class AggregateConfiguration extends AbstractJdbcConfiguration {
final AtomicInteger id = new AtomicInteger(0);
@@ -93,4 +98,18 @@ public class AggregateConfiguration extends JdbcConfiguration {
public NamedParameterJdbcTemplate namedParameterJdbcTemplate(JdbcOperations operations) {
return new NamedParameterJdbcTemplate(operations);
}
@Bean
DataSourceInitializer initializer(DataSource dataSource) {
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
ClassPathResource script = new ClassPathResource("schema.sql");
ResourceDatabasePopulator populator = new ResourceDatabasePopulator(script);
initializer.setDatabasePopulator(populator);
return initializer;
}
}

View File

@@ -18,7 +18,7 @@ package example.springdata.jdbc.basics.aggregate;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Wither;
import lombok.With;
import java.time.Period;
import java.time.temporal.ChronoUnit;
@@ -30,6 +30,7 @@ import org.springframework.data.annotation.AccessType.Type;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.MappedCollection;
/**
* A Lego Set consisting of multiple Blocks and a manual
@@ -49,12 +50,12 @@ public class LegoSet {
* Since Manuals are part of a {@link LegoSet} and only make sense inside a {@link LegoSet} it is considered part of
* the Aggregate.
*/
@Column("handbuch_id")
@Column("HANDBUCH_ID")
private Manual manual;
// You can build multiple models from one LegoSet
@Column(keyColumn = "name")
private final @AccessType(Type.FIELD) @Wither(AccessLevel.PACKAGE) Map<String, Model> models;
@MappedCollection(keyColumn = "NAME")
private final @AccessType(Type.FIELD) @With(AccessLevel.PACKAGE) Map<String, Model> models;
LegoSet() {
this.models = new HashMap<>();
@@ -62,7 +63,7 @@ public class LegoSet {
// conversion for custom types currently has to be done through getters/setter + marking the underlying property with
// @Transient.
@Column("min_age")
@Column("MIN_AGE")
public int getIntMinimumAge() {
return toInt(this.minimumAge);
}
@@ -71,7 +72,7 @@ public class LegoSet {
minimumAge = toPeriod(years);
}
@Column("max_age")
@Column("MAX_AGE")
public int getIntMaximumAge() {
return toInt(this.maximumAge);
}

View File

@@ -27,10 +27,10 @@ import org.springframework.data.relational.core.mapping.Table;
* @author Jens Schauder
*/
@Data
@Table("handbuch")
@Table("HANDBUCH")
public class Manual {
@Column("handbuch_id")
@Column("HANDBUCH_ID")
private @Id Long id;
private String author, text;

View File

@@ -17,7 +17,7 @@ package example.springdata.jdbc.basics.aggregate;
import lombok.AccessLevel;
import lombok.Value;
import lombok.experimental.Wither;
import lombok.With;
/**
* One of potentially multiple models that can be build from a single {@link LegoSet}. No getters or setters needed.
@@ -25,7 +25,7 @@ import lombok.experimental.Wither;
* @author Jens Schauder
*/
@Value
@Wither(AccessLevel.PACKAGE)
@With(AccessLevel.PACKAGE)
public class Model {
String name, description;
}

View File

@@ -27,7 +27,7 @@ import org.assertj.core.groups.Tuple;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureJdbc;
import org.springframework.boot.test.autoconfigure.data.jdbc.AutoConfigureDataJdbc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringRunner;
@@ -39,7 +39,7 @@ import org.springframework.test.context.junit4.SpringRunner;
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AggregateConfiguration.class)
@AutoConfigureJdbc
@AutoConfigureDataJdbc
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
public class AggregateTests {

View File

@@ -21,14 +21,10 @@ import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultDSLContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import org.springframework.data.jdbc.repository.config.JdbcConfiguration;
import org.springframework.data.relational.core.mapping.event.RelationalEvent;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
/**
@@ -42,8 +38,7 @@ import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
*/
@Configuration
@EnableJdbcRepositories
@Import(JdbcConfiguration.class)
public class CategoryConfiguration {
public class CategoryConfiguration extends AbstractJdbcConfiguration {
@Autowired private DataSource dataSource;

View File

@@ -1,2 +1,3 @@
logging.level.org.springframework.data=INFO
logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
spring.liquibase.enabled=false

View File

@@ -20,7 +20,7 @@
<module>bom</module>
<!-- <module>couchbase</module> -->
<module>elasticsearch</module>
<!-- <module>jdbc</module> -->
<module>jdbc</module>
<module>jpa</module>
<module>ldap</module>
<module>map</module>