Offer a proper replacement for NamingStrategy.INSTANCE.

Closes #1350
This commit is contained in:
Jens Schauder
2022-10-07 15:57:51 +02:00
parent 795e244511
commit 6bdc7db24b
9 changed files with 31 additions and 18 deletions

View File

@@ -44,6 +44,7 @@ import org.springframework.data.mapping.model.SimpleTypeHolder;
import org.springframework.data.relational.RelationalManagedTypes;
import org.springframework.data.relational.core.conversion.RelationalConverter;
import org.springframework.data.relational.core.dialect.Dialect;
import org.springframework.data.relational.core.mapping.DefaultNamingStrategy;
import org.springframework.data.relational.core.mapping.NamingStrategy;
import org.springframework.data.relational.core.mapping.Table;
import org.springframework.data.util.TypeScanner;
@@ -100,7 +101,7 @@ public class AbstractJdbcConfiguration implements ApplicationContextAware {
/**
* Register a {@link JdbcMappingContext} and apply an optional {@link NamingStrategy}.
*
* @param namingStrategy optional {@link NamingStrategy}. Use {@link NamingStrategy#INSTANCE} as fallback.
* @param namingStrategy optional {@link NamingStrategy}. Use {@link org.springframework.data.relational.core.mapping.DefaultNamingStrategy#INSTANCE} as fallback.
* @param customConversions see {@link #jdbcCustomConversions()}.
* @param jdbcManagedTypes JDBC managed types, typically discovered through {@link #jdbcManagedTypes() an entity
* scan}.
@@ -110,7 +111,7 @@ public class AbstractJdbcConfiguration implements ApplicationContextAware {
public JdbcMappingContext jdbcMappingContext(Optional<NamingStrategy> namingStrategy,
JdbcCustomConversions customConversions, RelationalManagedTypes jdbcManagedTypes) {
JdbcMappingContext mappingContext = new JdbcMappingContext(namingStrategy.orElse(NamingStrategy.INSTANCE));
JdbcMappingContext mappingContext = new JdbcMappingContext(namingStrategy.orElse(DefaultNamingStrategy.INSTANCE));
mappingContext.setSimpleTypeHolder(customConversions.getSimpleTypeHolder());
mappingContext.setManagedTypes(jdbcManagedTypes);

View File

@@ -42,7 +42,6 @@ import org.springframework.data.jdbc.core.convert.RelationResolver;
import org.springframework.data.mapping.callback.EntityCallbacks;
import org.springframework.data.relational.core.conversion.MutableAggregateChange;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.NamingStrategy;
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
import org.springframework.data.relational.core.mapping.event.AfterConvertCallback;
import org.springframework.data.relational.core.mapping.event.AfterDeleteCallback;
@@ -72,7 +71,7 @@ public class JdbcAggregateTemplateUnitTests {
@BeforeEach
public void setUp() {
RelationalMappingContext mappingContext = new RelationalMappingContext(NamingStrategy.INSTANCE);
RelationalMappingContext mappingContext = new RelationalMappingContext();
JdbcConverter converter = new BasicJdbcConverter(mappingContext, relationResolver);
template = new JdbcAggregateTemplate(eventPublisher, mappingContext, converter, dataAccessStrategy);

View File

@@ -54,6 +54,7 @@ import org.springframework.data.annotation.Transient;
import org.springframework.data.jdbc.core.mapping.AggregateReference;
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
import org.springframework.data.mapping.PersistentPropertyPath;
import org.springframework.data.relational.core.mapping.DefaultNamingStrategy;
import org.springframework.data.relational.core.mapping.Embedded;
import org.springframework.data.relational.core.mapping.Embedded.OnEmpty;
import org.springframework.data.relational.core.mapping.NamingStrategy;
@@ -847,7 +848,7 @@ public class EntityRowMapperUnitTests {
}
private <T> EntityRowMapper<T> createRowMapper(Class<T> type) {
return createRowMapper(type, NamingStrategy.INSTANCE);
return createRowMapper(type, DefaultNamingStrategy.INSTANCE);
}
@SuppressWarnings("unchecked")

View File

@@ -26,6 +26,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.data.annotation.Id;
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
import org.springframework.data.relational.core.mapping.DefaultNamingStrategy;
import org.springframework.data.relational.core.mapping.NamingStrategy;
import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
@@ -36,9 +37,9 @@ import org.springframework.data.relational.core.mapping.RelationalPersistentEnti
* @author Jens Schauder
* @author Mark Paluch
*/
public class NamingStrategyUnitTests {
public class DefaultNamingStrategyUnitTests {
private final NamingStrategy target = NamingStrategy.INSTANCE;
private final NamingStrategy target = DefaultNamingStrategy.INSTANCE;
private final RelationalPersistentEntity<?> persistentEntity = //
new JdbcMappingContext(target).getRequiredPersistentEntity(DummyEntity.class);

View File

@@ -41,6 +41,7 @@ import org.springframework.data.jdbc.repository.config.DialectResolver;
import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactory;
import org.springframework.data.mapping.model.SimpleTypeHolder;
import org.springframework.data.relational.core.dialect.Dialect;
import org.springframework.data.relational.core.mapping.DefaultNamingStrategy;
import org.springframework.data.relational.core.mapping.NamingStrategy;
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
import org.springframework.data.repository.core.NamedQueries;
@@ -114,7 +115,7 @@ public class TestConfiguration {
@Bean
JdbcMappingContext jdbcMappingContext(Optional<NamingStrategy> namingStrategy, CustomConversions conversions) {
JdbcMappingContext mappingContext = new JdbcMappingContext(namingStrategy.orElse(NamingStrategy.INSTANCE));
JdbcMappingContext mappingContext = new JdbcMappingContext(namingStrategy.orElse(DefaultNamingStrategy.INSTANCE));
mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
return mappingContext;
}

View File

@@ -44,6 +44,7 @@ import org.springframework.data.r2dbc.dialect.R2dbcDialect;
import org.springframework.data.r2dbc.mapping.R2dbcMappingContext;
import org.springframework.data.relational.RelationalManagedTypes;
import org.springframework.data.relational.core.conversion.BasicRelationalConverter;
import org.springframework.data.relational.core.mapping.DefaultNamingStrategy;
import org.springframework.data.relational.core.mapping.NamingStrategy;
import org.springframework.data.relational.core.mapping.Table;
import org.springframework.data.util.TypeScanner;
@@ -57,6 +58,7 @@ import org.springframework.util.StringUtils;
* R2DBC to work.
*
* @author Mark Paluch
* @author Jens Schauder
* @see ConnectionFactory
* @see DatabaseClient
* @see org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories
@@ -161,7 +163,7 @@ public abstract class AbstractR2dbcConfiguration implements ApplicationContextAw
/**
* Register a {@link R2dbcMappingContext} and apply an optional {@link NamingStrategy}.
*
* @param namingStrategy optional {@link NamingStrategy}. Use {@link NamingStrategy#INSTANCE} as fallback.
* @param namingStrategy optional {@link NamingStrategy}. Use {@link DefaultNamingStrategy#INSTANCE} as fallback.
* @param r2dbcCustomConversions customized R2DBC conversions.
* @param r2dbcManagedTypes R2DBC managed types, typically discovered through {@link #r2dbcManagedTypes() an entity
* scan}.
@@ -174,7 +176,7 @@ public abstract class AbstractR2dbcConfiguration implements ApplicationContextAw
Assert.notNull(namingStrategy, "NamingStrategy must not be null");
R2dbcMappingContext context = new R2dbcMappingContext(namingStrategy.orElse(NamingStrategy.INSTANCE));
R2dbcMappingContext context = new R2dbcMappingContext(namingStrategy.orElse(DefaultNamingStrategy.INSTANCE));
context.setSimpleTypeHolder(r2dbcCustomConversions.getSimpleTypeHolder());
context.setManagedTypes(r2dbcManagedTypes);

View File

@@ -25,6 +25,19 @@ import org.springframework.util.Assert;
*/
public class DefaultNamingStrategy implements NamingStrategy {
/**
* Static immutable instance of the class. It is made immutable by letting
* {@link #setForeignKeyNaming(ForeignKeyNaming)} throw an exception.
* <p>
* Using this avoids creating essentially the same class over and over again.
*/
public static NamingStrategy INSTANCE = new DefaultNamingStrategy() {
@Override
public void setForeignKeyNaming(ForeignKeyNaming foreignKeyNaming) {
throw new UnsupportedOperationException("Cannot update immutable DefaultNamingStrategy");
}
};
private ForeignKeyNaming foreignKeyNaming = ForeignKeyNaming.APPLY_RENAMING;
public void setForeignKeyNaming(ForeignKeyNaming foreignKeyNaming) {

View File

@@ -41,12 +41,7 @@ public interface NamingStrategy {
*
* @deprecated use {@link DefaultNamingStrategy#INSTANCE} instead.
*/
@Deprecated(since = "2.4") NamingStrategy INSTANCE = new DefaultNamingStrategy() {
@Override
public void setForeignKeyNaming(ForeignKeyNaming foreignKeyNaming) {
throw new UnsupportedOperationException("Cannot update immutable DefaultNamingStrategy");
}
};
@Deprecated(since = "2.4", forRemoval = true) NamingStrategy INSTANCE = DefaultNamingStrategy.INSTANCE;
/**
* Defaults to no schema.

View File

@@ -31,9 +31,9 @@ import org.springframework.data.relational.core.mapping.RelationalPersistentEnti
* @author Oliver Gierke
* @author Jens Schauder
*/
public class NamingStrategyUnitTests {
public class DefaultNamingStrategyUnitTests {
private final NamingStrategy target = NamingStrategy.INSTANCE;
private final NamingStrategy target = DefaultNamingStrategy.INSTANCE;
private final RelationalMappingContext context = new RelationalMappingContext(target);
private final RelationalPersistentEntity<?> persistentEntity = context.getRequiredPersistentEntity(DummyEntity.class);