From a60b2c48cfb4b6fc9e1f1b60af6b28b9960850e7 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 6 May 2021 09:09:02 +0200 Subject: [PATCH] PrimaryKeyClass can now subclass other types than Object. We dropped the requirement that composite keys may only subclass Object to allow usage with other superclasses such as Java records. Closes #1126 --- .../mapping/PrimaryKeyClassEntityMetadataVerifier.java | 8 +------- ...PrimaryKeyClassEntityMetadataVerifierUnitTests.java | 10 ++-------- src/main/asciidoc/reference/mapping.adoc | 2 +- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/PrimaryKeyClassEntityMetadataVerifier.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/PrimaryKeyClassEntityMetadataVerifier.java index 871d62e3d..468bcb0fb 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/PrimaryKeyClassEntityMetadataVerifier.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/PrimaryKeyClassEntityMetadataVerifier.java @@ -62,12 +62,6 @@ public class PrimaryKeyClassEntityMetadataVerifier implements CassandraPersisten Table.class.getSimpleName(), PrimaryKeyClass.class.getSimpleName()))); } - // Ensure PrimaryKeyClass only extends Object - if (!entityType.getSuperclass().equals(Object.class)) { - exceptions.add( - new MappingException(String.format("@%s must only extend Object", PrimaryKeyClass.class.getSimpleName()))); - } - entity.forEach(property -> { if (property.isCompositePrimaryKey()) { compositePrimaryKeys.add(property); @@ -93,7 +87,7 @@ public class PrimaryKeyClassEntityMetadataVerifier implements CassandraPersisten entity.getType().getName(), PrimaryKeyColumn.class.getSimpleName()))); } - // At least one of the PrimaryKeyColumns must have a type PARTIONED + // At least one of the PrimaryKeyColumns must have a type PARTITIONED if (partitionKeyColumns.isEmpty()) { exceptions .add(new MappingException(String.format("At least one of the @%s annotations must have a type of PARTITIONED", diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/PrimaryKeyClassEntityMetadataVerifierUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/PrimaryKeyClassEntityMetadataVerifierUnitTests.java index 5d91aab8f..4f5260ca7 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/PrimaryKeyClassEntityMetadataVerifierUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/PrimaryKeyClassEntityMetadataVerifierUnitTests.java @@ -131,15 +131,9 @@ class PrimaryKeyClassEntityMetadataVerifierUnitTests { } } - @Test // DATACASS-258 - void shouldFailForPrimaryKeyDerivedFromOtherThanObject() { - - try { + @Test // DATACASS-258, #1126 + void shouldAllowPrimaryKeyDerivedFromOtherThanObject() { verifier.verify(getEntity(SubclassPK.class)); - fail("Missing MappingException"); - } catch (MappingException e) { - assertThat(e).hasMessageContaining("@PrimaryKeyClass must only extend Object"); - } } @Test // DATACASS-213 diff --git a/src/main/asciidoc/reference/mapping.adoc b/src/main/asciidoc/reference/mapping.adoc index 8ef3a5899..e96c6008f 100644 --- a/src/main/asciidoc/reference/mapping.adoc +++ b/src/main/asciidoc/reference/mapping.adoc @@ -312,7 +312,7 @@ include::../{example-root}/LoginEvent.java[tags=class] ==== Primary Key Class A primary key class is a composite primary key class that is mapped to multiple fields or properties of the entity. -It is annotated with `@PrimaryKeyClass` and must define `equals` and `hashCode` methods. +It is annotated with `@PrimaryKeyClass` and should define `equals` and `hashCode` methods. The semantics of value equality for these methods should be consistent with the database equality for the database types to which the key is mapped. Primary key classes can be used with repositories (as the `Id` type) and to represent an entity's identity in a single complex object. The following example shows a composite primary key class: