Skip to content

Conversation

kazuki43zoo
Copy link
Contributor

I've fixed DATAJDBC-204.

There are some notes as follow:

  • I've refered to classes provided by spring-data-jpa for fixing this
  • Does not work an interface based auditing because (probably) the Spring Data JDBC does not support the Optional property yet
  • No support a feature that depends on AspectJ because I cannot understand its feature

WDYT?

@kazuki43zoo
Copy link
Contributor Author

I've added test for nested bean and bean collection property. It does not work ...

  • nested bean work fine when bean instance is not null. But when bean instance is null, does not work
  • bean collection does not work always.

@kazuki43zoo
Copy link
Contributor Author

When nested bean is null, following exception is occurred.

org.springframework.data.mapping.MappingException: Cannot lookup property private org.springframework.data.jdbc.repository.config.EnableJdbcAuditingHsqlIntegrationTests$AuditingName org.springframework.data.jdbc.repository.config.EnableJdbcAuditingHsqlIntegrationTests$AuditingAnnotatedDummyEntity.name on null intermediate! Original path was: name.createdBy on org.springframework.data.jdbc.repository.config.EnableJdbcAuditingHsqlIntegrationTests$AuditingAnnotatedDummyEntity.

	at org.springframework.data.mapping.PersistentPropertyAccessor.setProperty(PersistentPropertyAccessor.java:66)
	at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.lambda$setCreatedBy$0(MappingAuditableBeanWrapperFactory.java:177)
	at java.lang.Iterable.forEach(Iterable.java:75)
	at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.setCreatedBy(MappingAuditableBeanWrapperFactory.java:177)
	at org.springframework.data.auditing.AuditingHandler.lambda$null$3(AuditingHandler.java:195)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.springframework.data.auditing.AuditingHandler.lambda$touchAuditor$6(AuditingHandler.java:195)
	at java.util.Optional.map(Optional.java:215)
	at org.springframework.data.auditing.AuditingHandler.touchAuditor(AuditingHandler.java:188)
	at org.springframework.data.auditing.AuditingHandler.lambda$touch$0(AuditingHandler.java:164)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.springframework.data.auditing.AuditingHandler.touch(AuditingHandler.java:162)
	at org.springframework.data.auditing.AuditingHandler.markCreated(AuditingHandler.java:132)
	at org.springframework.data.jdbc.domain.support.JdbcAuditingEventListener.lambda$onApplicationEvent$0(JdbcAuditingEventListener.java:68)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.springframework.data.jdbc.domain.support.JdbcAuditingEventListener.onApplicationEvent(JdbcAuditingEventListener.java:64)
	at org.springframework.data.jdbc.domain.support.JdbcAuditingEventListener.onApplicationEvent(JdbcAuditingEventListener.java:42)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:400)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:354)
	at org.springframework.data.jdbc.core.JdbcEntityTemplate.save(JdbcEntityTemplate.java:74)
	at org.springframework.data.jdbc.repository.SimpleJdbcRepository.save(SimpleJdbcRepository.java:54)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:359)
	at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:629)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:593)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:578)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
	at org.springframework.data.jdbc.repository.config.$Proxy34.save(Unknown Source)
	at org.springframework.data.jdbc.repository.config.EnableJdbcAuditingHsqlIntegrationTests.auditForAnnotatedEntity(EnableJdbcAuditingHsqlIntegrationTests.java:80)
...

@kazuki43zoo
Copy link
Contributor Author

When bean collection define, following exception is occurred.

