Skip to content

AnnotationBasedPersistentProperty.validateAnnotation(…) compares declared annotations with merged annotations #2368

Closed
@pcallahan-r7

Description

@pcallahan-r7

Declaring @table on a record class works fine, but @PrimaryKeyClass does not.

For instance:

    @PrimaryKeyClass
    record Key(
            @PrimaryKeyColumn(name = "a", ordinal = 0, type = PrimaryKeyType.PARTITIONED ) UUID a,
            @PrimaryKeyColumn(name = "b", ordinal = 1, type = PrimaryKeyType.PARTITIONED) String b,
            @PrimaryKeyColumn(name = "c", ordinal = 2, type = PrimaryKeyType.CLUSTERED) String c) {}

    @Table(value = "mytable")
    record SomeItem(@PrimaryKey Key id,
                                  ...) { }

throws this exception:

Caused by: org.springframework.data.mapping.MappingException: Ambiguous mapping! Annotation PrimaryKeyColumn configured on field customer and one of its accessor methods in class Key!
	at org.springframework.data.mapping.model.AnnotationBasedPersistentProperty.validateAnnotation(AnnotationBasedPersistentProperty.java:154) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at org.springframework.data.mapping.model.AnnotationBasedPersistentProperty.lambda$populateAnnotationCache$7(AnnotationBasedPersistentProperty.java:126) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[na:na]
	at org.springframework.data.mapping.model.AnnotationBasedPersistentProperty.populateAnnotationCache(AnnotationBasedPersistentProperty.java:120) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at org.springframework.data.mapping.model.AnnotationBasedPersistentProperty.<init>(AnnotationBasedPersistentProperty.java:88) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at org.springframework.data.cassandra.core.mapping.BasicCassandraPersistentProperty.<init>(BasicCassandraPersistentProperty.java:80) ~[spring-data-cassandra-3.1.5.jar:3.1.5]
	at org.springframework.data.cassandra.core.mapping.CachingCassandraPersistentProperty.<init>(CachingCassandraPersistentProperty.java:40) ~[spring-data-cassandra-3.1.5.jar:3.1.5]
	at org.springframework.data.cassandra.core.mapping.CassandraMappingContext.createPersistentProperty(CassandraMappingContext.java:403) ~[spring-data-cassandra-3.1.5.jar:3.1.5]
	at org.springframework.data.cassandra.core.mapping.CassandraMappingContext.createPersistentProperty(CassandraMappingContext.java:60) ~[spring-data-cassandra-3.1.5.jar:3.1.5]
	at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:543) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:521) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:708) ~[spring-core-5.3.4.jar:5.3.4]
	at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:384) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at org.springframework.data.cassandra.core.mapping.CassandraMappingContext.addPersistentEntity(CassandraMappingContext.java:337) ~[spring-data-cassandra-3.1.5.jar:3.1.5]
	at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:333) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
	at org.springframework.data.mapping.context.AbstractMappingContext.initialize(AbstractMappingContext.java:462) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at org.springframework.data.cassandra.core.mapping.CassandraMappingContext.initialize(CassandraMappingContext.java:117) ~[spring-data-cassandra-3.1.5.jar:3.1.5]
	at org.springframework.data.mapping.context.AbstractMappingContext.afterPropertiesSet(AbstractMappingContext.java:454) ~[spring-data-commons-2.4.5.jar:2.4.5]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845) ~[spring-beans-5.3.4.jar:5.3.4]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[spring-beans-5.3.4.jar:5.3.4]
	... 74 common frames omitted

Changing just the Key class to a regular class works fine:

    @PrimaryKeyClass
    class Key {
        @PrimaryKeyColumn(name = "a", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
        UUID   a;
        @PrimaryKeyColumn(name = "b", ordinal = 1, type = PrimaryKeyType.PARTITIONED)
        String b;
        @PrimaryKeyColumn(name = "c", ordinal = 2, type = PrimaryKeyType.CLUSTERED)
        String c;

        public Key(UUID a, String b, String c) {
            this.customer = a;
            this.appId = b;
            this.attackId = c;
        }
    }

    @Table(value = "mytable")
    record SomeItem(@PrimaryKey Key id,
                                  ...) { }

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions