diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnType.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnType.java index 60c86bf1e..abe87099c 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnType.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnType.java @@ -159,8 +159,21 @@ public interface ColumnType { * @return */ static CassandraColumnType mapOf(CassandraColumnType keyType, CassandraColumnType valueType) { + return ColumnType.mapOf(keyType, valueType, false); + } + + /** + * Creates a Map {@link CassandraColumnType} given its {@link CassandraColumnType key and value types}. + * + * @param keyType must not be {@literal null}. + * @param valueType must not be {@literal null}. + * @param frozen + * @return + * @since 3.2.4 + */ + static CassandraColumnType mapOf(CassandraColumnType keyType, CassandraColumnType valueType, boolean frozen) { return new DefaultCassandraColumnType(ClassTypeInformation.MAP, - () -> DataTypes.mapOf(keyType.getDataType(), valueType.getDataType()), keyType, valueType); + () -> DataTypes.mapOf(keyType.getDataType(), valueType.getDataType(), frozen), keyType, valueType); } /** diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnTypeResolver.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnTypeResolver.java index 2d8ecea16..0d5b78e2f 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnTypeResolver.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/DefaultColumnTypeResolver.java @@ -410,7 +410,7 @@ class DefaultColumnTypeResolver implements ColumnTypeResolver { FrozenIndicator frozenValue = frozen.getFrozen(1); return ColumnType.mapOf(resolve(typeInformation.getRequiredComponentType(), frozenKey), - resolve(typeInformation.getRequiredMapValueType(), frozenValue)); + resolve(typeInformation.getRequiredMapValueType(), frozenValue), frozen.isFrozen()); } CassandraPersistentEntity persistentEntity = mappingContext.getPersistentEntity(typeInformation); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolverUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolverUnitTests.java index 6606dca1d..8295cff1a 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolverUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/ColumnTypeResolverUnitTests.java @@ -260,6 +260,18 @@ public class ColumnTypeResolverUnitTests { .describedAs("The element type should be frozen").isTrue(); } + @Test // GH-1148 + void frozenMapProperty() { + + BasicCassandraPersistentEntity entity = mappingContext.getRequiredPersistentEntity(Person.class); + + DataType dataType = resolver.resolve(entity.getRequiredPersistentProperty("frozenMap")).getDataType(); + + assertThat(dataType).isInstanceOf(MapType.class); + assertThat(((MapType) dataType).isFrozen()).isTrue(); + assertThat(dataType.asCql(true, false)).isEqualTo("frozen>"); + } + @Test // DATACASS-465 void mapPropertyWithFrozenAnnotationOnKey() { @@ -345,6 +357,8 @@ public class ColumnTypeResolverUnitTests { @Frozen Set frozenSet; Set<@Frozen MyUdt> frozenSetContent; + @Frozen Map frozenMap; + Map<@Frozen MyUdt, MyUdt> frozenMapKey; Map frozenMapValue;