java.lang.IllegalArgumentException: Target bean of type java.util.ArrayList is not of type of the persistent entity (org.springframework.data.jdbc.repository.config.EnableJdbcAuditingHsqlIntegrationTests$AuditingEmail)!

	at org.springframework.util.Assert.isTrue(Assert.java:134)
	at org.springframework.data.mapping.model.BasicPersistentEntity.getPropertyAccessor(BasicPersistentEntity.java:447)
	at org.springframework.data.mapping.PersistentPropertyAccessor.setProperty(PersistentPropertyAccessor.java:70)
	at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.lambda$setCreatedBy$0(MappingAuditableBeanWrapperFactory.java:177)
	at java.lang.Iterable.forEach(Iterable.java:75)
	at org.springframework.data.auditing.MappingAuditableBeanWrapperFactory$MappingMetadataAuditableBeanWrapper.setCreatedBy(MappingAuditableBeanWrapperFactory.java:177)
	at org.springframework.data.auditing.AuditingHandler.lambda$null$3(AuditingHandler.java:195)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.springframework.data.auditing.AuditingHandler.lambda$touchAuditor$6(AuditingHandler.java:195)
	at java.util.Optional.map(Optional.java:215)
	at org.springframework.data.auditing.AuditingHandler.touchAuditor(AuditingHandler.java:188)
	at org.springframework.data.auditing.AuditingHandler.lambda$touch$0(AuditingHandler.java:164)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.springframework.data.auditing.AuditingHandler.touch(AuditingHandler.java:162)
	at org.springframework.data.auditing.AuditingHandler.markCreated(AuditingHandler.java:132)
	at org.springframework.data.jdbc.domain.support.JdbcAuditingEventListener.lambda$onApplicationEvent$0(JdbcAuditingEventListener.java:68)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.springframework.data.jdbc.domain.support.JdbcAuditingEventListener.onApplicationEvent(JdbcAuditingEventListener.java:64)
	at org.springframework.data.jdbc.domain.support.JdbcAuditingEventListener.onApplicationEvent(JdbcAuditingEventListener.java:42)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:400)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:354)
	at org.springframework.data.jdbc.core.JdbcEntityTemplate.save(JdbcEntityTemplate.java:74)
	at org.springframework.data.jdbc.repository.SimpleJdbcRepository.save(SimpleJdbcRepository.java:54)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:359)
	at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:629)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:593)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:578)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
	at org.springframework.data.jdbc.repository.config.$Proxy34.save(Unknown Source)
	at org.springframework.data.jdbc.repository.config.EnableJdbcAuditingHsqlIntegrationTests.customizeEnableJdbcAuditingAttributes(EnableJdbcAuditingHsqlIntegrationTests.java:189)
...

@kazuki43zoo
Copy link
Contributor Author

@schauder Do you know something?

@kazuki43zoo
Copy link
Contributor Author

I've created related issues on spring-data-commons.

schauder pushed a commit that referenced this pull request Apr 17, 2018
When enabled by using @EnableJdbcAuditing entities will get properties annotated with

* @createdby
* @CreatedDate
* @LastModifiedBy
* @LastModifiedDate

updated when saved.

Original pull request: #64.
@schauder
Copy link
Contributor

I polished and merged the original commit since it is still valuable even when there are limitations with nested entities and the Auditable interface.

Thanks.

@schauder schauder closed this Apr 17, 2018
@kazuki43zoo kazuki43zoo deleted the DATAJDBC-204 branch April 17, 2018 11:51
@kazuki43zoo
Copy link
Contributor Author

thx!

mp911de added a commit that referenced this pull request Feb 21, 2022
We now support Criteria creation and mapping to express where conditions with a fluent API.

databaseClient.select().from("legoset")
  .where(Criteria.of("name").like("John%").and("id").lessThanOrEquals(42055));

databaseClient.delete()
  .from(LegoSet.class)
  .where(Criteria.of("id").is(42055))
  .then()

databaseClient.delete()
  .from(LegoSet.class)
  .where(Criteria.of("id").is(42055))
  .fetch()
  .rowsUpdated()

Original pull request: #106.
mp911de added a commit that referenced this pull request Feb 21, 2022
mp911de added a commit that referenced this pull request Feb 21, 2022
Document fluent API. Add fluent API for update. Introduce StatementMapper. Migrate Insert to StatementMapper. Refactoring and cleanup. Migrate Select to StatementMapper.

Original pull request: #106.
mp911de pushed a commit that referenced this pull request Feb 21, 2022
Fixed typos, formatting and minor errors in documentation.

Original pull request: #106.
mp911de pushed a commit that referenced this pull request Feb 21, 2022
Incorporated feedback from review. Polished documentation and Javadoc. Minor code improvements restructuring for better readability. Removed unused methods types. Some polishing for compiler warnings.

Original pull request: #106.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants