- Notifications
You must be signed in to change notification settings - Fork 310
Closed
Labels
status: duplicateA duplicate of another issueA duplicate of another issuetype: bugA general bugA general bug
Milestone
Description
Ben Simms opened DATACASS-225 and commented
Currently it is not possible to save an entity that contains a collection of user-defined types if you explicitly put the type argument <UDTValue> on the field. For example:
Cassandra Schema:
CREATE KEYSPACE IF NOT EXISTS runtime WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 }; USE runtime; CREATE TYPE IF NOT EXISTS asset ( asset_id bigint, asset_name text ); CREATE TABLE IF NOT EXISTS customer ( key uuid primary key, assets set<FROZEN<asset>>, );
Spring Data Entity:
@Table("customer") public class CustomerEntity implements Serializable { private static final long serialVersionUID = 1L; @PrimaryKey("key") private UUID key; @Column("assets") private Set<UDTValue> assets = new HashSet<>(); // omitting getters/setters/equals/etc }
Spring Data Repository:
public interface CassandraCustomerRepository extends CassandraRepository<CustomerEntity> { }
Test to reproduce bug:
@RunWith(SpringJUnit4ClassRunner.class) public class CassandraCustomerRepositoryTest extends RuntimeEventsTestBase { @Inject private CassandraCustomerRepository repository; @Inject private CassandraTemplate cassandraTemplate; @Test public void testUdtValueBug() { KeyspaceMetadata keyspaceMetadata = cassandraTemplate.getSession().getCluster().getMetadata().getKeyspace("runtime"); UDTValue asset = keyspaceMetadata.getUserType("asset").newValue(); asset.setLong("asset_id", 1L); asset.setString("asset_name", "Asset 1"); CustomerEntity customer = new CustomerEntity(); customer.setKey(UUID.randomUUID()); customer.getAssets().add(asset); repository.save(customer); } }
Stacktrace:
Error creating bean with name 'cassandraCustomerRepository': Invocation of init method failed; nested exception is org.springframework.data.cassandra.mapping.VerifierMappingExceptions: com.datastax.driver.core.DataType: Cassandra entities must have the @Table, @Persistent or @PrimaryKeyClass Annotation at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:743) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125) at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60) at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:109) at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:261) at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:68) at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:86) ... 38 more Caused by: org.springframework.data.cassandra.mapping.VerifierMappingExceptions: com.datastax.driver.core.DataType: Cassandra entities must have the @Table, @Persistent or @PrimaryKeyClass Annotation at org.springframework.data.cassandra.mapping.BasicCassandraPersistentEntityMetadataVerifier.verify(BasicCassandraPersistentEntityMetadataVerifier.java:45) at org.springframework.data.cassandra.mapping.BasicCassandraPersistentEntity.verify(BasicCassandraPersistentEntity.java:198) at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:297) at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:469) at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:426) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:607) at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:294) at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:469) at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:426) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:607) at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:294) at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:469) at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:426) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:607) at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:294) at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.createAndRegisterProperty(AbstractMappingContext.java:469) at org.springframework.data.mapping.context.AbstractMappingContext$PersistentPropertyCreator.doWith(AbstractMappingContext.java:426) at org.springframework.util.ReflectionUtils.doWithFields(ReflectionUtils.java:607) at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:294) at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:180) at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:140) at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:67) at org.springframework.data.cassandra.repository.support.CassandraRepositoryFactory.getEntityInformation(CassandraRepositoryFactory.java:85) at org.springframework.data.cassandra.repository.support.CassandraRepositoryFactory.getTargetRepository(CassandraRepositoryFactory.java:75) at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:170) at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239) at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225) at org.springframework.data.cassandra.repository.support.CassandraRepositoryFactoryBean.afterPropertiesSet(CassandraRepositoryFactoryBean.java:61) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562) ... 53 more
If the field is changed to just be an un-typed Set without the <UDTValue> parameter:
@Column("assets") private Set assets = new HashSet();
then this will work, but it would be ideal to be able to provide the proper type arguments to all fields
Affects: 1.2 GA (Fowler), 1.3 M1 (Gosling)
Issue Links:
- DATACASS-172 Add support for User-defined types
Metadata
Metadata
Assignees
Labels
status: duplicateA duplicate of another issueA duplicate of another issuetype: bugA general bugA general bug