diff --git a/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentProperty.java b/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentProperty.java index 63868dd27..a03d6a14f 100644 --- a/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentProperty.java +++ b/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentProperty.java @@ -26,12 +26,14 @@ import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.model.AnnotationBasedPersistentProperty; import org.springframework.data.mapping.model.Property; import org.springframework.data.mapping.model.SimpleTypeHolder; +import org.springframework.util.Assert; import org.springframework.util.ClassUtils; /** * Meta data about a property to be used by repository implementations. * * @author Jens Schauder + * @author Greg Turnquist * @since 2.0 */ public class BasicJdbcPersistentProperty extends AnnotationBasedPersistentProperty @@ -52,11 +54,15 @@ public class BasicJdbcPersistentProperty extends AnnotationBasedPersistentProper * @param property must not be {@literal null}. * @param owner must not be {@literal null}. * @param simpleTypeHolder must not be {@literal null}. - * @param context + * @param context must not be {@literal null} */ public BasicJdbcPersistentProperty(Property property, PersistentEntity owner, SimpleTypeHolder simpleTypeHolder, JdbcMappingContext context) { + super(property, owner, simpleTypeHolder); + + Assert.notNull(context, "context must not be null."); + this.context = context; } diff --git a/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcMappingContext.java b/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcMappingContext.java index 59cc8b0f8..0d8ae2d80 100644 --- a/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcMappingContext.java +++ b/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcMappingContext.java @@ -38,6 +38,7 @@ import org.springframework.data.util.TypeInformation; * {@link MappingContext} implementation for JDBC. * * @author Jens Schauder + * @author Greg Turnquist * @since 2.0 */ public class JdbcMappingContext extends AbstractMappingContext, JdbcPersistentProperty> { @@ -63,8 +64,6 @@ public class JdbcMappingContext extends AbstractMappingContext currentType = path == null ? rootType : PropertyPaths.getLeafType(path); JdbcPersistentEntity persistentEntity = getRequiredPersistentEntity(currentType); - String rootPrefix = path == null ? "" : path.toDotPath() + "."; - for (JdbcPersistentProperty property : persistentEntity) { if (property.isEntity()) { diff --git a/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcPersistentEntityImpl.java b/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcPersistentEntityImpl.java index 66a6b6220..97c7b6448 100644 --- a/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcPersistentEntityImpl.java +++ b/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcPersistentEntityImpl.java @@ -24,6 +24,7 @@ import org.springframework.data.util.TypeInformation; * Meta data a repository might need for implementing persistence operations for instances of type {@code T} * * @author Jens Schauder + * @author Greg Turnquist * @since 2.0 */ class JdbcPersistentEntityImpl extends BasicPersistentEntity diff --git a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java index e4f19ae7a..eacaa7a9a 100644 --- a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java +++ b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java @@ -31,6 +31,7 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; /** * @author Jens Schauder + * @author Greg Turnquist * @since 2.0 */ public class JdbcRepositoryFactory extends RepositoryFactorySupport { @@ -39,7 +40,8 @@ public class JdbcRepositoryFactory extends RepositoryFactorySupport { private final NamedParameterJdbcOperations jdbcOperations; private final ApplicationEventPublisher publisher; - public JdbcRepositoryFactory(NamedParameterJdbcOperations namedParameterJdbcOperations, ApplicationEventPublisher publisher, NamingStrategy namingStrategy) { + public JdbcRepositoryFactory(NamedParameterJdbcOperations namedParameterJdbcOperations, + ApplicationEventPublisher publisher, NamingStrategy namingStrategy) { this.jdbcOperations = namedParameterJdbcOperations; this.publisher = publisher; diff --git a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBean.java b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBean.java index 54bed46a6..91b2d2de5 100644 --- a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBean.java +++ b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBean.java @@ -38,6 +38,7 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; * repository factories via Spring configuration. * * @author Jens Schauder + * @author Greg Turnquist * @since 2.0 */ public class JdbcRepositoryFactoryBean, S, ID extends Serializable> // @@ -47,8 +48,6 @@ public class JdbcRepositoryFactoryBean, S, ID extend "No unique NamedParameterJdbcOperation could be found, " // + "nor JdbcOperations or DataSource to construct one from."; - private static final String NO_NAMING_STRATEGY_ERROR_MESSAGE = "No unique NamingStrategy could be found."; - private static final String NAMED_PARAMETER_JDBC_OPERATIONS_BEAN_NAME = "namedParameterJdbcTemplate"; private static final String JDBC_OPERATIONS_BEAN_NAME = "jdbcTemplate"; private static final String DATA_SOURCE_BEAN_NAME = "dataSource"; @@ -67,23 +66,21 @@ public class JdbcRepositoryFactoryBean, S, ID extend @Override protected RepositoryFactorySupport doCreateRepositoryFactory() { - return new JdbcRepositoryFactory(findOrCreateJdbcOperations(), applicationEventPublisher, findOrCreateNamingStrategy()); + return new JdbcRepositoryFactory(findOrCreateJdbcOperations(), applicationEventPublisher, + findOrCreateNamingStrategy()); } private NamedParameterJdbcOperations findOrCreateJdbcOperations() { - return Optionals - .firstNonEmpty( // - this::getNamedParameterJdbcOperations, // - () -> getJdbcOperations().map(NamedParameterJdbcTemplate::new), // - () -> getDataSource().map(NamedParameterJdbcTemplate::new)) // + return Optionals.firstNonEmpty( // + this::getNamedParameterJdbcOperations, // + () -> getJdbcOperations().map(NamedParameterJdbcTemplate::new), // + () -> getDataSource().map(NamedParameterJdbcTemplate::new)) // .orElseThrow(() -> new IllegalStateException(NO_NAMED_PARAMETER_JDBC_OPERATION_ERROR_MESSAGE)); } private NamingStrategy findOrCreateNamingStrategy() { - - return getNamingStrategy() - .orElse(new DefaultNamingStrategy()); + return getNamingStrategy().orElse(new DefaultNamingStrategy()); } private Optional getNamedParameterJdbcOperations() { diff --git a/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorContextBasedNamingStrategyUnitTests.java b/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorContextBasedNamingStrategyUnitTests.java index 95a6771db..36f05af19 100644 --- a/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorContextBasedNamingStrategyUnitTests.java +++ b/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorContextBasedNamingStrategyUnitTests.java @@ -191,6 +191,7 @@ public class SqlGeneratorContextBasedNamingStrategyUnitTests { return new SqlGenerator(context, persistentEntity, new SqlGeneratorSource(context)); } + @SuppressWarnings("unused") static class DummyEntity { @Id Long id; @@ -198,6 +199,7 @@ public class SqlGeneratorContextBasedNamingStrategyUnitTests { ReferencedEntity ref; } + @SuppressWarnings("unused") static class ReferencedEntity { @Id Long l1id; @@ -205,6 +207,7 @@ public class SqlGeneratorContextBasedNamingStrategyUnitTests { SecondLevelReferencedEntity further; } + @SuppressWarnings("unused") static class SecondLevelReferencedEntity { @Id Long l2id; diff --git a/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorFixedNamingStrategyUnitTests.java b/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorFixedNamingStrategyUnitTests.java index 29cecf745..3a9bf101c 100644 --- a/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorFixedNamingStrategyUnitTests.java +++ b/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorFixedNamingStrategyUnitTests.java @@ -28,10 +28,8 @@ import org.springframework.data.jdbc.mapping.model.NamingStrategy; import org.springframework.data.mapping.PropertyPath; /** - * Unit tests to a fixed {@link NamingStrategy} implementation containing a hard wired schema, table, and property prefix. - * - * NOTE: Due to the need to verify SQL generation and {@link SqlGenerator}'s package-private status suggests - * this unit test exist in this package, not {@literal org.springframework.data.jdbc.mappings.model}. + * Unit tests the {@link SqlGenerator} with a fixed {@link NamingStrategy} implementation containing a hard wired + * schema, table, and property prefix. * * @author Greg Turnquist */ @@ -61,7 +59,7 @@ public class SqlGeneratorFixedNamingStrategyUnitTests { public String getTableName(Class type) { return type.getSimpleName().toUpperCase(); } - + @Override public String getColumnName(JdbcPersistentProperty property) { return property.getName().toLowerCase(); @@ -77,12 +75,14 @@ public class SqlGeneratorFixedNamingStrategyUnitTests { SoftAssertions softAssertions = new SoftAssertions(); softAssertions.assertThat(sql) // - .startsWith("SELECT") // - .contains("FixedCustomSchema.FixedCustomTablePrefix_DummyEntity.FixedCustomPropertyPrefix_id AS FixedCustomPropertyPrefix_id,") // - .contains("FixedCustomSchema.FixedCustomTablePrefix_DummyEntity.FixedCustomPropertyPrefix_name AS FixedCustomPropertyPrefix_name,") // - .contains("ref.FixedCustomPropertyPrefix_l1id AS ref_FixedCustomPropertyPrefix_l1id") // - .contains("ref.FixedCustomPropertyPrefix_content AS ref_FixedCustomPropertyPrefix_content") // - .contains("FROM FixedCustomSchema.FixedCustomTablePrefix_DummyEntity"); + .startsWith("SELECT") // + .contains( + "FixedCustomSchema.FixedCustomTablePrefix_DummyEntity.FixedCustomPropertyPrefix_id AS FixedCustomPropertyPrefix_id,") // + .contains( + "FixedCustomSchema.FixedCustomTablePrefix_DummyEntity.FixedCustomPropertyPrefix_name AS FixedCustomPropertyPrefix_name,") // + .contains("ref.FixedCustomPropertyPrefix_l1id AS ref_FixedCustomPropertyPrefix_l1id") // + .contains("ref.FixedCustomPropertyPrefix_content AS ref_FixedCustomPropertyPrefix_content") // + .contains("FROM FixedCustomSchema.FixedCustomTablePrefix_DummyEntity"); softAssertions.assertAll(); } @@ -95,12 +95,12 @@ public class SqlGeneratorFixedNamingStrategyUnitTests { SoftAssertions softAssertions = new SoftAssertions(); softAssertions.assertThat(sql) // - .startsWith("SELECT") // - .contains("DUMMYENTITY.id AS id,") // - .contains("DUMMYENTITY.name AS name,") // - .contains("ref.l1id AS ref_l1id") // - .contains("ref.content AS ref_content") // - .contains("FROM DUMMYENTITY"); + .startsWith("SELECT") // + .contains("DUMMYENTITY.id AS id,") // + .contains("DUMMYENTITY.name AS name,") // + .contains("ref.l1id AS ref_l1id") // + .contains("ref.content AS ref_content") // + .contains("FROM DUMMYENTITY"); softAssertions.assertAll(); } @@ -111,8 +111,8 @@ public class SqlGeneratorFixedNamingStrategyUnitTests { String sql = sqlGenerator.createDeleteByPath(PropertyPath.from("ref", DummyEntity.class)); - assertThat(sql).isEqualTo("DELETE FROM FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity " + - "WHERE FixedCustomSchema.FixedCustomTablePrefix_DummyEntity = :rootId"); + assertThat(sql).isEqualTo("DELETE FROM FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity " + + "WHERE FixedCustomSchema.FixedCustomTablePrefix_DummyEntity = :rootId"); } @Test // DATAJDBC-107 @@ -122,12 +122,10 @@ public class SqlGeneratorFixedNamingStrategyUnitTests { String sql = sqlGenerator.createDeleteByPath(PropertyPath.from("ref.further", DummyEntity.class)); - assertThat(sql).isEqualTo( - "DELETE FROM FixedCustomSchema.FixedCustomTablePrefix_SecondLevelReferencedEntity " + - "WHERE FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity IN " + - "(SELECT FixedCustomPropertyPrefix_l1id " + - "FROM FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity " + - "WHERE FixedCustomSchema.FixedCustomTablePrefix_DummyEntity = :rootId)"); + assertThat(sql).isEqualTo("DELETE FROM FixedCustomSchema.FixedCustomTablePrefix_SecondLevelReferencedEntity " + + "WHERE FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity IN " + + "(SELECT FixedCustomPropertyPrefix_l1id " + "FROM FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity " + + "WHERE FixedCustomSchema.FixedCustomTablePrefix_DummyEntity = :rootId)"); } @Test // DATAJDBC-107 @@ -147,8 +145,8 @@ public class SqlGeneratorFixedNamingStrategyUnitTests { String sql = sqlGenerator.createDeleteAllSql(PropertyPath.from("ref", DummyEntity.class)); - assertThat(sql).isEqualTo("DELETE FROM FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity " + - "WHERE FixedCustomSchema.FixedCustomTablePrefix_DummyEntity IS NOT NULL"); + assertThat(sql).isEqualTo("DELETE FROM FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity " + + "WHERE FixedCustomSchema.FixedCustomTablePrefix_DummyEntity IS NOT NULL"); } @Test // DATAJDBC-107 @@ -158,12 +156,10 @@ public class SqlGeneratorFixedNamingStrategyUnitTests { String sql = sqlGenerator.createDeleteAllSql(PropertyPath.from("ref.further", DummyEntity.class)); - assertThat(sql).isEqualTo( - "DELETE FROM FixedCustomSchema.FixedCustomTablePrefix_SecondLevelReferencedEntity " + - "WHERE FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity IN " + - "(SELECT FixedCustomPropertyPrefix_l1id " + - "FROM FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity " + - "WHERE FixedCustomSchema.FixedCustomTablePrefix_DummyEntity IS NOT NULL)"); + assertThat(sql).isEqualTo("DELETE FROM FixedCustomSchema.FixedCustomTablePrefix_SecondLevelReferencedEntity " + + "WHERE FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity IN " + + "(SELECT FixedCustomPropertyPrefix_l1id " + "FROM FixedCustomSchema.FixedCustomTablePrefix_ReferencedEntity " + + "WHERE FixedCustomSchema.FixedCustomTablePrefix_DummyEntity IS NOT NULL)"); } /** diff --git a/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorUnitTests.java b/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorUnitTests.java index 0b9238dbf..8d5bddb65 100644 --- a/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorUnitTests.java +++ b/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorUnitTests.java @@ -31,20 +31,18 @@ import org.springframework.data.mapping.PropertyPath; * Unit tests for the {@link SqlGenerator}. * * @author Jens Schauder + * @author Greg Turnquist */ public class SqlGeneratorUnitTests { - private NamingStrategy namingStrategy; - private JdbcMappingContext context; - private JdbcPersistentEntity persistentEntity; private SqlGenerator sqlGenerator; @Before public void setUp() { - this.namingStrategy = new DefaultNamingStrategy(); - this.context = new JdbcMappingContext(namingStrategy); - this.persistentEntity = context.getRequiredPersistentEntity(DummyEntity.class); + NamingStrategy namingStrategy = new DefaultNamingStrategy(); + JdbcMappingContext context = new JdbcMappingContext(namingStrategy); + JdbcPersistentEntity persistentEntity = context.getRequiredPersistentEntity(DummyEntity.class); this.sqlGenerator = new SqlGenerator(context, persistentEntity, new SqlGeneratorSource(context)); } @@ -105,6 +103,7 @@ public class SqlGeneratorUnitTests { "DELETE FROM SecondLevelReferencedEntity WHERE ReferencedEntity IN (SELECT l1id FROM ReferencedEntity WHERE DummyEntity IS NOT NULL)"); } + @SuppressWarnings("unused") static class DummyEntity { @Id Long id; @@ -112,6 +111,7 @@ public class SqlGeneratorUnitTests { ReferencedEntity ref; } + @SuppressWarnings("unused") static class ReferencedEntity { @Id Long l1id; @@ -119,6 +119,7 @@ public class SqlGeneratorUnitTests { SecondLevelReferencedEntity further; } + @SuppressWarnings("unused") static class SecondLevelReferencedEntity { @Id Long l2id; diff --git a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java index 316a62141..232416631 100644 --- a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java +++ b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java @@ -47,6 +47,7 @@ import org.springframework.test.context.junit4.rules.SpringMethodRule; * Testing special cases for id generation with {@link SimpleJdbcRepository}. * * @author Jens Schauder + * @author Greg Turnquist */ @ContextConfiguration @EnableJdbcRepositories(considerNestedRepositories = true) @@ -131,8 +132,8 @@ public class JdbcRepositoryIdGenerationIntegrationTests { } /** - * {@link NamingStrategy} that harmlessly uppercases the table name, - * demonstrating how to inject one while not breaking existing SQL operations. + * {@link NamingStrategy} that harmlessly uppercases the table name, demonstrating how to inject one while not + * breaking existing SQL operations. */ @Bean NamingStrategy namingStrategy() { @@ -152,8 +153,8 @@ public class JdbcRepositoryIdGenerationIntegrationTests { @Bean ReadOnlyIdEntityRepository readOnlyIdRepository(DataSource db, NamingStrategy namingStrategy) { - return new JdbcRepositoryFactory(new NamedParameterJdbcTemplate(db), mock(ApplicationEventPublisher.class), namingStrategy) - .getRepository(ReadOnlyIdEntityRepository.class); + return new JdbcRepositoryFactory(new NamedParameterJdbcTemplate(db), mock(ApplicationEventPublisher.class), + namingStrategy).getRepository(ReadOnlyIdEntityRepository.class); } @Bean